更改文件路径

时间:2017-05-18 15:23:37

标签: rebol red

我想将[%a/b]更改为[%a/c]。 基本上,与Change path or refinement相同,但改为使用file!

  

我想将块内的a/b更改为a/c

test: [a/b]

在这种情况下,change next test/1 'ctest/1/2: 'c都有效。 但不是testfile!

>> 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]

4 个答案:

答案 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