Racket 为什么在球拍外壳中输入(或#t(/10))时没有看到错误?
Racket 为什么在球拍外壳中输入(或#t(/10))时没有看到错误?,racket,evaluation,Racket,Evaluation,(/10)是非法的,但为什么我们没有看到错误 我的讲稿中有一个解释 标识符或不是指函数,而是指 实现短路的语法形式 但我还是不太明白。关键是,或是一种句法形式,正如你在课堂讲稿中提到的那样。这意味着求值规则不同于正常过程,可以在解释器级别实现,或者(更可能)作为派生表达式或宏实现。如果我们试图将或作为一个过程来实现,您的示例确实会失败: (or #t (/ 1 0)) 过程在将所有参数传递给主体之前对其进行评估。相反,或计算其第一个参数,如果它是truthy,则返回第一个参数的值,否则返回计算
(/10)
是非法的,但为什么我们没有看到错误
我的讲稿中有一个解释
标识符或不是指函数,而是指
实现短路的语法形式
但我还是不太明白。关键是,或
是一种句法形式,正如你在课堂讲稿中提到的那样。这意味着求值规则不同于正常过程,可以在解释器级别实现,或者(更可能)作为派生表达式或宏实现。如果我们试图将或
作为一个过程来实现,您的示例确实会失败:
(or #t (/ 1 0))
过程在将所有参数传递给主体之前对其进行评估。相反,或
计算其第一个参数,如果它是truthy,则返回第一个参数的值,否则返回计算第二个参数的结果-但如果第一个参数是truthy,则永远不会计算第二个参数。这被称为布尔连接器的“短路”评估,类似的情况也发生在和
上
为了更好地理解引擎盖下发生的事情,请阅读SICP的第4章,这里是相关的链接解释。引用:“我们语言中的一些特殊形式可以用涉及其他特殊形式的表达来定义,而不是直接实现”。在这种情况下,或
可以使用if
来实现,这反过来也是一种语法形式,在口译员的评估过程中作为特例实现
(define (my-or a b)
(if a a b))
(my-or #t (/ 1 0))
=> /: division by zero