我正在阅读一本名为“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))))))))
我有点模糊的想法,这个函数被传递了一个工具来完成更多的工作,但是当我尝试完全思考它并且当我尝试复制类似的东西时,我一直在困惑自己。 / p>
有人可以更深入地解释这里发生了什么,以及为什么它如此重要(这本书对此有很大意义)?
答案 0 :(得分:1)
我建议您尝试使用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按钮。按它,你可以直观地浏览整个事物。
这表示步进器正在执行第一步。
NB:DrRacket的语言"中级学生与lambda"可能不适用于本书中的所有代码。它是“如何设计程序”一书的一部分,由几种不同复杂程度的语言组成。请参阅this documentation page中允许的表单。 DrRacket支持R5RS,R6RS和R7RS标准,默认情况下它还有一个淘气的非标准实现,名称为#lang racket
,它为您提供了大量的库,但锁定您只能运行这个实现。