久しぶりにEmacs Lispを書いたら、基本的なところではまったのでちょっとメモ。
lambdaで匿名関数を作ったときに、
((lambda (x y) (+ x y)) 1 2)
と呼べるのに、
(setq f (lambda (x y) (+ x y))) (f 1 2)
で呼べずにはまります。呼び出すには、
(funcall f 1 2)
とする必要があります。変数と関数の名前空間にあるように、値と関数は別に束縛されるそうです。いまどきそれはないだろうという気がしますが、今更どうしようもないのでしょう。
ついでに、lambdaを使うときに、
(mapcar (lambda (x) (* x 2)) '(1 2 3))
とするべきなのか、
(mapcar '(lambda (x) (* x 2)) '(1 2 3))
とするべきなのか、
(mapcar #'(lambda (x) (* x 2)) '(1 2 3))
とするべきなのか悩むところだったのですが、functionの役割りによると、lambda自体が(function (lambda ...))に展開されるマクロになっているそうなので、何も付けないのがお勧めだそうです。