以下为什么不工作?
(apply and (list #t #t #f))
Run Code Online (Sandbox Code Playgroud)
虽然以下工作正常.
(apply + (list 1 3 2))
Run Code Online (Sandbox Code Playgroud)
这似乎是R5RS和R6RS的情况?
Jer*_*ten 11
and不是一个正常的函数,因为它只会根据需要计算少量参数,以了解结果是真还是假.例如,如果第一个参数为false,那么无论其他参数是什么,结果都必须为false,因此它不会评估其他参数.如果and是正常函数,则首先评估它的所有参数,因此and创建了一个特殊关键字,这就是为什么它不能作为变量传递的原因.
小智 6
(define and-l (lambda x
(if (null? x)
#t
(if (car x) (apply and-l (cdr x)) #f))))
Run Code Online (Sandbox Code Playgroud)
请注意,这是lambda variadic!应用示例(and-l #t #t #f)
或者您可以通过申请程序(如所要求的)使用它 (apply and-l (list #t #t #f))
两种选择都可以......
and实际上是一个宏,其定义在 R5RS 第 4 章中概述。该页面上的符号“库语法”实际上意味着它是作为宏实现的。
(define-syntax and
(syntax-rules ()
((and) #t)
((and test) test)
((and test1 test2 ...)
(if test1 (and test2 ...) #f))))
Run Code Online (Sandbox Code Playgroud)
鉴于此定义,无法and用作 的函数参数apply。