rebol - 是否可以覆盖 rebol 路径运算符?

标签 rebol

可以覆盖 rebol 系统单词,如 print、make 等,那么是否可以对路径运算符执行相同的操作?那么语法是什么?

最佳答案

另一种可能的方法是使用 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
}

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

do load code

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

关于rebol - 是否可以覆盖 rebol 路径运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1657739/

相关文章:

filenames - 在 Rebol 3 GUI 中请求文件的正确方法(Saphir 版本)

dll - 从 rebol 调用时从 dll 函数返回的指针

rebol - 捕获所有 Rebol VID 错误的有趣方法

rebol - 添加到解析方言内部的映射

constructor - 为什么Rebol中的 'context'和 'object'函数不同,但本质上是相同的?

rebol - 如何使用其字符串名称调用对象函数

Rebol 3 功能已修改?和存在?不适用于 URL 类型

rebol - 聊天应用程序如何实时读取文件?

gmail - 在 REBOL 2 中通过 GMail SMTP 发送电子邮件

unicode - 解码 UTF16 二进制文件最有效的方法是什么?