Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2007-12-06

Practical Common Lisp (3)

| 01:21 | Practical Common Lisp (3) - わだばLisperになる を含むブックマーク はてなブックマーク - Practical Common Lisp (3) - わだばLisperになる

引き続きPractical Common Lispをさらってみています。

3. Practical: A Simple Database

この章では、簡単なCDのデータベースを作成してみる。

この本の方針とか説明色々。

CDs and Records

CDのアーティスト名、アルバム名、お気に入り度、mp3にリッピングしたかどうか、の4つを格納する。

4つのデータのまとまりを扱うということであれば、Common Lispには沢山の表現方法がある。リストで表現するとか、CLOSを使うとか。

  • とりあえず例示されているコードを写経してみる
(list 1 2 3)

とりあえず、listを使うことにしたのだろう。

(list :a 1 :b 2 :c 3)

plistだろうか。

(getf (list :a 1 :b 2 :c 3) :c)

plistを軸に4つのデータを管理することにしたみたい。

(defun make-cd (album artist rating ripped)
  (list :album title :artist artist :rating rating :ripped ripped))

間違った。albumじゃなくて、titleだった。アルバムのデータのplistを作る関数の様子。

  • 文章を読んでみてメモする

plistについての解説。

普通のリストだけれど、キー、値、が交互に並べた形式をproperty listとかplistと呼ぶ。

":"から始まってるシンボルの意味の説明。

キーワードシンボルと呼ばれる。

plistを作るのには、普通のlist関数を使う。

plistを操作するのには、getfが使える。

(getf plist key)

で、keyと対の値が取り出せる。

値のセーブについては後で。

ということで、CDのデータをplistにする、make-cd関数を作成。

Filing CDs
  • 例示されているコードを写経してみる
(devar *db*)

とりあえず、DBには、大域変数の*db*を定義してそれを使うことにしたらしい。

(defun add-record (cd) (push cd *db*))

大域変数*db*にの結果をどんどんプッシュすることにしたらしく、その為のadd-record関数。

  • 文章を読んでみてメモする

読んでみる。大体予想したことと同じだった。

Looking at the Database Contents
  • 例示されているコードを写経してみる
(defun dump-db ()
  (dolist (cd *db*)
    (format t "~{~A:~10T~A~%~}~%" cd)))

*db*の内容はそのままでは、plistの羅列なので、見易くプリントしてくれる関数らしい。

フォーマット指示子の~Aとか、~Tとかはこの本では小文字にするスタイルらしい。ちなみに、Norvig & Pitmanの

Tutorial on Good Lisp Programming Style(PostScriptファイル)(okshiraiさん訳)では区別しやすいように大文字にすることを推奨。

(defun dump-db ()
  (format t "~{~{~A:~10T~A~%~}~%~}" *db*))

さらにformatで凝ったことをして、dolistのループを不要にした様子。

  • 文章を読んでみてメモする

*db*の内容を見易く表示する関数を作ろう。

dolistの説明。リストの内容を一つずつ処理させたいときに使う。

formatの説明。謎のフォーマット文字列。Cのprintfとか、Perlとかに比べてもそんなに複雑ではない筈。

formatは2つの引数を取って、最初のtは、*standard-output*を指定するという意味。

formatの書式指定子は、~から始まる。printfだと、% 。

~a指示子は、aesthetic(美的)な指示子。(語呂合せで覚えようというのだろうか。)

人が読み易い形で表示してくれる。

引数に文字列を与えると、ダブルクオートを取り除いて表示する。

キーワードシンボルを与えると、:を取り除いて表示する。

ふと思って確認してみた。
:fooというのは、keyword:fooの略記になるわけですが、こういうパッケージを含んだ記法を与えるとどうなるのか、
結果:
(format t "~A" keyword::foo)
(format t "~A" keyword::foo)
(format t "~A" 'keyword::foo)
(format t "~A" 'keyword:foo)
(format t "~A" 'cl-user::foo)
=>FOO
全部FOOでした。

~tというのは、表の整形に使うもので、~10tは、10カラム目からスタートするということ。その前は空白で埋める。

~{と~}の組み合わせは、引数にリストを取り、リストの中身を取り出して~{と~}の間に記述されたパターンにマッチさせながら繰り返し表示する。

~%は改行。

ということで、dolistも省略できたりする。

長いので次回Improving the User Interactionより再開。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20071206