Shammer's Philosophy

My private adversaria

let関数

Lispでは、ローカル変数の定義にlet関数を使用する。
以下のように、ある関数の実行前に変数 x が定義されていたとする。

(setf x 10)

しかし、

  • ある関数の中でも x という変数を使用したい
  • もと(定義済み)の変数 x はそのまま保持したい

という場合などは、let関数を利用する。

> (defun sample-func (x y z)
  (+ x y z)
)
SAMPLE-FUNC
> (setf x 10)
10
> (let ((x 20) (y 15)) (sample-func x y 1))
36
> x
10

例としては不適切かも。こんな設計にはしないだろうし。
入力値を検証し、条件を満たしていない場合にもう一度入力を求める、という関数で、
入力値を一時的に保持するためにletを使う、という場合などを考える。

>(defun check-number ()
  (format t "Please type a number.")
  (let ((val (read)))
    (if (numberp val)
	val
      (check-number))))
CHECK-NUMBER
>(check-number)
Please type a number.f
Please type a number.f
Please type a number.9
9
>