1

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 将括号转换为相同代码的块:

[a b]
not equal to original (a b)

如果您的输入是data: [a/b]

[a b]
not equal to original a/b

为什么会这样?如果您使用的是 Rebol 2,有没有办法获得 Rebol 3 的行为?

4

1 回答 1

2

这是 Carl 在 R2 中发现的“奇怪”的属性。因此,他在 R3 中将其替换为更可预期的行为。奇怪的是,您通过这种方式获得的块与paren 相同!(只是尝试更改内容),但声明它具有不同的类型。但是,如果您需要参考 R2 中的括号,您的代码可以轻松调整:

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]
    ]
)]
于 2013-01-25T18:40:15.997 回答