next up previous
Next: 11 課題 Up: ソフトウェア特論 講義資料 C言語によるLisp処理系 Previous: 9.4 C 曲線の表示


10 xlispstat

Macintoshの上で走る形に拡張された処理系として, Luke Tierney という人が拡張したXlispstatという処理系があります.これは, 統計学などで利用される関数とグラフィックス表示用関数を備えており, UnixのXwindow上でも走るようになっています. 現在(2003.6.18)は,以下のところから

ftp://ftp.stat.umn.edu/pub/xlispstat/3-52/
ソースプログラム 一式(xlispstat-3-52-19.tar.gz)を もってくることができる. Cygwin1-3-22の環境でこれを作成するには,

% configure --width-gcc --x-includes=/usr/X11R6/include
% make
と行い,X11BSDstuff.cの最後のmemmove P3Cのところでエラーがでるので この関数をコメントアウトし,ハードリンクを結ぶコマンドでエラーがでるので Makefileの中で,下のようにシンボリックリンクに直して,

xlisp: ${GRAPHSYS}xlisp
	-ln -s ${GRAPHSYS}xlisp xlisp
もう一度makeし,最後に make installすれば /usr/local/lib/xlispstat以下に環境が作られます.

~/prog/lisp/xlisp/xlispstat/xlispstat-3-52-19> xlispstat
XLISP-PLUS version 3.04
Portions Copyright (c) 1988, by David Betz.
Modified by Thomas Almy and others.
XLISP-STAT Release 3.52.19 (Beta).
Copyright (c) 1989-1999, by Luke Tierney.

> (exit)
以下は,xlispstat 2.1のバージョンの例ですが, このXLISP-PLUS version 3.04でも同じ関数を使うことが できます.ただ,手元のranduなどのXwindowをマウス操作する デモは操作が表示が少しうまくいかないようです.
ursa<inaba> xlispstat
XLISP version 2.1, Copyright (c) 1989, by David Betz
XLISP-STAT version 2.1 Release 2, Copyright (c) 1989,
   by Luke Tierney.
