我希望这样:
>> op : infix-func [self x] [ 2 * x + self ]
>> 3 op 2
== 7
有可能吗?
答案 0 :(得分:3)
目前不可能,不。您可以将现有运算符分配给Rebol 3中的新单词,并且该新单词将是中缀运算符,但您无法使用Rebol代码创建新运算符。
如果它确实有效,那么它目前可能看起来像make op! [[self x] [2 * x + self]]
部分我认为这只是一个没有人接触它的问题。但现在是open source所以也许可以认真对待具体的实施建议。
唯一需要注意的是,核心Rebol评估者可以从避免中缀中获得很多好处。那些少数的本地中缀运算符被添加为一种绥靖政策,以帮助你可能做的基本事情比较平等看起来“正常”。这是一个平衡攻击,并询问你是否正在寻找新的中缀运营商,如果你真正想要的是一个方言,以免Rebol的“句子”变得难以理解......
答案 1 :(得分:1)
您无法定义新的中缀运算符,但您有2个选项:
重新定义现有的中缀操作符,例如' +或' =(强烈不可取)
创建一些方言的方言并将所需的代码包装在其中 举个例子......
语法:func [block [block! ] options [block!]] [
foreach op选择选项to-word"运算符" [
if find block op [ segment1: copy/part back find block op 2 segment2: reverse copy segment1 replace/all block segment1 segment2 ]
阻止
加:func [a b] [
返回:a + b
减:func [a b] [
返回:a - b
|:func [a b] [print b]
语法[
打印1加2
打印5减7
1 | "完成"
] [
运算符[加减号| ]
将执行并将以下内容打印到控制台。
3
-2
完成
使用类似的东西很容易定义新的第三级操作符甚至新的流控制结构。 在这个示例中,我只是浏览具有我的代码并交换顺序的系列(即制作" 1加2"有效"加1 2")。正确的方言(DSL)可能会使用解析来提供更接近语法的东西