Emacs Lispにおいて、ローカル関数を定義し,これを呼び出すサンプルコードを以下に示す.
(let ((p (lambda (a) (message a))))
(funcall p "hoge"))
=> "hoge"
このコードで何がおこなわれているか,簡単に説明する.作成する関数の本体は (lambda (a) (message a)) である.このlambdaで定義した匿名の関数を,letを用いて変数pに代入する.funcallを用いて,変数pを関数として呼び出す.関数の引数は,pに続いて記述する.
letで定義された変数はローカルスコープであるため,pはローカル関数であることがわかる.ちなみに,defunはグローバル関数を定義する関数である.ローカル関数を定義する関数は存在しない.
ちなみに再帰関数も定義できる.以下は,再帰関数の代表例である,階乗を計算する関数.この例では,引数に7を与えて,7の階乗を求めている.
(let
((f (lambda (num)
(cond ((<= num 1) 1)
(t (* num (funcall f (- num 1))))))))
(funcall f 7))
=> 5040