我想将[%a/b]
更改为[%a/c]
。
基本上,与Change path or refinement相同,但改为使用file!
:
我想将块内的
a/b
更改为a/c
test: [a/b]
在这种情况下,change next test/1 'c
或test/1/2: 'c
都有效。
但不是test
是file!
:
>> test: [%a/b]
== [%a/b]
>> test/1
== %a/b
>> test/1/2 ; can't access 2nd value
== %a/b/2
>> next first test ; not quite what you expect
== %/b
尝试change
它没有给出你期望的东西:
>> change next test/1 'c
== %b
>> test
== [%acb]
答案 0 :(得分:4)
您会混淆path!
和file!
系列,它们看起来很相似,但它们的性质却截然不同。
path!
是由斜杠符号分隔的值集合(通常为word!
值),file!
是char!
值的集合。 file!
系列中的斜杠字符只是字符,因此file!
不了解任何子结构。它(大部分)具有string!
系列的语义,而path!
具有block!
系列的语义。
现在已经清除了这一点,关于test/1/2
结果,<{1}}系列上的路径符号与file!
上的行为符号不同,它会执行此操作智能连接而不是充当访问者。它被称为 smart ,因为它可以很好地处理左右部分中存在的额外斜杠字符。例如:
string!
相同的路径表示法规则也适用于>> file: %/index.html
== %/index.html
>> path: %www/
== %www/
>> path/file
== %www/file
>> path/:file
== %www/index.html
系列:
url!
因此,要更改>> url: http://red-lang.org
== http://red-lang.org
>> url/index.html
== http://red-lang.org/index.html
>> file: %/index.html
== %/index.html
>> url/:file
== http://red-lang.org/index.html
的嵌套内容,因为test: [%a/b]
基本上表现为file!
,您可以使用任何可用的字符串方法来修改它。例如:
string!
答案 1 :(得分:3)
文件是字符串类型,可以像修改字符串一样进行操作。例如:
test: [%a/b]
replace test/1 %/b %/c
答案 2 :(得分:3)
这是因为文件!是一个任意字符串!,而不是任何数组!
>> any-string? %a/c
== true
>> any-array? 'a/c
== true
所以文件中的目录分隔符'/'!并不意味着行动改变有什么特别之处。所以%a / b中的'a','/'和'b'以相同的方式处理,并且解释器不会尝试将其解析为两段文件路径[a b]。
对于路径!,因为它是一个数组,每个组件都是一个rebol值,而解释器知道这一点。例如,a / bcd中的'bcd'将被视为一个整体(一个单词!),而不是三个字符'b','c'和'd'。
我同意该文件!是一个任何字符串!不方便。
答案 3 :(得分:1)
这可能是一个麻烦的解决方案,但适用于将它们视为文件的目录
test/1: to-file head change skip split-path test/1 1 %c