2

可以覆盖 rebol 系统单词,如 print、make 等,那么路径运算符是否可以这样做?那么语法是什么?

4

2 回答 2

3

你的意思是替换(说)....

print mold system/options

与(说)......

print mold system..options

....我用点点语法替换了 REBOL 的正斜杠?

简短的回答:没有。有些东西是硬连线到解析器中的。

于 2009-11-03T16:30:33.480 回答
3

另一种可能的方法是使用 REBOL 元编程功能并预处理您自己的代码以捕获路径访问并添加您的处理程序代码。这是一个例子:

apply-my-rule: func [spec [block!] /local value][
    print [
        "-- path access --" newline
        "object:" mold spec/1 newline
        "member:" mold spec/2 newline
        "value:" mold set/any 'value get in get spec/1 spec/2 newline
        "--"
    ]
    :value
]

my-do: func [code [block!] /local rule pos][
    parse code rule: [
        any [
            pos: path! (
                pos: either object? get pos/1/1 [
                    change/part pos reduce ['apply-my-rule to-block pos/1] 1
                ][
                    next pos
                ]
            ) :pos
            | into rule    ;-- dive into nested blocks
            | skip         ;-- skip every other values
        ]
    ]
    do code
]

;-- example usage -- 

obj: make object! [
    a: 5
]

my-do [
    print mold obj/a
]

这会给你:

-- path access --
object: obj
member: a
value: 5
--
5

另一种(较慢但更灵活)的方法也可能是以字符串模式将您的代码传递给预处理器,从而让您摆脱任何 REBOL 特定的语法规则,例如:

my-alternative-do {
    print mold obj..a
}

然后预处理器代码将发现所有 .. 位置并更改代码以正确插入对“应用我的规则”的调用,并最终使用以下命令运行代码:

do load code

对于在运行时可以处理和更改整个代码的程度没有真正的限制(第一个示例中所谓的“块模式”是最有效的方式)。

于 2010-04-14T21:23:53.227 回答