Лямбда в процедуре
Может кто-нибудь объяснить мне, что происходит с двумя лямбда-операторами в следующем коде?
(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))))))
Что такое "у" в приведенном выше коде?
1 ответ
Решение
В зависимости от if
условие, мы возвращаем один или другой lambda
а затем сразу же применить его (обратите внимание на двойные открывающие скобки слева от if
). Первый lambda
возвращает результат вызова рекурсии, второй lambda
cons
Элемент результата вызова рекурсии, в любом случае вызывается рекурсия. y
это просто имя параметра для lambda
s, который привязывается к значению (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)))))))