Rebol和Smalltalk中的表达式优先级

时间:2015-08-07 05:14:57

标签: smalltalk rebol

Rebol和Smalltalk的表达式评估优先级有一些相似之处,两者都非常简单。

根据http://rebol.com/r3/docs/concepts/math-precedence.html中的条款,Rebol的评估顺序为:

  • 表达式从左到右进行评估。
  • 运算符优先于函数。

和Smalltalk,在Smallbalk-80(蓝皮书)第30页:

  1. 一元表达式从左向右解析。
  2. 二进制表达式从左向右解析。
  3. 二进制表达式优先于关键字表达式。
  4. 一元表达式优先于二进制表达式。
  5. 带括号的表达式优先于一元表达式。
  6. Rebol的函数调用类似于Smalltalk的一元表达式,但是与二元运算符相关的优先级相反。在这两种语言之间切换时,我觉得这有点烦人。

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

2 个答案:

答案 0 :(得分:4)

列表的大小表明了一个很大的不同,这是Rebol的简单目标。 2条规则小于5,所有事情都相等更好...除非显示具有5个特定优势。

进一步说明:有两个规则可能比理想的更多。然而,允许中缀运营商是一种勉强妥协。人们大多数时候都期望if a > b [...]而不是if greater? a b [...](您可以在Rebol中书写。)

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

Rebol中的“特殊”治疗并不倾向于来自功能的特征。相反,“特殊性”来自价值本身类型的独特分派。因此,例如,在Rebol的优先级列表中根本没有提到括号,因为括号组是具体类型的列表,称为PAREN! (我称之为GROUP!......这是另一个讨论。)

>> foo: [(1 +) ((a) [b c] d) ()]

>> length? foo
== 3

>> paren: second foo
== ((a) [b c] d)

>> length? first paren
== 1

>> pick foo 3
== ()

他们生活在homoiconic代码的结构中。因此,当评估者找到(a b c)时,它会将其视为您编写do [a b c]

这样做的结果是您可以使用括号来模拟优先级的效果,而不需要括号的特殊“优先规则”。在1 + (2 * 3)获得评估之前, + 无法完成其参数的(2 * 3)根本不合适,而且一切都达到了7。

(注意:虽然这是默认评估员对parens所做的事情,但它们可以用于其他目的。请参阅COMPOSEPARSE以查看包装盒中的几个重要信息。但是和Rebol中的其他值类型一样,你可以用你自己的方言将它们弯曲成你自己的目的。)

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

答案 1 :(得分:4)

对于Smalltalk,答案很简单:没有优先权,因为没有数字和运营商这样的东西。

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

1 + 2

当您看到:使用数学运算符加上(谁计算加法)和数字参数2转换第一个时,Smalltalk只看到:接收接收器对象(1)并使用另一个对象发送消息#+( 2)作为一个论点。

所以,第一次解释看起来很容易,因为你是如何习惯在数学课程中看到它,因为你是一个男孩,但是是一个非常复杂的抽象,而第二个看起来很奇怪你的眼睛,但是非常简单:有对象(如果它们代表数字则无关紧要),这些对象通过发送消息进行自我通信(无论该消息是否用“+”表示)。

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