2

私はsicpの第5章を読んでいて、コードの一部、つまり5.2で提示されたアセンブラーに固執しています。これはどのように見えるかです:

(define (extract-labels text receive)
    (if (null? text) 
        (receive '() '())
        (extract-labels (cdr text)
        (lambda (insts labels)
            (let ((next-inst (car text)))
                (if (symbol? next-inst)
                    (receive insts
                             (cons (make-label-entry next-inst insts)
                                   labels))
                     (receive (cons (make-instruction next-inst) insts)
                              lables)))))))

ラムダは、テキストがnullの場合にのみ呼び出されますか?では、どうすれば「テキスト」の車を求めることができるでしょうか。

編集

答えてくれてありがとう、でもまだ見えない。テキストがnullでない場合、extract-lablesは、テキストがnullになるまで、それ自体を再帰的に呼び出しませんか?その場合、どのようにそれの車を呼ぶことができますか?

4

2 に答える 2

1

ラムダは適切なスコープを取得します。ラムダが定義された時点でtextはnullではないため、呼び出しは正常にcar text機能します。

于 2012-09-17T03:30:08.463 に答える
0

if最大3つの引数を取ります:条件、if-true(then)式、およびif-false(else)式。インデントはすべて奇妙なので、間違っているように見えます。

次のように表示されます

(define (extract-labels text receive)
    (if (null? text) 
        (receive '() '())
        (extract-labels (cdr text)
            (lambda (insts labels)
                (let ((next-inst (car text)))
                    (if (symbol? next-inst)
                        (receive insts
                                 (cons (make-label-entry next-inst insts)
                                       labels))
                        (receive (cons (make-instruction next-inst) insts)
                                  labels)))))))

式の結果がnullの(receive '() '())場合、それ以外の場合であることに注意してください。text(extract-labels ...)

于 2012-09-17T03:30:40.403 に答える