« PythonとRubyとLispのコレクション処理 | トップページ | LTspiceをUbuntuで動かしてみた »

Common Lispのグローバル変数

Common Lispではグローバル変数(スペシャル変数)を定義する方法が2つある。
一つはdefparameterフォームを使う方法で、もう一つはdefvarフォームを使う方法だ。

この二つの使い分けを、Lispが得意とするプロトタイピングの観点から整理してみた。
つまり、

  • ソースコードを修正しても、修正前の値が維持される変数はdefvarで定義する
  • ソースコードを修正した影響がすぐに反映される変数はdefparameterで定義する

と考える。
プロトタイピングでは、設計しながら実装とリファクタリングをしていくので、こういう場面にはよく出くわす。

今、こんなソースコードを作っているとする。

(defparameter *delta* 1)
(defvar *count* 0)

(defun increment-widget-count()
  (incf *count* *delta*))

これをコンパイルしてロードする。

CL-USER> (compile-file "/work/param.lisp")
CL-USER> (load "param")

*delta*は1だ。

CL-USER> *delta*
1

*count*は0だ。

CL-USER> *count*
0

関数を3回実行すると、countは3になる。

CL-USER> (increment-widget-count)
1
CL-USER> (increment-widget-count)
2
CL-USER> (increment-widget-count)
3

ここでソースコードの*delta*を2に修正する。

(defparameter *delta* 2)
(defvar *count* 0)

(defun increment-widget-count()
  (incf *count* *delta*))

このファイルを再コンパイルしてロードする。

CL-USER> (compile-file "/work/param.lisp")
CL-USER> (load "param")

*delta*を確認すると、修正が反映されて2になっている。

CL-USER> *delta*
2

*count*を確認すると、3のままだ。

CL-USER> *count*
3

関数を3回実行すると、countは今度は2づつ増えて9になる。

CL-USER> (increment-widget-count)
5
CL-USER> (increment-widget-count)
7
CL-USER> (increment-widget-count)
9
CL-USER> *count*
9

|

« PythonとRubyとLispのコレクション処理 | トップページ | LTspiceをUbuntuで動かしてみた »

LISP」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1286769/35895288

この記事へのトラックバック一覧です: Common Lispのグローバル変数:

« PythonとRubyとLispのコレクション処理 | トップページ | LTspiceをUbuntuで動かしてみた »