在Scheme中使用AND和apply函数

btw*_*tw0 13 scheme

以下为什么不工作?

(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创建了一个特殊关键字,这就是为什么它不能作为变量传递的原因.

  • 这是我对Scheme最大的挫折之一 - 宏应该是一流的.我意识到它可能会阻止一些编译优化,但它肯定会增加语言的表达能力. (6认同)
  • 凯尔,你可能也在谈论一种名为[_Kernel_]的语言(http://web.cs.wpi.edu/~jshutt/kernel.html).内核旨在解决二类特殊形式的问题,引入其他抽象原语以提供更灵活的评估语义.(正如你所说的那样,编译优化可能是一个问题.)这个问题的例子,`和`,甚至是[klisp实现的主页](http://klisp.org/)上显示的"hello world"示例. (2认同)

小智 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))

两种选择都可以......


Gre*_*ill 5

and实际上是一个宏,其定义在 R5RS 第 4 章中概述。该页面上的符号“库语法”实际上意味着它是作为宏实现的。

7.3,派生表达式类型给出了and宏的可能定义:

(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