2009年7月2日木曜日

【フムフム本】22章 データベース


* 22章 データベース
- 特になし。
** 22.1 コマンドライン版のスケジュールデータベース
- 特になし。
** 22.2 Gaucheで扱えるデータベースの種類
- 特になし。
** 22.3 ファイルに直接read/writeで記録する
- 特になし。
*** 22.3.1 ポートに対するread/write
- 特になし。
*** 22.3.2 一時ファイルを使ったデータの書き込み
- 特になし。
*** 22.3.3 データベースを初期化する
- 特になし。
*** 22.3.4 schedule手続きを書く
- 特になし。
*** 22.3.5 予定データの構造
- 特になし。
*** 22.3.6 予定の表示
- 特になし。
*** 22.3.7 予定の一覧表示
- 特になし。
*** 22.3.8 予定の検索と表示
- 特になし。
*** 22.3.9 予定の登録、削除
- 特になし。
*** 22.3.10 この例で割愛した処理
- 特になし。
- 頭痛が酷いので、いったんここで中断。
** 22.4 dbmモジュールを使ったスケジュールデータベース
- 一晩寝て再開。頭痛が残っている。。。
Shibuya.lisp前になると体調を崩すのはなんでだろう。
- パラメータというデータ構造? どんなもんだろ?
** 22.5 dbm.fsdbmモジュール
- 特になし。
*** 22.5.1 dbm.fsdbmモジュールを使う
- 特になし。
*** 22.5.2 ファイルシステムにデータを保存する。
- 特になし。
*** 22.5.3 データベースを開く
- 特になし。
*** 22.5.4 データベースを閉じる
- 特になし。
*** 22.5.5 スケジュールデータベースの初期化
- 特になし。
*** 22.5.6 schedule手続き
- 特になし。
*** 22.5.7 予定の表示
- 特になし。
*** 22.5.8 予定の一覧表示
- 特になし。
*** 22.5.9 予定の検索と表示
- 特になし。
*** 22.5.10 予定の登録と削除
- 特になし。
** 22.6 データベースアクセスを1箇所にまとめる
- 特になし。
** 22.7 大域変数の代わりにparameterizeを使う
- 特になし。
*** 22.7.1 パラメータは0個または1個の引数をとる手続きとして動作する
- parameterを調べる。
gosh> (define x (make-parameter 20))
x
gosh> (describe x)
#<<parameter> 0x2612960> is an instance of class <parameter>
slots:
filter : #f
setter : #<closure ((initialize <parameter> <top>) #f)>
getter : #<closure ((initialize <parameter> <top>) #f)>
pre-observers: #<closure ((initialize <parameter> <top>) #f)>
post-observers: #<closure ((initialize <parameter> <top>) #f)>
gosh> (describe <parameter>)
#<class <parameter>> is an instance of class <class>
slots:
name : <parameter>
cpl : (#<class <parameter>> #<class <object>> #<class <top>>)
direct-supers: (#<class <object>>)
accessors : ((filter . #<slot-accessor <parameter>.filter 0 :filter>) (s
slots : ((filter :init-keyword :filter :init-value #f) (setter) (get
direct-slots: ((filter :init-keyword :filter :init-value #f) (setter) (get
num-instance-slots: 5
direct-subclasses: ()
direct-methods: (#<method (parameter-observer-delete! <parameter> <top>)> #<
initargs : (:name <parameter> :supers () :slots ((filter :init-keyword
defined-modules: (#<module gauche.parameter>)
redefined : #f
category : scheme
- お、CLOSのオブジェクトなんだな。すると
object-applyで値がでてくるようになってるのかな。
*** 22.7.2 make-parameter手続きでパラメータを生成する
- 特になし。
** 22.8 大域変数と比較したパラメータの利点
- これは便利そうだ。
*** 22.8.1 パラメータはスレッドローカル
- Common Lispではスレッド関係は仕様外。aclではス
ペシャル変数がスレッドローカルだったかな。
*** 22.8.2 parameterizeでダイナミックスコープを実現する
- あ、この例をきっかけにダイナミックスコープにつ
ついて整理がついたかもしれない。
ダイナミックスコープの説明でわからないのは
「実行時に決まる」というところ。まあ、ここの説明もそう
なんですが、

(define y (make-parameter 0))
(define (bar)
(print (y)))
(parameterize ((y 3))
(bar))

というのの「実行時」というのがよくわからなくなっ
ちゃうのです。だって実行しなくても、このソース
を見れば、barが3を出力することはわかるから。そ
うすると「評価時」に言葉を変えればわかるかとい
うと、評価時に環境がつくられたりバインドがつく
られたりするのはレキシカル変数だって同じわけで
すね。だから「評価時に決まる」ということはレキ
シカル/ダイナミック双方に適用されるのでよくわか
らなくなってしまう。
- なのでより誤解のない言明は、どちらも評価時に決ま
るわけだが、評価したときの環境につくられる束縛の
機構が違うということであり、束縛の機構には、
bindingの変更(作成)とbindingの参照があり、レキシ
カルの場合はその関数定義が記述されているところの
文脈で構成される環境を参照/変更し(続け)(closure)、
ダイナミックの場合はその関数を呼出しが記述されて
いるところの文脈で構成される環境を参照/変更する
ということ。
- まあ、ここで環境という言葉で呼んでいるものが単一
系統のものなのか、それともCommon Lispのようにレ
キシカルとダイナミックで個別系統があるか、という
のもあるのですが。
- おそらくこのようなことを簡明に表現するために
「実行時に決まる」という表現があると思うのです
が、個人的には今までひっかかってました。
- なんでひっかかっていたのかを考えてみると、
Common Lispだと細かくいじることができて、

(setq x 'global)
(print x)
(let ((x 'lexical))
(print x)
(let ((x 'dynamic))
(declare (special x))
(print x)
(let ((x 'dynamic-scoping))
(declare (special x))
(print x)
(let ((x 'lexical-scoping))
(print x)
(locally (declare (special x))
(print x))))))
(print x)

はprintだけでいうと

GLOBAL
LEXICAL
DYNAMIC
DYNAMIC-SCOPING
LEXICAL-SCOPING
DYNAMIC-SCOPING
GLOBAL

になります。これはダイナミックもレキシカルも混在
してスコーピングが可能という側面を説明する例です
ね。

ちなみに、global envrironmentはvariablesに関して
はdynamicです。

global environmentがdynamicなのでtop-levelで作成
した関数はクロージャをつくらないですね。レキシカ
ルの文脈に入ればクロージャを作ります。その例です。

CL-USER: (defun hoge ()
unbound-var)
HOGE
CL-USER: (inspect 'unbound-var)
A NEW The symbol UNBOUND-VAR @ #x100120246b
which is an INTERNAL symbol in the COMMON-LISP-USER package
0 type ---------> Bit field: #x0b
1 flags --------> Bit field: #x00
2 package ------> The COMMON-LISP-USER package
3 value --------> ..unbound..
4 function -----> ..funbound..
5 hash ---------> Bit field: #x885663b0
6 name ---------> A simple-string (11) "UNBOUND-VAR"
7 plist --------> The symbol NIL
CL-USER: (inspect 'hoge)
A NEW The symbol HOGE @ #x100112ec2b
which is an INTERNAL symbol in the COMMON-LISP-USER package
0 type ---------> Bit field: #x0b
1 flags --------> Bit field: #x00
2 package ------> The COMMON-LISP-USER package
3 value --------> ..unbound..
4 function -----> #<Interpreted Function HOGE>
5 hash ---------> Bit field: #x2c7a4069
6 name ---------> A simple-string (4) "HOGE"
7 plist --------> The symbol NIL
[1i] CL-USER: :pop
CL-USER: (let ((unbound-var 0))
(defun piyo ()
unbound-var))
PIYO
CL-USER: (inspect 'piyo)
A NEW The symbol PIYO @ #x10012f223b
which is an INTERNAL symbol in the COMMON-LISP-USER package
0 type ---------> Bit field: #x0b
1 flags --------> Bit field: #x00
2 package ------> The COMMON-LISP-USER package
3 value --------> ..unbound..
4 function -----> #<Interpreted Closure PIYO>
5 hash ---------> Bit field: #xddb2781f
6 name ---------> A simple-string (4) "PIYO"
7 plist --------> The symbol NIL
[1i] CL-USER: :pop
CL-USER: (setq unbound-var 10)
10
CL-USER: (hoge)
10
CL-USER: (piyo)
0
CL-USER:

というようにダイナミックもいろいろ仕組みがありえ
るものなので、「実行時に決まる」ということで代表
してしまうことに引っかかりがあったのだと思います。
*** 22.8.3 ダイナミックスコープはどんなときに便利か?
- うーん。自分はこの「時間的な局所性」という表現
も引っ掛かりがある。
- 個人的にしっくりくるのは、「関数どもについて、そ
れが含む変数について、その参照/変更先を関数呼出し
が記述されいてるところの文脈の環境にする」という感じ。
ただし、ここでいう変数が何であって環境が何であって、
参照と変更がいっしょくたんなのか個別制御なのかは言
語によりますが。
- 「時間的な局所性」になんで引っ掛りがあるのか考え
てみる。

(let ((x 0))
(hoge x)
...)

というのも(このコードはScheme)、まずクロージャを
let 本体で作らなければ、このスコープ自体は、実質
的に時間的な局所性がある。そして、多くの場合、関
数はクロージャとしてではなく状態をもたずに使うの
で、ここでxを渡してhogeを利用するということも
「時間的な局所性」というもののある種の実現と思え
るからだ。なのでダイナミックの特徴として時間的局
所性の実現と言われても、犬を説明するのに4本足で
歩くと言われても満足しないのと同じ感じがしてしま
う。心が狭いのか。。。
*** 22.8.4 フィルタ手続きやオブザーバ手続きが使える
- これ、便利そうだ。
*** 22.8.5 パラメータとマクロを使ってwith-dbを書く
- 特になし。
** 22.9 DBI/DBDインターフェイス
- 特になし。
** 22.10 RDBMを使ったスケジュールデータベース
- 特になし。
*** 22.10.1 dbiモジュールの読み込み
- 特になし。
*** 22.10.2 データベースへの接続
- 特になし。
*** 22.10.3 データベースを閉じる
- 特になし。
*** 22.10.4 with-dbをRDBMSを使うように書き直す
- 特になし。
*** 22.10.5 SQLの実行
- 特になし。
*** 22.10.6 スケジュールデータベースの初期化
- 特になし。
*** 22.10.7 schedule手続き
- 特になし。
*** 22.10.8 予定の一覧表示
- 特になし。
*** 22.10.9 予定の検索
- 特になし。
*** 22.10.10 予定の検索と表示
- cdarをcadrとタイポして、デバッグに手間取った。
#?=が役に立った。
*** 22.10.11 予定の登録、削除
- 特になし。

この章、おもしろかったし、ためになった。

こつこつ。

0 件のコメント: