gpt4 book ai didi

function - 如何在 Racket 中将 `and` 作为函数传递?

转载 作者:太空宇宙 更新时间:2023-11-03 18:37:58 24 4
gpt4 key购买 nike

对于下面的代码:

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

Racket 返回:

and: bad syntax in: and

我知道 and 不是函数。我可以使用 lambda 来避免这个问题:

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

我有两个问题:

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

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

谢谢。

最佳答案

这是一个conditional syntactic form ,或者它可能被实现为一个宏,扩展到一些 core syntax form ,编译器/解释器将其视为特例。

The list there in Racket's docs包含 if 作为特殊形式但不包含 and,因此后者很可能是根据前者实现的。但是R5RS does list and as a syntactic keyword .所以,我们可以说,它要么是一种特殊语法,要么是一个宏。

很容易将任何 and 形式的 (and a b c ...) 重写为 if 形式,(如果 a(如果 b(如果 c#t #f)#f)#f)

lambda 对我来说很好,但你也可以使用 every from SRFI-1 (或 Racket's andmap ):

(every identity '(#t #f))

should return #f .

编辑:除了 as Joshua Taylor points out ,通过像 foldl 这样的函数调用你的 lambda 不会短路。这违背了首先调用 的目的。

另一件事是,在Racket's foldl lambdalast 参数是接收应用程序链中先前结果的参数;所以实现应该是

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

关于function - 如何在 Racket 中将 `and` 作为函数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17919327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com