我使用鸡计划解释器,当我输入not
时,它会返回#<procedure (not x295)>
,但当我尝试and
和or
时,它会返回Error: unbound variable: and
似乎and
运算符不是内置程序,为什么它与not
不同?
如果确实如此,(and #t #f)
如何评估?
答案 0 :(得分:6)
and
和or
是&#34;短路运营商&#34; - 他们对评估结果的评估不会超过if
和cond
。例如:
(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
(或实际上,or
)这样的特殊表单可以决定它希望评估哪些参数。请参阅有关条件运算符的任何Scheme手册,或更常见的特殊表单(例如MIT Scheme,Racket ...)
更具体地说,or
和and
将是原始形式(如if
),或将运算符转换为原始形式序列的宏。