HOME Common Lisp download 書き込む

SmartCalcConsole の使い方


1. はじめに

LISP のトップレベルは電卓としても利用できます。ただ、括弧を付けるのが面倒なので、 逆ポーランド語法の電卓を作ってみました。 名前はとりあえず、"SmartCalcConsole" としました。逆ポーランド語法は入力と出力を区別しないので 連続して計算が行える利点があります。また、この電卓は普通の関数電卓と違い、分数、複素数も 扱えます。さらに、LISP に用意されている豊富な関数郡を使うことが出来ます。 LISP は AI 用の言語だとの誤解がありますが、LISP はいろいろな目的に使える汎用言語であり、 数値計算も得意分野の1つです。

2. SmartCalcConsole のインストール

次の手順でインストールを行います。

2.1. clisp のインストール

CLISPインストールガイド for Win32 に書いてありますが、簡単に説明します。まず、 sorceforge.net の clisp セクション から、clisp-****-win32.zip という名前のファイルをダウンロードします。2004年6月29日 現在では、 clisp-2.33.1-win32.zip が最新バージョンです。それを適当なディレクトリで解凍します。(ここでは、 c:\bin に解凍したとします。PATH の通っているディレクトリに以下の内容のバッチファイルを作成し、clisp.bat という名前を付けましょう。
C:\bin\clisp-2.33.1\full\lisp.exe -B C:\bin\clisp-2.33.1\full -M C:\bin\clisp-2.33.1\full\lispinit.mem  %1
これで、どのディレクトリからでも clisp が利用可能になります。 利用するには、コンソールを立ち上げて、"clisp" と入力してください。図1のような画面が現れたら成功です。 インストーラも付属していますが、うまく働きません。手動でインストールしてください。

図1:clisp を立ち上げたときのコンソール screen shot

2.2. SmartCalcConsole のインストール

ダウンロードした SmartCalcConsole.lzh を適当なディレクトリで解凍します。(例えば c:\SmartCalcConsole) 解凍すると、SmartCalcConsoleIni.lisp, SmartCalcConsole.lisp, SmartCalcConsole.bat という3つのファイルが出来上がります。 DOS プロンプトを開いて、そのディレクトリに行って、clisp を立ち上げます。 そして、SmartCalcConsoleIni.lisp, SmartCalcConsole.lisp をコンパイルします。
clisp > (compile-file "SmartCalcConsoleIni.lisp")
clisp > (compile-file "SmartCalcConsole.lisp")
SmartCalcConsole.bat を PATH の通ったディレクトリに保存し、SmartCalcConsoleIni.lisp, SmartCalcConsole.lisp を保存した ディレクトリにあわせて、[installed-directory] を書き換えます。 下の囲みでは3行に分かれてしまっていますが、1行に書いてください。 icon
C:\bin\clisp-2.33.1\full\lisp.exe -B C:\bin\clisp-2.33.1\full 
-M C:\bin\clisp-2.33.1\full\lispinit.mem  -i [installed-directory]\SmartCalcConsoleIni.fas 
[installed-directory]\SmartCalcConsole.fas
ディスクトップ上に SmartCalcConsole.bat のショートカットを作成し、 右図のようにアイコンを計算機らしいものに変えましょう。 このアイコンをダブルクリックして、図2のようなコンソールが立ち上がればインストールは成功です。

図2:smart-calc-console を立ち上げたときのコンソール screen shot

3. SmartCalcConsole の使用法

SmartCalcConsole は逆ポーランド語法なので、まず数字をキューに入力しそれから演算子を入力して計算します。 数値を入力すると、下の囲みに示すように、メモリー、エコー、ステータスが上の行に、キューが下の行に示され、 さらに、プロンプトが現れます。

memory:[0], echo: 4, status: ok
queue: [2 3 4]
Calc>

表1に簡単な計算例 (2+3+4) を示します。

表1: 2+3+4 を計算する.
入力 キュー メモリー コメント
2 2 0 数字を入力
3 2 3 0 2番目の数を追加
4 2 3 4 0 3番目
+
9
0
足し算を行う

さて、この計算結果を利用して計算を続けましょう。例えば、計算結果に5をかけるには表2のようにします。

表2: 前の計算結果に 5 をかける.
入力 キュー メモリー コメント
+ 9 0 まえの計算結果
5 9 5 0 5 を追加する
* 45 0 そしてかける
m+ 45 45 メモリーにセーブする

計算機を終了するには "bye" と入力します。計算過程は *smart-calc-log* で定義されたファイルに保存されます。 (デフォルトでは smart-calc.log)

4. 数値と定数

数や定数をあらわすシンボル(注1)を入力するとそれらはキューの最後に追加されます。
複素数を入力するには [実数部, 虚数部](注2) と入力します。

注1:”定数をあらわすシンボル”とは、PI など、LISP システムで定義されたもの及び *smart-calc-constants* で定義されたものをさします。
注2:普通の入力方法 #C(実数部 虚数部) も使用できます。

5. 算術オペレーター

ユーザー定義関数を含め、数値を引数に取る全ての関数がオペレータとして使えます。 オペレータはキューに対して "apply" されます。もし、キューがオペレータが取るべき 引数とマッチしない場合は、この計算機は "error" と表示してほかは何もしません。 関数は数値以外の値も返すことが出来ます。ただし、数値および数値に変換されるシンボル 以外の要素は引き続いて行われる 計算では無視されます。以下に LISP システムに備わっている関数を示します。
+, -, *, /, floor, ceiling, round, truncate,
mod, max, min, gcd, lcm, exp, expt, log, sqrt,
sin, cos, tan, asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh,
random etc.
詳しいことは lisp.org または franz.com を見てください。

6. キュー及びメモリーを操作するコマンド

以下にキュー及びメモリーを操作するコマンドを示します。
help
コマンドの一覧を表示します。
const (or constants)
定数の一覧を表示します。
push Number (or Constant)
数値をキューの先頭に追加します。
del
キューの最後の要素を削除します。
pop
キューの最初の要素を削除します。
c!
キューを空にします。
<
前のキューを呼び出します。なければ error が表示されます。
>
次のキューを呼び出します。なければ error が表示されます。
filter
キューの数値以外の要素を削除します。
mr
メモリーの値をキューの最後に追加します。
mc!
メモリーの値を 0 にします。
bye
計算機を終了します。

もし、キューの要素が数値一つだけの場合には次の4つのコマンドが使えます。
m+
Nm = Nm + Nq にセットします。
m-
Nm = Nm - Nq にセットします。
m*
Nm = Nm * Nq にセットします。
m/
Nm = Nm / Nq にセットします。
ここで、 Nm と Nq はそれぞれ、メモリーの値、キューの値です。

7. 定数の定義

定数の定義は SmartCalcConsoleIni.lisp にある *smart-calc-constants* を編集することで行います。

*smart-calc-constants* は連想リストで、個々のリストは2つか3つの要素から なっています。個々のリストの最初の要素は定数を表すシンボル、2番目は定数の値、 3番目は単位です。3番目の要素は単位が無い定数の場合省くことが出来ます。

定数の名前は "|constant-name|" の様に "|" でくくって表してください。 こうすると LISP システムはこれをシンボルと認識し、(文字列よりも)高速に検索できます。

8. ユーザー定義関数

ユーザ定義関数は "defun" を使って普通に定義します。詳しいことは LISP Primer, lisp.org, franz.com, または "SmartCalcConsoleIni.lisp" の (mark 1), (mark 2) の間の例を見てください。 定義された関数を使うのに追加の宣言は必要ありません。 多値を返す場合は "values" を使ってください。数値に交えて文字列も返すことも 出来ます。こうすると計算結果が読みやすくなります。

9. 例

例を3つ示します。

9.1. eπ i = -1 の計算

表3に eπ i の計算過程を示します。

表3: eπ i の計算
入力 キュー メモリー コメント
pi PI 0 定数に束縛されているシンボルを入力できます
i PI i 0 "i" は *smart-calc-constants* で定義されています
* [0.0L0, 3.1415926535897932385L0] 0 i * π
exp [-1.0L0, -5.016557612668332023L-20] 0 結果はとても "-1" に近い

9.2. F(x) = a x3 + b x2 + c x + d の計算

"poly" という関数が SmartCalcConsoleIni.lisp に定義されています。 poly の最初の引数は x の値で、残りの引数はパラメータです。 従って F(x) の値は次のように計算することが出来ます。
(poly x a b c d)
ここで、 a= 2/7, b= 5/17, c = 2/3, d= 13/23 としましょう。 F(0) と F(-1) の計算を表4に示します。

表4: F(x) = 2/7 * x3 + 5/17 * x2 + 2/3 * x + 13/23 (x=0, -1) の計算
入力 キュー メモリー コメント
2/7 2/7 0 パラメータのロード
5/17 2/7 5/17 0 パラメータのロード
2/3 2/7 5/17 2/3 0 パラメータのロード
13/23 2/7 5/17 2/3 13/23 0 パラメータのロード
push 0 0 2/7 5/17 2/3 13/23 0 x の値をキューの最初に追加する
poly 13/23 0 F(0) を計算する
< 0 2/7 5/17 2/3 13/23 0 前のキューを呼び出す
pop 2/7 5/17 2/3 13/23 0 x を削除する
push -1 -1 2/7 5/17 2/3 13/23 0 x に -1 を代入
poly -764/8211 0 そして F(-1) を計算する
float -0.09304591 0 少数に変換する

9.3. 平均値と標準偏差の計算

統計処理のために"ave"、 "sd"、"stat" という関数が用意されています。表5にデータセット {2.2, 2.4, 3.2, 4.3, 3.8, 3.7, 2.9} の平均値 (ave.) と標準偏差 (S.D.) を求める計算法を示します。

表5: {2.2, 2.4, 3.2, 4.3, 3.8, 3.7, 2.9} の平均値と標準偏差の計算
入力 キュー メモリー コメント
--- 2.2 2.4 3.2 4.3 3.8 3.7 2.9 0 数値の入力は省略
ave 3.2142856 0 平均値の計算
< 2.2 2.4 3.2 4.3 3.8 3.7 2.9 0 前のキューを呼び出す
sd 0.7690439 0 標準偏差の計算
< 2.2 2.4 3.2 4.3 3.8 3.7 2.9 0 前のキューを呼び出す
stat N. 7 ave. 3.2142856 S.D. 0.7690439 0 平均値と標準偏差を計算するもう一つの方法
pop 7 ave. 3.2142856 S.D. 0.7690439 0 最初の要素を削除する
pop ave. 3.2142856 S.D. 0.7690439 0 最初の要素を削除する
+ 3.9833295 0 "ave." と "S.D." は計算から除外される。

10. 終わりに

Common LISP は整数、少数に加えて分数、複素数を扱えるのでこの"電卓"もそれらの 数を扱えます。私はこの電卓をとても便利に使っています。皆様にもお使いいただけたら 幸いです。なお、GUI version は gtk-server.org にありますのでよろしかったら覗いてみてください。