我不太了解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)
的值。如果有人可以向我解释一下,我将不胜感激。
答案 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))