我正在阅读一本名为“The Little Schemer”的书,其中这段代码以递归方式呈现,无需定义任何函数即可找到列表的长度。
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else ( add1
((mk-length mk-length)
(cdr l))))))))
我有点模糊的想法,即函数被传递了一个工具来让自己变得更多,但是当我尝试充分考虑它时,当我尝试复制类似的东西时,我总是让自己感到困惑。
有人可以更深入地解释一下这里发生了什么,为什么它如此重要(这本书对此非常重要)?
我建议你尝试通过DrRacket逐步解决它
打开时只需粘贴代码,就好像它是一个带有任何列表参数的函数,例如:
(((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else ( add1
((mk-length mk-length)
(cdr l))))))))
'(1 2 3))
在底部的下拉列表中选择选择语言,然后在模式中选择“使用 lambda 的中级学生”。这是一个受限制的方案,具有比标准更少的花哨功能,但您的代码将按编写的方式工作。按 RUN 后,您将看到一个 Step 按钮。按下它,您可以直观地浏览整个过程。
这显示步进器正在执行第一步。
注意:DrRacket 的语言“具有 lambda 的中级学生”可能不适用于本书中的所有代码。它是《如何设计程序》一书的一部分,由具有不同复杂性的多种语言组成。请参阅本文档页面中允许的表格。DrRacket 支持标准 R5RS、R6RS,并且 R7RS 正在开发中,并且默认情况下它还有一个顽皮的非标准实现,其名称#lang racket
为您提供了大量库,但将您锁定为只能在此实现中运行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句