2011-09-15 59 views
1

我不太瞭解lambda函數。下面是Lisp語言的書土地爲例功能:關於Lisp Lambda函數的問題來自Lisp Land的示例

(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的值。如果有人能向我解釋這一點,我將不勝感激。

回答

2

edge參數來自(cdr node)中的項目。您的內部lambda將在(cdr node)中的每個元素中被調用一次。

試試這個,例如:

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

或者,用文字拉姆達:

(mapC#'(lambda (x) 
      (princ x) 
      (terpri)) 
     '(1 2 3 4 5)) 
+0

好了,所以這將是正確地說,MAPC的第一個參數必須是唯一的功能一個論據? – MikeJerome

+0

@MikeJerome:正確的,如果你通過一個列表。一般來說,你的函數需要的參數和你傳入的列表一樣多。 –

+0

很酷,我現在明白了。謝謝您的幫助。 – MikeJerome