从lisp之地的一个例子质疑lisp Lambda函数
我不太理解lambda函数。下面是一个来自Lisp之地的示例函数:从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
(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:正确的,如果你传入一个列表。一般来说,你的函数接受的参数和传入的列表一样多。酷,我现在明白了。谢谢你的帮助。