2

The Little Schemerlength≤1という本の166 ページを 1 日かけて読みました。次のコードがあります。

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

lは次(apples)eternityとおりです。

(define eternity 
  (lambda (x)
    (eternity x)))

166ページ(第4版)には、次のように記載されています。

mk-length一度応募するともらえるlength≤1

その後

これを複数回行うことはできますか?

しかし、取得するためにこれを行う方法がわかりませんかlength≤2

4

1 に答える 1

3

であるとするl(apples oranges)、次のように評価されます(関数自体mk-lengthにバインドされていることに注意してください。(lambda (mk-length) ...)

(cond ((null? l) 0) 
      (else (add1 ((mk-length eternity) (cdr l)))))
==>
(add1 ((mk-length eternity) '(oranges)))
==>
(add1 ((lambda (l) (cond ((null? l) 0
                          (else (add1 ((eternity eternity) (cdr l))))))))
==>
(add1 (add1 ((eternity eternity) '())))

したがって、ここでは、2つの手順を実行すると、eternity最終的に適用されますが、必要なのは、を呼び出すことmk-lengthです。したがって、元の関数で、に置き換えるeternitymk-length、私が書いた最後のステップに、の(mk-length mk-length)代わりにが含まれ(eternity eternity)、計算を続行できるようになります。

于 2012-09-25T22:59:08.370 に答える