从lisp之地的一个例子质疑lisp Lambda函数

从lisp之地的一个例子质疑lisp Lambda函数,lambda,lisp,land-of-lisp,Lambda,Lisp,Land Of Lisp,我不太理解lambda函数。下面是一个来自Lisp之地的示例函数: (defun edges->dot (edges) (mapc (lambda (node) (mapc (lambda (edge) (fresh-line) (princ (dot-name (car node))) (princ "->") (p

我不太理解lambda函数。下面是一个来自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
的第二个参数。至少我认为这是怎么回事


我不明白的是,我的匿名函数在
(lambda(edge)
)中从何处获取
edge
的值。如果有人能向我解释一下,我将不胜感激。

edge
参数来自
(cdr节点)
中的项。您的内部lambda将为
中的每个元素调用一次(cdr节点)

请尝试以下示例:

(mapc #'princ '(1 2 3 4 5))
或者,使用文字lambda:

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

好的,那么说mapc的第一个参数必须是一个只有一个参数的函数是正确的吗?@MikeJerome:正确的,如果你传入一个列表。一般来说,你的函数接受的参数和传入的列表一样多。酷,我现在明白了。谢谢你的帮助。