2008-01-25
Getting Started in *LISP (1)
Getting Started in *LISP, *LISP |
*LISPのシミュレータに何か魅かれるものがあるので、とりあえずGetting Started in *LISPというチュートリアルを試してみることにしました。
Chapter 1. Instant *LISP
1章では、セル・オートマトンを作ってみるようです。
序盤で、セル・オートマトンの解説があって、次に*LISPの使用方法について。実機もシミュレータも、
(*lisp) (*cold-boot :initial-dimensions '(16 16))
のような感じでスタートさせます。
- 1.2 Using *Lisp
- 1.2.1 Defining an Automata Grid
とりあえず、セル・オートマトンの実習開始
(*defvar *automata-grid* 0) *AUTOMATA-GRID*
でグリッドを作成。初期値は、0
(ppp *automata-grid* :mode :grid :end '(8 5)) ;=> ; DIMENSION 0 (X) -----> ; ;0 0 0 0 0 0 0 0 ;0 0 0 0 0 0 0 0 ;0 0 0 0 0 0 0 0 ;0 0 0 0 0 0 0 0 ;0 0 0 0 0 0 0 0
pppは、pretty-print-pvarの略で、グリッドの内容を綺麗に整形して表示してくれます。
その前にpvarですが、parallel variableの略です。
操作に便利なユーティリティを色々と定義しつつ、関数を紹介
- viewたん
(defun view (&optional (width 8) (height 5)) (ppp *automata-grid* :mode :grid :end (list width height)))
グリッドを表示するためユーティリティ
- read-cell
(defun read-cell (x y) (pref *automata-grid* (grid x y))) (read-cell 5 1) ;=>0
一個のセルを表示するユーティリティ。
prefはpvarと、位置情報を引数に取って指定した位置の内容を返すもの。aref的なもの。
gridは、xとyから位置情報を生成する関数の模様。
- set-cell
(defun set-cell (x y newvalue) (*setf (pref *automata-grid* (grid x y)) newvalue))
セルの内容を設定するユーティリティ
*setfは、pvarを操作するためのsetfのようなもので、感覚的にはsetf。
(set-cell 5 1 7) (read-cell 5 1) 7 (view 8 3) ;=> ; DIMENSION 0 (X) -----> ; ;0 0 0 0 0 0 0 0 ;0 0 0 0 0 7 0 0 ;0 0 0 0 0 0 0 0
- set-grid
(defun set-grid (newvalue) (*set *automata-grid* newvalue))
グリッド全体の値を設定するユーティリティの模様。
*setは、setqのpvar版の模様。
(set-grid 7) (view 8 3) ; ; DIMENSION 0 (X) -----> ; ;7 7 7 7 7 7 7 7 ;7 7 7 7 7 7 7 7 ;7 7 7 7 7 7 7 7 ;; 乱数で埋めてみる (set-grid (random!! 10)) (view 8 3) ; DIMENSION 0 (X) -----> ; ;5 4 0 6 5 2 3 1 ;3 9 6 2 0 1 5 1 ;4 9 9 0 7 6 6 6
random!!は、通常の(random x)の並列版で、返り値として全体のpvarを返すもの。
Practical Common Lisp (23)
Practical Common Lisp 第5章5. Functionsを読んでメモしてみています。
大分間が開いてしまいました。かなり、まったり進行です。
Mixing Different Parameter Types
- 各種ラムダパラメータは組み合わせられるが、リストに現われる順番には決まりがある。下記の順番である必要がある。
- これらのパラメータは組み合わせられるものの直感的でない動作をするものもあるので注意が必要
1. ((lambda (x &optional y &key z) (list x y z)) 1 2 :z 3) 2. ((lambda (x &optional y &key z) (list x y z)) 1 :z 3) ;=> error 3. ((lambda (x &optional y &rest z) (list x y z)) 1 3) ;=> (1 3 nil) 4. ((lambda (&rest rest &key x y z) (list rest x y z)) :x 1 :y 2 :z 3) ;=> ((:X 1 :Y 2 :Z 3) 1 2 3)