为什么在Racket Shell中输入(或#t(/ 1 0))时看不到错误?

时间:2018-09-27 00:39:47

标签: racket evaluation

(or #t (/ 1 0))

(/ 1 0)出现问题,但是为什么我们看不到错误?

我的讲义中有一个解释。

  

标识符or不是指函数,而是指   实现短路的语法形式。

但是我还是不太明白。

1 个答案:

答案 0 :(得分:1)

关键点是or语法形式,如您的讲义中所述。这意味着评估规则与正常过程不同,并且可以在解释器级别或(更可能地)作为派生表达式或宏来实现。如果我们尝试将or实现为一个过程,那么您的示例确实会失败:

(define (my-or a b)
  (if a a b))

(my-or #t (/ 1 0))
=> /: division by zero

过程会在将所有参数传递给主体之前先评估其所有参数。相比之下,or会计算其第一个参数,如果是事实,它将返回第一个参数的值,否则将返回对第二个参数进行求值的结果-但它将从不评估第二个论点,如果第一个是真实的。这称为布尔连接器的“短路”评估,and也会发生类似的情况。

要更好地了解幕后情况,请阅读SICP的第4章,这是解释derived expressions的相关链接。引用:“可以用涉及其他特殊形式的表达方式来定义我们语言中的某些特殊形式,而不是直接实现”。在这种情况下,or可以使用if来实现,而composer network start也是一种语法形式,在口译员评估程序中作为特殊情况实现。