Function 如何将`和`作为球拍中的一个函数传递?

Function 如何将`和`作为球拍中的一个函数传递?,function,macros,lisp,scheme,racket,Function,Macros,Lisp,Scheme,Racket,对于以下代码: (foldl and #t '(#t #f)) 球拍回击: and: bad syntax in: and 我知道,不是一个函数。我可以使用lambda绕过这个问题: (foldl (lambda (a b) (and a b)) #t '(#t #f)) 我这里有两个问题: 和不是一个函数。那是什么?它是宏吗 我使用lambda的解决方案看起来很难看。有没有更好的办法来解决这个问题 谢谢。它是一个宏,或者可以实现为一个扩展到某些宏的宏,编译器/解释器将其视为特例 将if作

对于以下代码:

(foldl and #t '(#t #f))
球拍回击:

and: bad syntax in: and
我知道
不是一个函数。我可以使用
lambda
绕过这个问题:

(foldl (lambda (a b) (and a b)) #t '(#t #f))
我这里有两个问题:

  • 不是一个函数。那是什么?它是宏吗

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

  • 谢谢。

    它是一个宏,或者可以实现为一个扩展到某些宏的宏,编译器/解释器将其视为特例

    if
    作为特殊形式包括在内,但不包括
    ,因此后者很可能是根据前者实现的。但是所以,我们可以说,它要么是一个特殊的语法,要么是一个宏

    将任何
    表单
    (以及a b c…
    作为
    如果
    表单,
    (如果a(如果b(如果c#t#f)#f)
    )重新编写都很容易

    lambda
    对我来说很好,但您也可以使用(或):

    编辑:除此之外,通过像
    foldl
    这样的函数调用您的
    lambda
    不会短路。这违背了最初调用
    的目的

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

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

    你可以用srfi-26(cut)@jozefg来修饰它,你是说
    (foldl(cut-and)#t'(#t#f))
    ?但是也说
    (0 1时剪切)
    是非法的,因为
    if
    不是“R5R意义上的表达式”-这似乎使得
    在那里也是非法的。@WillNess用racket 5.3测试对我来说很好。无论这是否是特定于实现的,我不确定您是否会对另一个类似的问题感兴趣(可能是重复的),该问题探讨了获取
    类函数的一些可能方法,这两种函数都是非短路的(如您在问题中提供的)和短路。@Sylvester我知道什么是未定义的行为,我承认有可能是UB,这只是一个观察。你完全正确,我只是不知道这是ub,并根据它进行了观察。
    
    (foldl (lambda (a b) (and b a)) #t '(#t #f))