在这个不使用define的递归Sheme函数中发生了什么?

时间:2017-07-29 02:58:05

标签: recursion functional-programming scheme

我正在阅读一本名为“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>

有人可以更深入地解释这里发生了什么,以及为什么它如此重要(这本书对此有很大意义)?

1 个答案:

答案 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按钮。按它,你可以直观地浏览整个事物。

Image of the stepper, showing the very first step!

这表示步进器正在执行第一步。

NB:DrRacket的语言"中级学生与lambda"可能不适用于本书中的所有代码。它是“如何设计程序”一书的一部分,由几种不同复杂程度的语言组成。请参阅this documentation page中允许的表单。 DrRacket支持R5RS,R6RS和R7RS标准,默认情况下它还有一个淘气的非标准实现,名称为#lang racket,它为您提供了大量的库,但锁定您只能运行这个实现。