2017-07-29 10 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)))))))) 

I種類の機能は、自身の多くを作るためのツールを通過していることを、漠然としたアイデアを得るが、私は試してみて、完全にそれを考えると自分自身を混乱に保つ、と私は何かを複製しようとすると、いいね。

誰かがここで何が起こっているのか、なぜそれがとても重要なのか(この本は多くの重要性をもってこれを扱っています)を深く説明できますか?

+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を選択し、次にモーダルで「ラムダを持つ中級生」を選択します。これは標準よりスキン性の低い制限されたスキームですが、あなたのコードは書かれたとおりに動作します。 RUNを押すとステップボタンが表示されます。それを押すと、全体を視覚的に見ることができます。

Image of the stepper, showing the very first step!

これは、ステッパは、最初のステップをやって示しています。

NB:DrRacketの言語「中級生ラムダ」は、本のすべてのコードで機能しない可能性があります。これは、プログラムを設計する方法と、複雑さの異なる複数の言語で構成する本の一部です。 this documentation pageで許可されているフォームを参照してください。 DrRacketは標準をサポートしています.R5RS、R6RS、R7RSが途中で行われています。また、既定では、名前が#lang racketのいたずらな非標準実装があります。このライブラリはたくさんのライブラリを提供しますが、この実装でのみ実行できるようにロックします。

関連する問題