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)
我在这里有两个问题:
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))
Run Code Online (Sandbox Code Playgroud)
编辑:除了,正如约书亚泰勒指出的那样,lambda
通过一个像foldl
不短路的功能来调用你.这打败了首先打电话的目的and
.
另一件事是,在Racket中foldl
,最后一个参数lambda
是在应用程序链中接收先前结果的那个; 所以实施应该是真的
(foldl (lambda (a b) (and b a)) #t '(#t #f))
Run Code Online (Sandbox Code Playgroud)