【问题标题】:Question about lisp Lambda functions from an example in Land of Lisp关于 Lisp Lambda 函数的问题来自 Lisp Land of Lisp 中的示例
【发布时间】:2011-11-18 07:40:07
【问题描述】:

我不太了解 lambda 函数。这是 Lisp 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 的值。如果有人可以向我解释一下,我将不胜感激。

【问题讨论】:

    标签: lambda lisp land-of-lisp


    【解决方案1】:

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

    试试这个例子:

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

    或者,使用文字 lambda:

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

    【讨论】:

    • 好的,那么说mapc的第一个参数必须是只有一个参数的函数是否正确?
    • @MikeJerome:正确,如果您传入一个列表。一般来说,你的函数接受的参数与你传入的列表一样多。
    • 酷,我现在明白了。感谢您的帮助。
    猜你喜欢
    • 2018-09-17
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多