1

我不太了解 lambda 函数。这是 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。至少我认为这是怎么回事!

我不明白的是我的匿名函数在哪里获得edgein的值(lambda (edge)。如果有人可以向我解释这一点,我将不胜感激。

4

1 回答 1

2

edge论点来自 中的项目(cdr node)。您的内部 lambda 将为(cdr node).

试试这个例如:

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

或者,使用文字 lambda:

(mapc #'(lambda (x)
          (princ x)
          (terpri))
      '(1 2 3 4 5))
于 2011-09-16T00:02:56.487 回答