当前位置:  开发笔记 > 前端 > 正文

在Scheme中使用AND和apply函数

如何解决《在Scheme中使用AND和apply函数》经验,为你挑选了2个好方法。

以下为什么不工作?

(apply and (list #t #t #f))

虽然以下工作正常.

(apply + (list 1 3 2))

这似乎是R5RS和R6RS的情况?



1> Jeremy Ruten..:

and不是一个正常的函数,因为它只会根据需要计算少量参数,以了解结果是真还是假.例如,如果第一个参数为false,那么无论其他参数是什么,结果都必须为false,因此它不会评估其他参数.如果and是正常函数,则首先评估它的所有参数,因此and创建了一个特殊关键字,这就是为什么它不能作为变量传递的原因.


这是我对Scheme最大的挫折之一 - 宏应该是一流的.我意识到它可能会阻止一些编译优化,但它肯定会增加语言的表达能力.
凯尔,你可能也在谈论一种名为[_Kernel_]的语言(http://web.cs.wpi.edu/~jshutt/kernel.html).内核旨在解决二类特殊形式的问题,引入其他抽象原语以提供更灵活的评估语义.(正如你所说的那样,编译优化可能是一个问题.)这个问题的例子,`和`,甚至是[klisp实现的主页](http://klisp.org/)上显示的"hello world"示例.

2> 小智..:
(define and-l (lambda x 
    (if (null? x)
        #t
        (if (car x) (apply and-l (cdr x)) #f))))

请注意,这是lambda variadic!应用示例(and-l #t #t #f)

或者您可以通过申请程序(如所要求的)使用它 (apply and-l (list #t #t #f))

两种选择都可以......

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有