Rebol和Smalltalk的表达式评估优先级有一些相似之处,两者都非常简单。
根据http://rebol.com/r3/docs/concepts/math-precedence.html中的条款,Rebol的评估顺序为:
和Smalltalk,在Smallbalk-80(蓝皮书)第30页:
Rebol的函数调用类似于Smalltalk的一元表达式,但是与二元运算符相关的优先级相反。在这两种语言之间切换时,我觉得这有点烦人。
我的问题是,为什么Rebol和Smalltalk采取不同的设计选择?我不认为这是任意的。
答案 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所做的事情,但它们可以用于其他目的。请参阅COMPOSE和PARSE以查看包装盒中的几个重要信息。但是和Rebol中的其他值类型一样,你可以用你自己的方言将它们弯曲成你自己的目的。)
所以,实际上它只是归结为将必要的功能转移到不同类型的值上。这样做的一个优点是为替代评估(或数据)模型生成可重用部件。
答案 1 :(得分:4)
对于Smalltalk,答案很简单:没有优先权,因为没有数字和运营商这样的东西。
您所拥有的只是发送给这些对象的对象和消息,例如:
1 + 2
当您看到:使用数学运算符加上(谁计算加法)和数字参数2转换第一个时,Smalltalk只看到:接收接收器对象(1)并使用另一个对象发送消息#+( 2)作为一个论点。
所以,第一次解释看起来很容易,因为你是如何习惯在数学课程中看到它,因为你是一个男孩,但是是一个非常复杂的抽象,而第二个看起来很奇怪你的眼睛,但是非常简单:有对象(如果它们代表数字则无关紧要),这些对象通过发送消息进行自我通信(无论该消息是否用“+”表示)。
编辑:我必须说:“没有数学优先权,因为......”