Вопрос о lisp лямбда-функциях из примера в Лиспе

Я не совсем понимаю лямбда-функции. Вот пример функции из книги Land of Lisp:

(defun edges->dot (edges)
  (mapc (lambda (node)
          (mapc (lambda (edge)
                  (fresh-line)
                  (princ (dot-name (car node)))
                  (princ "->")
                  (princ (dot-name (car edge)))
                  (princ "[label=\"")
                  (princ (dot-label (cdr edge)))
                  (princ "\"];"))
                (cdr node)))
        edges))

Давайте сейчас посмотрим на внутреннюю часть:

(mapc (lambda (edge)
        (fresh-line)
        (princ (dot-name (car node)))
        (princ "->")
        (princ (dot-name (car edge)))
        (princ "[label=\"")
        (princ (dot-label (cdr edge)))
        (princ "\"];"))
      (cdr node)))

Я понимаю что функция mapc принимает два аргумента, функцию и список. Я также понимаю, что с помощью lambda (node) Я передаю анонимную функцию, которая принимает один аргумент (node) в качестве первого аргумента mapcи что (cdr node) будет использоваться в качестве второго аргумента mapc, По крайней мере, я думаю, что это происходит!

Я не понимаю, где моя анонимная функция получает значение для edge в (lambda (edge), Я был бы признателен, если бы кто-нибудь мог объяснить мне это.

1 ответ

Решение

edge аргумент исходит от предметов в (cdr node), Ваша внутренняя лямбда будет вызываться один раз для каждого элемента в (cdr node),

Попробуйте это например:

(mapc #'princ '(1 2 3 4 5))

Или с буквальным лямбда:

(mapc #'(lambda (x)
          (princ x)
          (terpri))
      '(1 2 3 4 5))
Другие вопросы по тегам