如何在Racket中传递`和`作为函数?

Ben*_*Ben 5 lisp macros scheme function racket

对于以下代码:

(foldl and #t '(#t #f))
Run Code Online (Sandbox Code Playgroud)

球拍回归:

and: bad syntax in: and
Run Code Online (Sandbox Code Playgroud)

我知道and这不是一个功能.我可以使用以下方法解决这个问题lambda:

(foldl (lambda (a b) (and a b)) #t '(#t #f))
Run Code Online (Sandbox Code Playgroud)

我在这里有两个问题:

  1. and不是一个功能.那这是什么?这是一个宏吗?

  2. 我使用的解决方案lambda似乎很难看.有没有更好的方法来解决这个问题?

谢谢.

Wil*_*ess 7

它是一种条件 语法形式,或者它可以实现为扩展为某种核心语法形式的宏,编译器/解释器将其视为一种特殊情况.

Racket文档中的列表包含if一个特殊形式,但不包括在内and,所以后者最有可能以前者的形式实现.但是R5RS确实and列为语法关键字.所以,我们可以说,它可以是特殊语法,也可以是宏.

很容易将任何and表格重写(and a b c ...)if表格(if a (if b (if c #t #f) #f) #f).

lambda我很好,但您也可以使用everySRFI-1(或Racket'sandmap):

(every identity '(#t #f))
Run Code Online (Sandbox Code Playgroud)

应该回来#f.

编辑:除了,正如约书亚泰勒指出的那样,lambda通过一个像foldl不短路的功能调用你.这打败了首先打电话的目的and.

另一件事是,在Racket中foldl,最后一个参数lambda是在应用程序链中接收先前结果的那个; 所以实施应该是真的

(foldl (lambda (a b) (and b a)) #t '(#t #f))
Run Code Online (Sandbox Code Playgroud)