1

私はラムダ関数をよく理解していません。以下は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関数は、関数とリストの 2 つの引数を取ることを理解しています。lambda (node)また、 を使用することで、1 つの引数 ( node) を の最初の引数として受け取りmapc、それ(cdr node)が の 2 番目の引数として使用される無名関数を渡すことになることも理解していmapcます。少なくとも私はそれが起こっていると思います!

私が理解していないのは、匿名関数が in の値を取得する場所edgeです(lambda (edge)。誰かが私にこれを説明していただければ幸いです。

4

1 に答える 1

2

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

たとえば、これを試してください:

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

または、リテラル ラムダを使用すると、次のようになります。

(mapc #'(lambda (x)
          (princ x)
          (terpri))
      '(1 2 3 4 5))
于 2011-09-16T00:02:56.487 に答える