以下为什么不工作?
(apply and (list #t #t #f))
虽然以下工作正常.
(apply + (list 1 3 2))
这似乎是R5RS和R6RS的情况?
and
不是一个正常的函数,因为它只会根据需要计算少量参数,以了解结果是真还是假.例如,如果第一个参数为false,那么无论其他参数是什么,结果都必须为false,因此它不会评估其他参数.如果and
是正常函数,则首先评估它的所有参数,因此and
创建了一个特殊关键字,这就是为什么它不能作为变量传递的原因.
(define and-l (lambda x (if (null? x) #t (if (car x) (apply and-l (cdr x)) #f))))
请注意,这是lambda variadic!应用示例(and-l #t #t #f)
或者您可以通过申请程序(如所要求的)使用它 (apply and-l (list #t #t #f))
两种选择都可以......