Вопрос о 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))