2017-07-29 41 views
0

我正在阅读一本名为“The Little Schemer”的书,其中的这段代码以递归方式呈现,以查找列表长度而不定义任何函数。在这个不使用define的递归Sheme函数中发生了什么?

((lambda (mk-length) 
     (mk-length mk-length)) 
    (lambda (mk-length) 
     (lambda (l) 
     (cond 
      ((null? l) 0) 
      (else (add1 
        ((mk-length mk-length) 
        (cdr l)))))))) 

我种得到了模糊的概念,该函数传递一个工具,使更多的本身,而是我一直在迷惑自己,当我尝试和充分思考的,而当我尝试复制的东西喜欢它。

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

+0

继续阅读,稍后解释。如果还不清楚,请查找“Y Combinator”,这就是在这里玩的概念。 –

回答

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)) 

自己看着办吧在底部的下拉列表中选择Choose Language,然后在模式中选择“带lambda的中级学生”。这是一个受限制的方案,它的标准功能比标准要少,但是你的代码将按照书面方式工作。按下RUN键后,您会看到一个Step按钮。按下它,你可以直观地看到整个事物。

Image of the stepper, showing the very first step!

这显示了步进操作的方式的第一步。

注意:DrRacket的语言“lambda中级学生”可能不适用于本书中的所有代码。它是“如何设计程序”一书的一部分,由几种不同复杂度的语言组成。请参阅this documentation page中允许的表格。 DrRacket支持标准R5RS,R6RS和R7RS,并且它也有一个顽皮的非标准实现,名称为#lang racket,它为您提供大量的库,但锁定您只能在此实现中运行。