6

对于以下代码:

(foldl and #t '(#t #f))

球拍回报:

and: bad syntax in: and

我知道and不是一个函数。我可以使用以下方法规避这个问题lambda

(foldl (lambda (a b) (and a b)) #t '(#t #f))

我在这里有两个问题:

  1. and不是函数。那这是什么?是宏吗?

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

谢谢你。

4

1 回答 1

8

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

Racket 文档中的列表包括if作为一种特殊形式但不包括and,因此后者很可能是根据前者实现的。但R5RS 确实将and其列为句法关键字。所以,最好的说法是,它要么是一种特殊的语法,要么是一个宏。

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

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

(every identity '(#t #f))

应该返回#f

编辑:除了,正如 Joshua Taylor 指出的那样lambda,通过函数调用你foldl不会短路。这首先破坏了调用的目的and

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

(foldl (lambda (a b) (and b a)) #t '(#t #f))
于 2013-07-29T08:47:51.247 回答