....
> (histogram '(1 2 2 3 1 2 3 4 1 2 3 4))
#<Object: 1618488, prototype = HISTOGRAM-PROTO>
>
このhistogramという関数は,ディスプレイ上にウィンドウを表示し,ヒスト グラムを棒グラフで示します.そのウィンドウには,Menuボタンなどがあり, それを用いるといろいろなことを指定できます.
図 2: ヒストグラムのウィンドウ
\includegraphics[width=7.0cm]{/home/inaba/eps/lecture/fig/histogram.eps}
Xlispstatに関しては,上にあげたニュースグループを参照するか,xlispstat について書かれた以下の書籍を参考にするといいと思います.
@book{XLispstat,
author = "Luke Tierney",
title = "Lisp-Stat: An Object-Oriented Environment for
        Statistical Computing and Dynamic Grapics",
publisher = "Wiley-Interscience",
year = 1990}
1376   xlisp2.1
78     xlisp.pc
20     makefiles
173    lsp/txt
110    lsp/comp
16     lsp/winston
250    lsp/back
283    lsp/eus
1358   lsp
1066   xlispstat/msdos
26     xlispstat/CL/CLS1.0A1/Data
2      xlispstat/CL/CLS1.0A1/Examples
228    xlispstat/CL/CLS1.0A1/lib
583    xlispstat/CL/CLS1.0A1
614    xlispstat/CL
26     xlispstat/xlispstat2.1R2/Data
41     xlispstat/xlispstat2.1R2/Examples
3      xlispstat/xlispstat2.1R2/machines/vax
3      xlispstat/xlispstat2.1R2/machines/sun3
7      xlispstat/xlispstat2.1R2/machines/pmax
3      xlispstat/xlispstat2.1R2/machines/generic
4      xlispstat/xlispstat2.1R2/machines/encore
3      xlispstat/xlispstat2.1R2/machines/sun4
7      xlispstat/xlispstat2.1R2/machines/ibmrt_bsd
2      xlispstat/xlispstat2.1R2/machines/decstation
2      xlispstat/xlispstat2.1R2/machines/next
36     xlispstat/xlispstat2.1R2/machines
335    xlispstat/xlispstat2.1R2/macintosh
9      xlispstat/xlispstat2.1R2/emacs
2527   xlispstat/xlispstat2.1R2
6      xlispstat/fixes
1041   xlispstat/mac
873    xlispstat/doc
627    xlispstat/xlispstat.doc/postscript
1095   xlispstat/xlispstat.doc
247    xlispstat/glim
7470   xlispstat
10303  xlisp
xlispstatのサンプルプログラムは /usr/local/lib/xlispstatの Examplesにあります.
       9      24     308 abrasiondemo.lsp
      27     144    1206 addbox.lsp
      39     174    1361 addhandrotate.lsp
      50     206    1542 bcdemo.lsp
      94     398    3062 dataprotos.lsp
      10      47     295 fstat.lsp
     189     693    7448 inspect.lsp
     293    1268   11158 plotcontrols.lsp
      38     183    1274 regdemo.lsp
     130     502    4948 rotatedemo.lsp
      32     136    1260 tour.lsp
       8      27     255 tourdemo.lsp
     919    3802   34117 total
たとえば,
> (load
  "/usr/local/lib/xlispstat/Examples/rotatedemo.lsp")
; Loading ...
; "/usr/local/lib/xlispstat/Examples/rotatedemo.lsp"
; "/usr/local/lib/xlispstat/Examples/addbox.lsp"
; "/usr/local/lib/xlispstat/Examples/addhandrotate.lsp"
; "/usr/local/lib/xlispstat/Data/tutorial.lsp"
T
> (demo 'abrasion)
NIL
とすると,ウィンドウが表示され,
> (demo 'randu)
; loading "/usr/local/lib/xlispstat/Data/randu.lsp"
RANDU
>
とすると,そのウィンドウが次に示すようなウィンドウに置き換わります.
図 3: randuのウィンドウ
\includegraphics[width=6.0cm]{/home/inaba/eps/lecture/fig/randu.eps}
このウィンドウの右上のMenuボタンを右ボタンでクリックすると, 様々な設定が可能になります. また,下にある,Pitch,Roll,Yawのボタンを押し続けると三次元表示されている グラフが回転して表示されます. また,xlispstatの組み込み関数は拡張されたものが多くなっています.
> (setq a '(1 2 3))
(1 2 3)
> (setq b '(2 3 4))
(2 3 4)
> (+ a b)
(3 5 7)
> (- a b)
(-1 -1 -1)
> (* a b)
(2 6 12)
> (/ a b)
(0.5 0.666667 0.75)
> (%* a b)
20
というぐあいに,リストデータの四則演算が定義されています. また,リストを行列やベクタのように扱うことも可能です. 行列(matrix)に関連する関数に何があるかを調べるための 関数としてaproposという関数を用いることができます.
> (apropos "matrix")
INSPECT-MATRIX-DIALOG-PROTO
IDENTITY-MATRIX
COVARIANCE-MATRIX
SCATTERPLOT-MATRIX
SWEEP-MATRIX
MATRIXP
:SWEEP-MATRIX
:X-MATRIX
MATRIX
UNIT-MATRIX
MAKE-SWEEP-MATRIX
PRINT-MATRIX
NIL
たとえばidentity-matrixの機能や引数について 知りたいとすると,helpという関数を用いることができます.
> (help 'identity-matrix)
IDENTITY-MATRIX
[function-doc]
Args: (n)
Returns the identity matrix of rank N.
NIL
という具合にひとつの引数をもつ関数で単位行列を作るということが わかります.また,逆行列を求めるinverseというのもありますが, それをhelpすると,
> (help 'inverse)
INVERSE
[function-doc]
Args: (m)
Returns the inverse of the square matrix M; 
signals an error if M is ill conditioned or singular
NIL
となります. これらを使った例を上げれば以下のようになります.
> (setq c (identity-matrix 3))
#2A((1 0 0) (0 1 0) (0 0 1))
> (%* c a)
(1 2 3)
> (%* c b)
(2 3 4)
> (%* b c)
(2 3 4)
> (%* c c)
#2A((1 0 0) (0 1 0) (0 0 1))
> (setq d (+ c c))
#2A((2 0 0) (0 2 0) (0 0 2))
> (inverse d)
#2A((0.5 0 0) (0 0.5 0) (0 0 0.5))
> (matmult d (inverse d))
#2A((1 0 0) (0 1 0) (0 0 1))
これらの行列のサイズは自由ですから非常に利用範囲は 広いということがいえます. Lispの特徴はこういったデータのサイズを限定しなくてもすむことです.また, 自動的にガーベッジコレクションを行なうメモリ管理機能によって新しくデー タを作ってゆくという計算を行なっていっても,破綻をきたさないようになっ ています.

generated through LaTeX2HTML. M.Inaba 平成18年5月6日