关于lisp Lambda函数的问题来自Land of Lisp中的一个例子

时间:2011-09-15 23:51:34

标签: lambda lisp land-of-lisp

我不太了解lambda函数。以下是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 个答案:

答案 0 :(得分:2)

edge参数来自(cdr node)中的项目。对于(cdr node)中的每个元素,将为您的内部lambda调用一次。

试试这个例子:

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

或者,用文字lambda:

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