是否可以在Rebol中定义新的中缀运算符

时间:2014-04-02 17:37:57

标签: rebol infix-operator

我希望这样:

>> op : infix-func [self x] [ 2 * x + self ]
>> 3 op 2
== 7

有可能吗?

2 个答案:

答案 0 :(得分:3)

目前不可能,不。您可以将现有运算符分配给Rebol 3中的新单词,并且该新单词将是中缀运算符,但您无法使用Rebol代码创建新运算符。

如果它确实有效,那么它目前可能看起来像make op! [[self x] [2 * x + self]]

部分我认为这只是一个没有人接触它的问题。但现在是open source所以也许可以认真对待具体的实施建议。

唯一需要注意的是,核心Rebol评估者可以从避免中缀中获得很多好处。那些少数的本地中缀运算符被添加为一种绥靖政策,以帮助你可能做的基本事情比较平等看起来“正常”。这是一个平衡攻击,并询问你是否正在寻找新的中缀运营商,如果你真正想要的是一个方言,以免Rebol的“句子”变得难以理解......

答案 1 :(得分:1)

您无法定义新的中缀运算符,但您有2个选项:

  1. 重新定义现有的中缀操作符,例如' +或' =(强烈不可取)

  2. 创建一些方言的方言并将所需的代码包装在其中 举个例子......

  3.   

    语法: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)可能会使用解析来提供更接近语法的东西