【问题标题】:INTO behavior difference in Rebol 2 parsing vs Rebol 3Rebol 2 与 Rebol 3 解析中的 INTO 行为差异
【发布时间】:2013-01-25 16:23:04
【问题描述】:

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 的行为?

【问题讨论】:

    标签: parsing rebol


    【解决方案1】:

    这是 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]
        ]
    )]
    

    【讨论】:

    • 啊,有趣-我没有测试过它们实际上是相同信息的“别名”实例,但没有比较相等。 (我只看到在 R2 中使用 AS-BINARY 和 AS-STRING 的其他地方发生了这种情况。)
    • 是的,as-binaryas-stringdisarm 也表现出这种行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多