我希望是这样的:
>> op : infix-func [self x] [ 2 * x + self ]
>> 3 op 2
== 7
有可能的?
目前不可能,不。您可以在 Rebol 3 中将现有运算符分配给新单词,并且该新单词将是中缀运算符,但您不能从 Rebol 代码中创建新运算符。
如果它确实有效,它目前可能看起来像make op! [[self x] [2 * x + self]]
在某种程度上,我认为这实际上只是没有人解决它的问题。但它现在是开源的,所以也许可以认真对待具体的实施建议。
需要注意的是,核心 Rebol 评估器从避免中缀中获得了很多好处。添加了这些少数原生中缀运算符作为绥靖,以帮助您可能做的真正基本的事情,例如比较相等性看起来“正常”。这是一种平衡,如果你真正想要的是一种方言,询问你是否正在寻找新的中缀运算符,以免 Rebol 的“句子”变得更难理解......
您不能定义新的中缀运算符,但您有 2 个选项:
重新定义现有的中缀运算符,如 '+ 或 '=(强烈不建议)
创建某种方言并将所需的代码包装在其中作为示例...
语法:func [块[块!] 选项 [ 阻止!] ] [
foreach op 选择选项到单词“operators”[
if find block op [ segment1: copy/part back find block op 2 segment2: reverse copy segment1 replace/all block segment1 segment2 ]
]
做块
]
加:func [ab] [
返回:a + b
]
减:函数 [ ab ] [
返回:a - b
]
|: 函数 [ ab ] [ 打印 b ]
句法 [
打印 1 加 2
打印 5 减 7
1 | “完毕”
] [
运算符 [ 加减 | ]
]
将执行并将以下内容打印到控制台。
3
-2
完毕
使用类似的东西定义新的三级运算符甚至新的流控制结构将很容易。在这个示例中,我只是沿着包含我的代码的系列导航并交换顺序(即使“1 加 2”有效地“加 1 2”)。正确的方言 (DSL) 可能会使用 parse 来提供更接近语法的东西