2011-09-15 12 views
1

ラムダ関数をあまり理解していません。lispに関する質問Lispの例のLambda関数

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

のは、ちょうど今のところ、ここで内側の部分を見てみましょう::ここでは書籍のLispの土地から例の機能がある

(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)を使用すると、1つの引数(node)を最初の引数としてmapcに渡し、(cdr node)mapcの2番目の引数として使用されることを理解しています。少なくとも私はそれが起こっていると思う!

わからないことは、私の無名関数がedgeの値を(lambda (edge)に設定するところです。誰かがこれを私に説明してもらえれば嬉しいです。

答えて

2

edge引数は、(cdr node)の項目に由来します。 (cdr node)の要素ごとに内側のラムダが1回呼び出されます。

例えば、これを試してみてください:

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

あるいは、リテラルラムダと:

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

わかりましたので、MAPCの最初の引数は唯一の関数でなければならないと言うことは正しいだろう一つの議論? – MikeJerome

+0

@MikeJerome:あなたが1つのリストを渡しているなら、修正してください。一般に、あなたの関数は、あなたが渡しているリストと同じくらい多くの引数をとります。 –

+0

クール、私は今理解しています。助けてくれてありがとう。 – MikeJerome

関連する問題