myfinderの技術や周辺的活動のblog

2009年9月3日木曜日

「実践Common Lisp」読書録3

前回は属性リストを作る関数を定義してみた。
なので今回は属性リストを複数保持する変数を定義したり、その変数の中身をdumpする関数を定義してみる。

1.変数の定義
前回作った属性リストを複数保持するための変数を定義する。
変数の定義はdefvar(define variable)マクロを使う。

* (defvar db nil)


2.変数に要素を追加
この変数に要素を追加するにはpushマクロを利用する。

* (push (music "群青日和" "東京事変" 7) db)

((:TITLE "群青日和" :ARTIST "東京事変" :RATE 7))
* (push (music "喧嘩上等" "東京事変" 1) db)

((:TITLE "喧嘩上等" :ARTIST "東京事変" :RATE 1) (:TITLE "群青日和" :ARTIST "東京事変" :RATE 7))


3.変数の中身をみる
変数の中身を確認するだけであれば、単にREPLに変数名を渡せばよい。

* db

((:TITLE "喧嘩上等" :ARTIST "東京事変" :RATE 1) (:TITLE "群青日和" :ARTIST "東京事変" :RATE 7))

ただ、これだけだと先ほど変数に格納したときに出力されたものと何ら変わらなくて面白くない。
そこで、もう少し読みやすい形に出力してみる。

4.dbの全要素を整形して出力
変数dbにはいくつかのレコードが入っているが、これを一つ一つ処理するにはdolistマクロを用いる。
また、出力内容を整形する場合にはformat関数を用いる。
組み合わせると下記のようになる。

* (dolist (record db) (format t "~{~a:~10t~a~%~}~%" record))
TITLE: 喧嘩上等
ARTIST: 東京事変
RATE: 1

TITLE: 群青日和
ARTIST: 東京事変
RATE: 7

NIL

dolistはよいとして、ここで気になるのはformat関数である。
format関数は少なくとも2つの引数を取る。
最初の1つ目が、標準出力を表すtで、2つ目がフォーマット文字列である。
フォーマット文字列の詳細はこちらのページに任せる

5.format関数
format関数は「~{」と「~}」に挟まれた部分にある指示子を処理していく。
先ほどのフォーマット文字列では最後が「~%」となっていたが、これは一つ余分に改行コードを出力するもので、先ほどの出力結果と下記出力結果で多少違う事がわかると思う。

* (dolist (record db) (format t "~{~a:~10t~a~%~}~%" record))
TITLE: 喧嘩上等
ARTIST: 東京事変
RATE: 1

TITLE: 群青日和
ARTIST: 東京事変
RATE: 7
* (dolist (record db) (format t "~{~a:~10t~a~%~}" record))
TITLE: 喧嘩上等
ARTIST: 東京事変
RATE: 1
TITLE: 群青日和
ARTIST: 東京事変
RATE: 7
NIL

最後の~%の有無で、1レコード毎に入っていた改行部分が変化しているのがわかる。

今回はこのくらいで。
次回はファイル入出力の予定。

ではまた。

0 件のコメント: