Rebol和Smalltalk中的表达式优先级

Rebol和Smalltalk中的表达式优先级,smalltalk,rebol,Smalltalk,Rebol,Rebol和Smalltalk的表达式评估先例有一些相似之处,它们都非常简单 根据中的条款,Rebol的评估顺序为: 表达式从左到右求值 运算符优先于函数 和Smalltalk,在Smallbalk-80(蓝皮书)第30页: 一元表达式从左到右解析 二进制表达式从左到右解析 二进制表达式优先于关键字表达式 一元表达式优先于二元表达式 括号表达式优先于一元表达式 Rebol的函数调用类似于Smalltalk的一元表达式,但与二进制运算符相关的先例却被颠倒了。在这两种语言之间切换时,我觉得这有点

Rebol和Smalltalk的表达式评估先例有一些相似之处,它们都非常简单

根据中的条款,Rebol的评估顺序为:

  • 表达式从左到右求值
  • 运算符优先于函数
和Smalltalk,在Smallbalk-80(蓝皮书)第30页:

  • 一元表达式从左到右解析
  • 二进制表达式从左到右解析
  • 二进制表达式优先于关键字表达式
  • 一元表达式优先于二元表达式
  • 括号表达式优先于一元表达式
  • Rebol的函数调用类似于Smalltalk的一元表达式,但与二进制运算符相关的先例却被颠倒了。在这两种语言之间切换时,我觉得这有点烦人


    我的问题是,为什么Rebol和Smalltalk采用不同的设计选择?我不认为这是任意的。

    列表的大小表明了一个很大的区别,那就是Rebol的简单性目标。2条规则比5条规则小,如果所有条件都相同,那就更好了……除非有5条规则的特殊优势

    进一步说:有两条规则可能比理想的要多。然而,允许中缀操作符是一种勉强的妥协。如果a>b[…],人们期望
    ,如果a>b[…],人们期望
    ,如果a>b[…],人们期望
    ?a b[…]
    大多数时候。(您可以在Rebol中写入任何一种。)

    鉴于Rebol和Smalltalk是完全不同的语言,所以很难回答“为什么”这个问题。但在“什么”方面,一个相关的问题是“复杂性到哪里去了?”例如,Rebol需要分组优先;那么,如果这不是由评估规则管理的,它在哪里

    Rebol中的“特殊”处理并不倾向于来自函数的算术等特性。相反,“特殊性”来自于值类型本身的独特分派。例如,Rebol的优先列表中根本没有提到括号,因为括号组是一种具体的列表类型,称为PAREN!(我称他们为团体!…这是另一个讨论。)

    它们存在于代码的结构中。因此,当计算器开始查找
    (abc)
    时,它会将其视为您编写了
    do[abc]

    这样做的结果是,您可以使用括号来模拟优先级的效果,而不需要为括号指定特殊的“优先级规则”。对于
    1+(2*3)
    +只有在
    (2*3)
    得到求值后才能实现其参数,并且所有结果都是7

    (注意:虽然这是默认计算器对参数所做的操作,但它们可以用于其他目的。请参阅和,以了解方框中的几个重要值类型。但与Rebol中的其他值类型一样,您可以使用自己的方言将它们转换为自己的目的。)


    因此,实际上,它只是将必要的功能稍微转移到不同类型的值上。这样做的一个优点是为替代评估(或数据)模型生成可重用的部件。

    对于Smalltalk,答案很简单:没有优先级,因为没有数字和运算符之类的东西。

    您所拥有的只是发送到这些对象的对象和消息,例如:

    1 + 2
    
    当您可能看到:使用数学运算符plus(计算加法的人)和数字参数2转换数字1时,Smalltalk只需看到:使用接收方对象(1)和另一个对象(2)作为参数发送消息#+

    所以,第一种解释看起来很简单,因为这是你在数学课上的习惯,因为你是个男孩,但这是一种非常复杂的抽象,而第二种解释在你看来很奇怪,但非常简单:有一些对象(不管它们代表数字是什么),这些对象通过发送消息来进行通信(无论该消息是否用“+”表示)


    编辑:我必须说:“数学上没有优先权,因为……”

    这是错误的。Smalltalk确实有优先规则,事实上,问题中列出了Smalltalk的优先规则。这个答案只适用于算术表达式。对于一般Smalltalk表达式,有一些优先规则在问题中如@JörgWMittag所述。在任何情况下,这些优先规则都是为了保持receiver+信息隐喻,这是我解释的核心,解释为什么没有数学优先:因为没有数字,只有对象。
    1 + 2