lambda - Land of Lisp 中关于 lisp Lambda 函数的问题

标签 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 的第二个参数。至少我认为这就是正在发生的事情!

我不明白的是我的匿名函数在哪里获取 (lambda (edge) 中的 edge 的值。如果有人能解释一下,我将不胜感激对我来说。

最佳答案

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))

关于lambda - Land of Lisp 中关于 lisp Lambda 函数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7438745/

相关文章:

linq - 如何在 Linq lambda 表达式中使用 'select new'?

return - 订单与SBCL中的返回有关

macros - SICP:可以或在 lisp 中定义为没有 gensym 的句法转换吗?

lisp - Lisp 中的内存分配

objective-c - 如何在 Objective-C 中编写 lambda 方法?

c++ - 将 unique_ptr 移入 lambda 时,为什么不能调用 reset?

java - 如何检索 List 中符合条件的最大元素?

recursion - 如何实现 "stackless"解释型语言?

graph - 在 CLISP 中提取节点形成虚线列表(边)

f# - 消除我通过类似、单子(monad)之类的东西传递的显式状态