对于以下代码:
(foldl and #t '(#t #f))
球拍回报:
and: bad syntax in: and
我知道and
不是一个函数。我可以使用以下方法规避这个问题lambda
:
(foldl (lambda (a b) (and a b)) #t '(#t #f))
我在这里有两个问题:
and
不是函数。那这是什么?是宏吗?我使用的解决方案
lambda
看起来很难看。有没有更好的方法来解决这个问题?
谢谢你。
它是一种条件 句法形式,或者它可以实现为扩展为某种核心句法形式的宏,编译器/解释器将其视为特殊情况。
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))
编辑:除了,正如 Joshua Taylor 指出的那样lambda
,通过函数调用你foldl
不会短路。这首先破坏了调用的目的and
。
另一件事是,在Racketfoldl
中,最后一个参数lambda
是在应用程序链中接收前一个结果的参数;所以实现真的应该是
(foldl (lambda (a b) (and b a)) #t '(#t #f))