【问题标题】:Is it possible to define new infix operator in Rebol是否可以在 Rebol 中定义新的中缀运算符
【发布时间】:2014-04-02 17:37:56
【问题描述】:

我希望是这样的:

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

有可能吗?

【问题讨论】:

    标签: rebol infix-operator


    【解决方案1】:

    目前不可能,不。你可以在 Rebol 3 中为一个新词分配一个现有的运算符,这个新词将是一个中缀运算符,但你不能从 Rebol 代码中创建新的运算符。

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

    在某种程度上,我认为这实际上只是没有人解决它的问题。但现在是open source,所以也许可以认真对待具体的实施建议。

    需要注意的是,核心 Rebol 评估器从避免中缀中获得了很多好处。添加了这些少数原生中缀运算符作为绥靖,以帮助您可能做的真正基本的事情,例如比较相等性看起来“正常”。这是一种平衡,如果你真正想要的是一种方言,询问你是否正在寻找新的中缀运算符,以免 Rebol 的“句子”变得更难理解...... p>

    【讨论】:

      【解决方案2】:

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

      1. 重新定义现有的中缀运算符,例如 '+ 或 '=(强烈不建议)

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

      语法:func [块[块! ] 选项 [ 阻止!] ] [

      foreach op select options to-word "operators" [

        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) 可能会使用 parse 来提供更接近语法的内容

      【讨论】:

        猜你喜欢
        • 2013-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-04
        • 1970-01-01
        • 1970-01-01
        • 2017-09-10
        相关资源
        最近更新 更多