Вопрос о lisp лямбда-функциях из примера в Лиспе - PullRequest
1 голос
/ 16 сентября 2011

Я не совсем понимаю лямбда-функции. Вот пример функции из книги 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 Ответ

2 голосов
/ 16 сентября 2011

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

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

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

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

(mapc #'(lambda (x)
          (princ x)
          (terpri))
      '(1 2 3 4 5))
...