lambda

Title
lambda
Type
Misc
Arguments
lambda LAMBDA-LIST [[{DECLARATION}* | DOCUMENTATION]] {FORM}*
Package
lisp
Section
制御構造
File
evalmacs.l
関数に名前を付ける必要がなく、手続きだけを記述したい場合にラムダ式
を用います。ラムダ式の二番目の引数はラムダリストと呼ばれ、関数の
パラメータの名前を与えます。lambda式のより完全な構文は以下です。

(lambda ({var}*
         [&optional {var | (var [initform [svar]])}*]
         [&rest var]
         [&key {var | ({var | (keyword var)} [initform [svar]])}*]
         [&aux {var | (var [initform])}*])
   [[{declaration}* | documentation-string]]
   {form}*)

引数がラムダ式によって表される関数に適用されると、form が評価
されて最後の form の結果が返されます。form は順に評価されます。

((lambda (x y) (+ x y)) 10 20)        => 30

ラムダリストの各要素は、パラメータ指定子や、記号&(アンパサンド)
で始まるラムダリストキーワードからなる。ラムダリストは5つの部分で
構成されます。

・必須パラメータの記述
    ラムダリストキーワードよりも前に現れる var を必須パラメータという。

・オプショナルパラメータの記述
    &optionalから次のラムダリストキーワードまでか、ラムダリストの
    終わりまで。関数呼び出し時に、オプショナルパラメータに対応する
    引数はあっても無くてもよい。引数が省略された場合、initform が
    あれば initform に初期化され、無ければ nil で初期化される。
    svar は引数が与えられたかどうかを示す。

  ((lambda (x &optional (y 0 given))
       (if given (+ x y) x))
    10 20)
  => 30

・レストパラメータの記述
    &restとそれに続く一つのパラメータ指定子。関数への引数のうち、
    必須パラメータとオプショナルパラメータに対応するもの以外
    からなるリストに束縛される。

  ((lambda (x &optional (y 1) (z 2) &rest args)
       (list x y z args))
    'a 'b 'c 'd 'e 'f)
  => (a b c (d e f))

・キーワードパラメタの記述
    &keyから次のラムダリストキーワードまでか、ラムダリストの
    終わりまで。関数が呼ばれたときに対応する keyword に対応する
    パラメータ指定子 var が値に束縛される。

  ((lambda (x &key ((:test f) #'eq))
       (if (funcall f x "word") 'True 'False))
   "word" :test #'equal)
  => True

  ((lambda (x &key (test #'eq))
       (if (funcall test x "word") 'True 'False))
    "word" :test #'eql)
  => False

・補助変数の記述
    ラムダリストに &aux が含まれるなら、この後の全ての指定は
    補助変数の指定子である。次に示す二つの例は同じ結果を与える。
    これらの使用については純粋にスタイルの問題である。
  
  ((lambda (x &aux (l (length x)))
       (list x l))
    '(a b c))
  => ((a b c) 3)
  
  ((lambda (x)
       (let ((l (length x))) (list x l)))
    '(a b c))
  => ((a b c) 3)
Seealso
defun
si:closure-variable