ikemonn's blog

技術ネタをちょこちょこと

【Lisp】Land of Lisp 2章

グローバル変数の定義

トップレベル変数(グローバルにて意義される変数)を定義するためにdefparameterを使う。 **はローカル変数と区別するためにつけておくと良い。

> (defparameter *small* 1)
*SMALL*

同じ名前でトップレベル変数を定義すると上書きされる。

> (defparameter *small* 1)
> *small*
1

> (defparameter *small* 2)
> *small*
2

ただし、defvarを使うと上書きされない。

> (defvar *foo* 1)
> *foo*
1

> (defvar *foo* 2)
> *foo*
1

グローバル関数の定義

defunを使う。

(defun function_name (arguments)
 ...)

イナリサーチ

;ゲームの初期化
(defun start-over ()
  (defparameter *small* 1)
  (defparameter *big* 100)
  (guess-my-number))

;数の推測
(defun guess-my-number()
    (ash (+ *small* *big*) -1))

;想定している数値よりも大きい時のコマンド
(defun bigger()
    (setf *small* (1+ (guess-my-number)))
        (guess-my-number))

;想定している数値よりも小さい時のコマンド
(defun smaller()
    (setf *big* (1- (guess-my-number)))
        (guess-my-number))

再帰をつかっていますね。

ローカル変数の定義

letを使う。

(let (変数定義)
   ...本体...)

letでは複数の変数を定義できる。その変数はletコマンドの本体内でだけ使える。

(let ((a 5)
      (b 6))
      (+ a b))

ローカル関数の定義

fletを使う。

(flet ((関数名 (引数)
       …関数本体…))
    …本体…)
(flet ((f (n)
        (+ n 10)))
    (f 5))

ローカル関数内で同じスコープのローカル関数名を使いたいときはlabelsを使う。

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

参考

Land of Lisp

Land of Lisp