Land Of Lisp 第2章 (その2)

ローカル定義に関してのメモ

let:ローカル変数を定義

例.

(let ((a 5)
      (b 6))
  (setf a 4)
  (+ a b))
10

(a 5)、(b 6)が変数とその初期値、さらにこの宣言部を()で括る
(setf a 4)、(+ a b)が変数を使った処理


flet:ローカル関数の定義

例.

(flet ((f (n)
	 (+ n 10)))
  (f 5))
15

fが関数名、nが引数、(+ n 10)が関数本体
ローカル変数と同様、これらの宣言部を()で括る
次の(f 5)が宣言した関数を使った処理

ここまでの内容でどのように使うのか、自分で考えてみました。

(defun gfunc (x)
  (let ((a 5))
    (flet ((lfunc (n)
	     (+ n a 10)))
      (lfunc x))))
gfunc
(gfunc 10)
25

*defun参照

こんな使い方が正しいのか、これから本を読み進めるうちにわかると思います。
(違っていることがわかったら急いで修正予定)


ローカル関数定義をもう一つ

labels:ローカル関数の定義

    ローカル関数内のスコープで定義したローカル関数を使用できる
例.

(labels ((a (n)
	   (+ n 5))
	 (b (n)
	   (+ (a n) 6)))
  (b 10))
21

この例ではローカル関数aがローカル関数b内で使用されています。
後々、再帰のコードで使われることでしょう。