Лямбда в процедуре

Может кто-нибудь объяснить мне, что происходит с двумя лямбда-операторами в следующем коде?

(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 возвращает результат вызова рекурсии, второй lambdaconsЭлемент результата вызова рекурсии, в любом случае вызывается рекурсия. y это просто имя параметра для lambdas, который привязывается к значению (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)))))))
Другие вопросы по тегам