2017-07-31 23 views
0

有人可以解釋我下面的代碼中的兩個lambda語句發生了什麼?程序中的lambda

(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)))))))