3

「The Seasoned Schemer」の 66 ページに(let ...)は、次の略語であると書かれています。

(let ((x1 a1) ... (xn an)) b ...) = ((lambda (x1 ... xn) b ...) a1 ... an)

たとえば、70ページで使用されています。

(define depth*
  (lambda (l)
    (let ((a (add1 (depth* (car l))))
          (d (depth* (cdr l))))
      (cond
        ((null? l) 1)
        ((atom? (car l)) d)
        (else (cond
                ((> d a) d)
                (else a)))))))

しかし、上記の の定義は、とが評価され、 で表されるラムダに渡されるlambdaことを示唆しています。しかしこれは、空の可能性がある list が に渡され、null チェックインが実行される前に行われることを意味します。(add1 (depth* (car l))(depth* (cdr l))(lambda (x1 ... xn) b ...)lcarcdr(null? l) 1)

4

2 に答える 2

3

あなたはそれを述べて(car l)おり、 if is null を(cdr l)テストする前に実行されるため、 is reallyの場合はエラーが発生します。この本を読み続けてください。次の 2 ページでこれが説明され、正しいバージョンが示されています。llnulldepth*

于 2013-11-12T03:36:23.017 に答える
0

構文キーワードは、次のlet形式を受け入れます ('named-let' は無視してください)。

(define-syntax let
  (syntax-rules ()
    ((let ((identifier expression) ...) body ...)
     ;; ...)))

letが使用された時点で、それぞれexpression ...が評価されます。式は不特定の順序で評価されます。

あなたの場合、式ad関係depth* する式は本体の前に評価されます。したがって、あなたが結論付けたように、いつ呼び出されるl可能性があります。'()carcdr

于 2013-11-12T05:20:53.840 に答える