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