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-16

Practical Common Lisp (7)

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

Updating Existing Records--Another Use for WHERE

引き続きPractical Common Lisp 第三章3. Practical: A Simple Databaseを読んでみています。

とりあえず出てきたコードを暗記して再現して感想をメモ
(defun update (selector-fn &key artist title rating (ripped nil ripped-p))
  (setf *db*
	(mapcar (lambda (row)
		  (when (funcall selector-fn row)
		    (if artist (setf (getf row :artist) artist))
		    (if title (setf (getf row :title) title))
		    (if rating (setf (getf row :rating) rating))
		    (if ripped-p (setf (getf row :ripped) ripped)))
		  row)
		*db*)))

できた。今度はデータの内容を更新するものを作成する様子。

(defun delete-row (selector-fn)
  (setf *db* (remove-if selector-fn *db*)))

できた。データを削除するものらしい。

以上を踏まえて本文を読んでみる
  1. データベースにはデータを更新する機能が必須なので作る。
  2. これも、SQLに倣ってupdateという名前で作成することにして、データの抽出には定義したwhereを使用する。
  3. MAPCARの説明
    • リストの中の一つ一つのアイテムを総嘗めで処理するのには、mapcarが使える。
  4. SETFの説明。
    • (setf (getf row :ripped) ripped)のような形式が初めてでてきた。ちょっとややこしいが、詳細は、6章で説明する。とりあえず、setfは、変数の名前だけでなく、「変数が格納されている場所」を指定することにより、その場所に値を格納することができるとでも思っておく。
  5. REMOVE-IF/REMOVE-IF-NOTの説明
    • REMOVE-ifは条件を判定する関数とリストを引数に取り、リストのアイテムを一つずつ調べ、条件が満されたアイテムが含まれないリストを返す。REMOVE-IF-NOTは、条件を満さないもののリストを返す。つまり、リストから不要なものを取り除いた結果を返す。