2017-07-31 19 views
0

次のコードで、2つのラムダ文で何が起こっているのか誰かが説明できますか?手順内のラムダ

(define (remove x ls) 
(if (null? ls) 
    '() 
    (let ((h (car ls))) 
    ((if (eqv? x h) 
     (lambda (y) y) 
     (lambda (y) (cons h y))) 
    (remove x (cdr ls)))))) 

上記のコードでは 'y' は何ですか?

答えて

1

ifの条件によっては、lambdaのいずれかが返されてすぐに適用されます(ifの左側に二重引用符が表示されます)。最初のlambdaは、再帰呼び出しの結果を返します。再帰呼び出しの結果には、再帰呼び出しの結果が返されます。 yは、lambdaのパラメータ名に過ぎません。(remove x (cdr ls))という値にバインドされています。全体がこれに相当し、実際には、現在のように、あまり複雑な形式ではなく、次のように記述する必要があります。

(define (remove x ls) 
    (if (null? ls) 
     '() 
     (let ((h (car ls))) 
     (if (eqv? x h) ; using `equal?` would be a better idea 
      (remove x (cdr ls)) 
      (cons h (remove x (cdr ls)))))))