Rebol的INTO允许解析器下降到一个序列类型(例如BLOCK!或PAREN!),以将匹配规则应用于块的内容。这是Rebol 3中的一个简单示例:
data: [(a b)]
parse data [into [pos: 'a 'b (
probe pos
either pos = (first data) [
print rejoin ["equal to original " mold first data]
] [
print rejoin ["not equal to original " mold first data]
]
)]]
由于块中唯一的内容是带括号的系列,因此INTO规则会立即匹配。使用SET-WORD !,解析器被告知在pos
中进入括号后捕获位置。 A和B匹配为文字LIT-WORD!s,然后执行随后的代码。预期结果发生:
(a b)
equal to original (a b)
那很好。但奇怪的是,Rebol 2将parens转换为相同代码的块:
[a b]
not equal to original (a b)
如果输入为data: [a/b]
,则会发生相同的块转换:
[a b]
not equal to original a/b
为什么会这样?如果您使用的是Rebol 2,有没有办法获得Rebol 3的行为?
答案 0 :(得分:2)
这是卡尔发现的一个奇怪的地方"在R2。因此,他在R3中用更可期待的行为取而代之。奇怪的是,你获得这种方式的块与paren相同! (只是尝试更改内容),但声明它有不同的类型。但是,如果您需要参考R2中的paren,您的代码可以轻松调整:
data: [(a b)]
parse data [pos: into ['a 'b (
pos: first pos
probe pos
either pos = (first data) [
print rejoin ["equal to original " mold first data]
] [
print rejoin ["not equal to original " mold first data]
]
)]]
另一种可以提供所需结果的修改:
data: [(a b)]
parse data [set pos into ['a 'b] (
probe pos
either pos = (first data) [
print rejoin ["equal to original " mold first data]
] [
print rejoin ["not equal to original " mold first data]
]
)]