Scheme 为什么方案中的`和`运算符不是内置过程
我使用chicken Scheme解释器,当我键入Scheme 为什么方案中的`和`运算符不是内置过程,scheme,lisp,Scheme,Lisp,我使用chicken Scheme解释器,当我键入not时,它返回#,但当我尝试和和或时,它返回错误:未绑定变量:和 似乎和运算符不是内置过程,为什么它与非不同 如果这是真的,(和#t#f)是如何评估的呢?和以及或都是“短路运算符”-它们的评估不会超过形成结果所需的程度,就像如果和条件一样。例如: (and #f (display "foo")) 不会显示任何内容,以下内容也不会显示: (or #t (display "foo")) 对于过程不可能做到这一点,因为对过程的调用将在输入过程之前
not
时,它返回#
,但当我尝试和和或时,它返回错误:未绑定变量:和
似乎和
运算符不是内置过程,为什么它与非
不同
如果这是真的,(和#t#f)
是如何评估的呢?和以及或都是“短路运算符”-它们的评估不会超过形成结果所需的程度,就像如果和条件一样。例如:
(and #f (display "foo"))
不会显示任何内容,以下内容也不会显示:
(or #t (display "foo"))
对于过程不可能做到这一点,因为对过程的调用将在输入过程之前计算所有参数:
(define (proc-or x y) (if x #t (if y #t #f)))
(proc-or #t (display "foo"))
; displays "foo" anyway
像if
(或者实际上是或者)这样的特殊形式可以决定要计算哪些参数。请参阅任何有关条件运算符的方案手册,或更一般的特殊形式(例如…)
更具体地说,或
和和
将是基本形式(如如果
),或者是将运算符转换为一系列基本形式的宏。可能重复使用惰性求值,可以使用过程/函数执行此操作。因此,这不是原语与过程的问题,但SchemeR5RS规范不允许延迟计算。它需要紧急求值(对于大多数过程调用)。@BasileStarynkevitch仅“most”?@knivil除特殊窗体和宏外,标准求值规则(即紧急求值)适用。这就是为什么和和或都是宏。