ラベル Scheme の投稿を表示しています。 すべての投稿を表示
ラベル Scheme の投稿を表示しています。 すべての投稿を表示

2009年7月4日土曜日

【フムフム本】27章 Kahuaアプリケーションを書こう


* 27章 Kahuaアプリケーションを書こう
** 27.1 Kahuaとは?
- 特になし。
*** 27.1.1 継続渡しスタイル(CPS)でのプログラミング
- 特になし。
*** 27.1.2 基本データ形式はS式
- 特になし。
*** 27.1.3 オブジェクトデータベース
- おお。AllegroCacheみたいだ。
*** 27.1.4 動的でインクリメンタルな開発
- 便利そう。
*** 27.1.5 汎用アプリケーションサーバ
- この部分、興味深い。
*** 27.1.6 オープンソース
- 特になし。
** 27.2 Kahuaを準備する
- 特になし。
*** 27.2.1 インストール
- 付録にしたがってインストール済み。
*** 27.2.2 サイトバンドルの作成
- 付録にしたがって作成済み。
*** 27.2.3 Kahuaを起動する
- サブシェルで起動してみる。動いた。
*** 27.2.4 アプリケーションの雛形を生成する
- shellじゃなくてgosh上でできるといいかも。
*** 27.2.5 雛形をインストールして実行する
- なるほど。siteは公開サイトで、そこにapplication
をインストールするスタイルなのか。
- app-serversは通常時はread-onlyなのか。
- あり? 503 service unavailableだ。どこでミスっ
たかな。
- app-serversをlambda booksに戻してreloadすると動く。
- :run-by-defaultを:rub-by-defaultとtypoしてた。
- reloadして、、、、動いた。めでたい。
** 27.3 Kahuaアプリケーションの構造
- 特になし。
*** 27.3.1 アプリケーション名、エントリとURL
- 継続がRESTfull。いい感じ。
*** 27.3.2 define-entryによる名前つきエントリの定義
- 特になし。
*** 27.3.3 entry-lambdaと無名エントリ
- 特になし。
*** 27.3.4 デフォルトエントリの登録
- 特になし。
** 27.4 スケジュール管理アプリケーションをKahua化する(1)-表示-
- 特になし。
*** 27.4.1 高階タグ手続き
- 高階タグ、higher order tags、面白い。タグ(手続
き)を入力したり、タグ(手続き)を返したりするタグ
(手続き)。
*** 27.4.2 ページテンプレート
- idでひっかけるのか。classまで拡張すれば
microformatもいけるかも。
- うーん。どうもkahua-adminでのupdateが効かないみ
たい。。。あ、もしかしてアプリのソースをいじって
るんだから、再インストールが必要なのかも。

schedule $ make
make: `all' に対して行うべき事はありません.
schedule $ make check
rm -f test/test.log
cd test; /usr/local/bin/gosh -I/usr/local/kahua/lib/kahua ./test.scm > test.log
Testing schedule ... passed.
schedule $ make install
for f in schedule/schedule.kahua schedule/version.kahua; do \
/usr/local/kahua/bin/kahua-install -S /home/aka/local/var/kahua/site -t script $f;\
done
for f in schedule/schedule.css; do \
/usr/local/kahua/bin/kahua-install -S /home/aka/local/var/kahua/site -t static --no-overwrite $f;\
done
WARNING: target file /home/aka/local/var/kahua/site/static/schedule/schedule.css exists, and not to be overwritten.
for f in schedule.scm; do \
/usr/local/kahua/bin/kahua-install -S /home/aka/local/var/kahua/site -t plugin -r $f plugins/$f;\
done
for f in page.xml; do \
/usr/local/kahua/bin/kahua-install -S /home/aka/local/var/kahua/site -t template -r schedule/$f templates/$f;\
done
================================================================================

Please edit app-servers in the Kahua working directory to add
"schedule" entry.

(schedule :arguments () :run-by-default 1)

================================================================================
schedule $

- この後にadmin でupdate scheduleしたら、、、動い
た!
- これ、siteの中のschedule.kahuaをいじるべきなの
かなぁ。考えてみる。おそらく、ホスト可搬性を持
ちたいときはapplicationでちゃんとやって、REPLちっ
くになりたいときは直接いじるってことじゃないだ
ろうか。
*** 27.4.3 (欠番)
*** 27.4.4 URLにょる日付の移動
- KahuaはRESTfullだな。
*** 27.4.5 名前つきエントリへのリンク
- お、ブラウザにスタックトレースがでるだな。デバッ
グ。
** 27.5 スケジュール管理アプリケーションをKahua化する(2)-編集と保存-
- ここの時点で、2009-07-04T12:40。Shibuya.lispま
でに終わるのか?
*** 27.5.1 Kahuaオブジェクトデータベースと永続クラス
- おお、保存できる。さわりをいじってみただけだが、
これは遊べそう。AllegroCacheと比較してみるのもいいかも。
** 27.6 スケジュール管理アプリケーションをKahua化する(3)-全景-
- 特になし。


読了。

おお、ただいま13:00。渋谷に行こう!

【フムフム本】付録C Kahuaインストール


* 付録C Kahuaインストール
- 頭痛が酷い。。。
- メモを取りながら。
** C.1 準備
- 環境確認。

scheme $ gosh -V
Gauche scheme interpreter, version 0.8.14 [utf-8,pthreads]

scheme $ getconf GNU_LIBPTHREAD_VERSION
NPTL 2.8.90

scheme $ uname -a
Linux adonis 2.6.27-14-generic #1 SMP Wed Apr 15 19:29:46 UTC 2009 x86_64 GNU/Linux

scheme $

- いけるかな?

scheme $ which make
/usr/bin/make

scheme $ which autoconf

- autoconfがいない。調査してインストールする。

scheme $ aptitude search autoconf
p autoconf - automatic configure script builder
p autoconf-archive - The Autoconf Macro Archive
p autoconf-doc - automatic configure script builder documen
p autoconf2.13 - automatic configure script builder (obsole

scheme $ aptitude show autoconf
パッケージ: autoconf
状態: インストールされていません
バージョン: 2.61-7ubuntu1
優先度: 任意
セクション: devel
メンテナ: Ubuntu Core Developers
展開サイズ: 1716k
依存: perl (> 5.005), m4 (>= 1.4.8), debianutils (>= 1.8)
推奨: automake | automaken
提案: autoconf2.13, autobook, autoconf-archive, gnu-standards, autoconf-doc,
libtool, gettext
競合: autoconf2.13 (< 2.13-47), gettext (< 0.10.39)
説明: automatic configure script builder
The standard for FSF source packages. This is only useful if you write your
own programs or if you extensively modify other people's programs.

For an extensive library of additional Autoconf macros, install the
`autoconf-archive' package. For a book that explains how to use Autoconf,
Automake, and Libtool in conjunction, install the `autobook' package.

The Debian project regards the full documentation for autoconf to be non-free,
so it is not included in Debian. Nevertheless, the non-free distribution that
accompanies Debian includes the manual in its `autoconf-doc' package.

This version of autoconf is not compatible with scripts meant for Autoconf 2.13
or earlier. If you need support for such scripts, you must also install the
autoconf2.13 package.

scheme $ sudo aptitude -s install autoconf
[sudo] password for aka:
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
拡張状態情報を読み込んでいます
パッケージの状態を初期化しています... 完了
以下の新規パッケージがインストールされます:
autoconf automake{a} autotools-dev{a} m4{a}
0 個のパッケージを更新、 4 個を新たにインストール、 0 個を削除予定、14 個が更新されていない。
1294kB のアーカイブを取得する必要があります。 展開後に 4243kB のディスク領域が新たに消費されます。
先に進みますか? [Y/n/?] Y
パッケージのダウンロード・インストール・削除をおこないます。

scheme $ sudo aptitude install autoconf
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
拡張状態情報を読み込んでいます
パッケージの状態を初期化しています... 完了
以下の新規パッケージがインストールされます:
autoconf automake{a} autotools-dev{a} m4{a}
0 個のパッケージを更新、 4 個を新たにインストール、 0 個を削除予定、14 個が更新されていない。
1294kB のアーカイブを取得する必要があります。 展開後に 4243kB のディスク領域が新たに消費されます。
先に進みますか? [Y/n/?] Y
拡張状態情報を書き込んでいます... 完了
取得:1 http://jp.archive.ubuntu.com intrepid/main m4 1.4.11-1 [263kB]
取得:2 http://jp.archive.ubuntu.com intrepid/main autoconf 2.61-7ubuntu1 [449kB]
取得:3 http://jp.archive.ubuntu.com intrepid/main autotools-dev 20080123.1 [62.6kB]
取得:4 http://jp.archive.ubuntu.com intrepid/main automake 1:1.10.1-3 [519kB]
1294kB を 0s 秒でダウンロードしました (2466kB/s)
debconf: フロントエンドの初期化に失敗しました: Dialog
debconf: (Dialog フロントエンドはダムターミナル、emacs のシェルバッファ、もしくはユーザが制御しているターミナルではない場合には動作しません。)
debconf: フロントエンドをフォールバックします: Readline
未選択パッケージ m4 を選択しています。
(データベースを読み込んでいます ... 現在 173292 個のファイルとディレクトリがインストールされています。)
(.../archives/m4_1.4.11-1_amd64.deb から) m4 を展開しています...
未選択パッケージ autoconf を選択しています。
(.../autoconf_2.61-7ubuntu1_all.deb から) autoconf を展開しています...
未選択パッケージ autotools-dev を選択しています。
(.../autotools-dev_20080123.1_all.deb から) autotools-dev を展開しています...
未選択パッケージ automake を選択しています。
(.../automake_1%3a1.10.1-3_all.deb から) automake を展開しています...
Processing triggers for man-db ...
Processing triggers for doc-base ...
Processing 1 added doc-base file(s)...
Registering documents with scrollkeeper...
m4 (1.4.11-1) を設定しています ...

autoconf (2.61-7ubuntu1) を設定しています ...

autotools-dev (20080123.1) を設定しています ...
automake (1:1.10.1-3) を設定しています ...

パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
拡張状態情報を読み込んでいます
パッケージの状態を初期化しています... 完了
拡張状態情報を書き込んでいます... 完了

scheme $ which autoconf
/usr/bin/autoconf

scheme $ autoconf --version
autoconf (GNU Autoconf) 2.61
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software. You may redistribute copies of it under the terms of
the GNU General Public License .
There is NO WARRANTY, to the extent permitted by law.

Written by David J. MacKenzie and Akim Demaille.

scheme $

- OK.

- 続いてKahuaのDLからインストールへ。

scheme $ cd /tmp

tmp $ curl -O http://www.kahua.org/download/kahua/Kahua-1.0.7.3.tgz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 485k 100 485k 0 0 128k 0 0:00:03 0:00:03 --:--:-- 129k

tmp $ cd ~/local/var

var $ mkdir kahua

var $ cd kahua

kahua $ tar xzf /tmp/Kahua-1.0.7.3.tgz

kahua $ cd Kahua-1.0.7.3/

Kahua-1.0.7.3 $ ./configure --prefix=/usr/local/kahua --with-site-bundle=$HOME/local/var/kahua/site
checking for gosh... /usr/local/bin/gosh
checking for gauche-config... /usr/local/bin/gauche-config
checking for gauche-package... /usr/local/bin/gauche-package
checking for gauche-install... /usr/local/bin/gauche-install
checking for gauche-cesconv... /usr/local/bin/gauche-cesconv
checking for a BSD-compatible install... /usr/bin/install -c
checking for makeinfo... makeinfo
checking for gzip... gzip
checking check Gauche version and thread type... seem good
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating doc/Modules/Makefile
config.status: creating cgi/Makefile
config.status: creating emacs/Makefile
config.status: creating plugins/Makefile
config.status: creating test/Makefile
=== configuring in examples (/home/aka/local/var/kahua/Kahua-1.0.7.3/examples)
configure: running /bin/bash ./configure --disable-option-checking '--prefix=/usr/local/kahua' '--with-site-bundle=/home/aka/local/var/kahua/site' --cache-file=/dev/null --srcdir=.
checking for gosh... /usr/local/bin/gosh
checking for gauche-config... /usr/local/bin/gauche-config
checking for gauche-package... /usr/local/bin/gauche-package
checking for gauche-install... /usr/local/bin/gauche-install
checking for gauche-cesconv... /usr/local/bin/gauche-cesconv
checking for a BSD-compatible install... /usr/bin/install -c
checking for makeinfo... makeinfo
checking for gzip... gzip
configure: creating ./config.status
config.status: creating Makefile

Kahua-1.0.7.3 $ make
cd src; make all
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/src' に入ります
/usr/local/bin/gosh ../src/make-script.scm "/usr/local/bin/gosh" "/usr/local/kahua/lib/kahua" kahua-spvr
/usr/local/bin/gosh ../src/make-script.scm "/usr/local/bin/gosh" "/usr/local/kahua/lib/kahua" kahua-admin
/usr/local/bin/gosh ../src/make-script.scm "/usr/local/bin/gosh" "/usr/local/kahua/lib/kahua" kahua-install
/usr/local/bin/gosh ../src/make-script.scm "/usr/local/bin/gosh" "/usr/local/kahua/lib/kahua" kahua-shell
/usr/local/bin/gosh ../src/make-script.scm "/usr/local/bin/gosh" "/usr/local/kahua/lib/kahua" kahua-httpd
/usr/local/bin/gosh ../src/make-script.scm "/usr/local/bin/gosh" "/usr/local/kahua/lib/kahua" kahua-dbutil
/usr/local/bin/gosh ../src/make-script.scm "/usr/local/bin/gosh" "/usr/local/kahua/lib/kahua" kahua-config
/usr/local/bin/gosh ../src/make-script.scm "/usr/local/bin/gosh" "/usr/local/kahua/lib/kahua" kahua-package
/usr/local/bin/gosh ../src/make-script.scm "/usr/local/bin/gosh" "/usr/local/kahua/lib/kahua" kahua-user
test ! -f kahua.conf || chmod +w kahua.conf
sed -e "s@##SOCKET_BASE_DIR##@/usr/local/kahua/tmp/kahua@" \
-e "s@##localstatedir##@/usr/local/kahua/var/kahua@" \
-e "s@##KAHUA_STATICDIR##@/usr/local/kahua/var/kahua/static@" \
kahua.conf.sample > kahua.conf
chmod -w kahua.conf
/usr/local/bin/gosh ./make-testconf.scm .. ..
test ! -f kahua/config.scm || chmod +w kahua/config.scm
sed -e "s@##sysconfdir##@/usr/local/kahua/etc/kahua@" \
-e "s@##localstatedir##@/usr/local/kahua/var/kahua@" \
-e "s@##SOCKET_BASE_DIR##@/usr/local/kahua/tmp/kahua@" \
-e "s@##KAHUA_STATICDIR##@/usr/local/kahua/var/kahua/static@" \
-e "s@##package##@kahua@" \
-e "s@##KAHUA_VERSION##@1.0.7.3@" \
kahua/config.scm.in > kahua/config.scm
chmod -w kahua/config.scm
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/src' から出ます
cd cgi; make all
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/cgi' に入ります
../cgi/fix-shebang.sh "/usr/local/bin/gosh" "/usr/local/kahua/lib/kahua" "/usr/local/kahua/var/kahua" \
"/usr/local/kahua/tmp/kahua" "/usr/local/kahua/var/kahua/cgilog" no kahua.cgi.in kahua.cgi
chmod -w kahua.cgi
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/cgi' から出ます
cd emacs; make all
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/emacs' に入ります
sed "s@##bindir##@/usr/local/kahua/bin@" kahua.el.in > kahua.el.tmp && \
mv kahua.el.tmp kahua.el
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/emacs' から出ます
cd plugins; make all
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/plugins' に入ります
make[1]: `all' に対して行うべき事はありません.
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/plugins' から出ます
cd examples; make all
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/examples' に入ります
make[1]: `all' に対して行うべき事はありません.
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/examples' から出ます
cd test; make all
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/test' に入ります
make[1]: `all' に対して行うべき事はありません.
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/test' から出ます
cd doc/Modules; make all
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/doc/Modules' に入ります
/usr/local/bin/gosh ./extract -en -o kahua-refe.texi kahua-ref.texi
if test Xmakeinfo != X -a Xgzip != X; then \
makeinfo --no-warn kahua-refe.texi; \
rm -rf kahua-refe.info*.gz; \
gzip kahua-refe.info; \
fi
/usr/local/bin/gosh ./extract -jp -o kahua-refj.texi kahua-ref.texi
if test Xmakeinfo != X -a Xgzip != X; then \
makeinfo --no-warn kahua-refj.texi; \
rm -rf kahua-refj.info*.gz; \
gzip kahua-refj.info; \
fi
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/doc/Modules' から出ます

Kahua-1.0.7.3 $ make -s check
Testing kahua.test.xml ... passed.
Testing persistence/efs (efs:_tmpefs) ... passed.
Testing index slots (efs) ... passed.
Testing rollback ... passed.
Testing entry-method ... passed.
Testing user ... passed.
Testing kahua.config ... passed.
Testing gsid ... passed.
Testing kahua.session ... passed.
Testing kahua.partcont ... passed.
Testing kahua.server ... passed.
Testing kahua.dbm ... passed.
Testing worker scripts ... passed.
Testing redirect/cont ... passed.
Testing define-method-rule ... passed.
Testing kahua-call-with-current-context ... passed.
Testing lambdabooks test scripts ... passed.
Testing wiki-iki test scripts ... passed.
Testing nqueen test scripts ... passed.
Testing foldlist test scripts ... passed.
Testing supervisor script ... passed.
Testing kahua-httpd script ... passed.
Testing kahua-admin script ... passed.
Testing developer ... passed.
Testing kahua-shell script ... passed.
Testing sandbox test ... passed.
Testing plugin manager ... passed.
Testing query plugin ... passed.

Kahua-1.0.7.3 $ sudo make install
cd src; make install
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/src' に入ります
/usr/local/bin/gauche-install -m 0755 -d /usr/local/kahua/etc/kahua /usr/local/kahua/libexec
/usr/local/bin/gauche-install -m 0775 -d /usr/local/kahua/var/kahua
/usr/local/bin/gauche-install -m 0770 -d /usr/local/kahua/var/kahua/checkout /usr/local/kahua/var/kahua/logs
/usr/local/bin/gauche-install -m 0770 -d /usr/local/kahua/tmp/kahua /usr/local/kahua/var/kahua/tmp
/usr/local/bin/gauche-install -m 0444 -T /usr/local/kahua/lib/kahua -S . kahua-spvr.scm kahua-admin.scm kahua-install.scm kahua-shell.scm kahua-server.scm kahua-keyserv.scm kahua-httpd.scm kahua-dbutil.scm kahua-config.scm kahua-package.scm kahua-user.scm kahua.scm kahua/gsid.scm kahua/persistence.scm kahua/user.scm kahua/config.scm kahua/session.scm kahua/server.scm kahua/developer.scm kahua/partcont.scm kahua/elem.scm kahua/util.scm kahua/test/xml.scm kahua/test/worker.scm kahua/sandbox.scm kahua/plugin.scm kahua/pdf.scm kahua/pdf/interp.scm kahua/pdf/main.scm kahua/pdf/monad.scm kahua/pdf/srfi-48-draft.scm kahua/pdf/srfi-48.scm kahua/pdf/state.scm kahua/pdf/typeset.scm kahua/pdf/util.scm kahua/error-report.scm kahua/thread-pool.scm kahua/persistence/fs.scm kahua/persistence/efs.scm kahua/persistence/dbi.scm kahua/persistence/mysql.scm kahua/persistence/postgresql.scm kahua/protocol/worker.scm kahua/protocol/http.scm kahua/xml-template.scm
/usr/local/bin/gauche-install -m 0555 -T /usr/local/kahua/bin kahua-spvr kahua-admin kahua-install kahua-shell kahua-httpd kahua-dbutil kahua-config kahua-package kahua-user
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/src' から出ます
cd cgi; make install
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/cgi' に入ります
if test "/usr/local/kahua/libexec/kahua" != ""; then \
/usr/local/bin/gauche-install -m 0755 -d /usr/local/kahua/libexec/kahua; \
for f in kahua.cgi ; do \
/usr/local/bin/gauche-install -m 0555 $f /usr/local/kahua/libexec/kahua/$f; \
done; \
fi; \
if test "/usr/local/kahua/var/kahua/cgilog" != ""; then \
/usr/local/bin/gauche-install -m 0750 -d /usr/local/kahua/var/kahua/cgilog; \
fi; \

make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/cgi' から出ます
cd plugins; make install
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/plugins' に入ります
/usr/local/bin/gauche-install -m 0775 -d /usr/local/kahua/var/kahua/plugins
/usr/local/bin/gauche-install -m 444 -T /usr/local/kahua/var/kahua/plugins -S . allow-module.scm sendmail.scm query.scm fileio.scm
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/plugins' から出ます

Kahua-1.0.7.3 $ PARH=/usr/local/kahua/bin:$PATH

Kahua-1.0.7.3 $ which kahua-package
/usr/local/kahua/bin/kahua-package

Kahua-1.0.7.3 $ kahua-package create ~/local/var/kahua/site

Kahua-1.0.7.3 $ find ~/local/var/kahua/site
/home/aka/local/var/kahua/site
/home/aka/local/var/kahua/site/static
/home/aka/local/var/kahua/site/plugins
/home/aka/local/var/kahua/site/logs
/home/aka/local/var/kahua/site/socket
/home/aka/local/var/kahua/site/app-servers
/home/aka/local/var/kahua/site/tmp
/home/aka/local/var/kahua/site/database
/home/aka/local/var/kahua/site/templates
/home/aka/local/var/kahua/site/etc
/home/aka/local/var/kahua/site/etc/kahua.conf
/home/aka/local/var/kahua/site/etc/user.conf
/home/aka/local/var/kahua/site/run
/home/aka/local/var/kahua/site/app

Kahua-1.0.7.3 $ rm ~/local/var/kahua/site/app-servers

Kahua-1.0.7.3 $ make install-examples
cd examples; make install-examples
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/examples' に入ります
/usr/local/kahua/bin/kahua-install -S /home/aka/local/var/kahua/site -t script foldlist/foldlist.kahua lambdabooks/lambdabooks.kahua lambdabooks/lister.kahua lambdabooks/login.kahua lambdabooks/book.kahua lambdabooks/review.kahua lambdabooks/partner.kahua lambdabooks/useradmin.kahua wiki-iki/wiki-iki.kahua login/login.kahua nqueen/nqueen.kahua lazy-nqueen/lazy-nqueen.kahua lambdacalcul/lambdacalcul.kahua
/usr/local/kahua/bin/kahua-install -S /home/aka/local/var/kahua/site -t static lambdabooks/images/lambda-books-logo.png lambdabooks/images/separator.jpg wiki-iki/wiki-iki.css wiki-iki/images/wiki-iki.png
/usr/local/kahua/bin/kahua-install -S /home/aka/local/var/kahua/site -t base -r app-servers --no-overwrite app-servers.sample
/usr/local/kahua/bin/kahua-install -S /home/aka/local/var/kahua/site -t plugin -r allow-module.scm --no-overwrite ../plugins/allow-module.scm
/usr/local/bin/gosh -I. -I/usr/local/kahua/lib/kahua ./lambdabooks.init -S /home/aka/local/var/kahua/site
make[1]: ディレクトリ `/home/aka/local/var/kahua/Kahua-1.0.7.3/examples' から出ます

Kahua-1.0.7.3 $ kahua-spvr -S ~/local/var/kahua/site -H 8088

- お、lambda booksだ!
- Gauche0.8.14とKahua-1.0.7.3でも、本の通りでイン
ストールできた。

** C.4 Emacsの環境
- ~/local/lib/elispに入れる。
Kahua-1.0.7.3 $ cd emacs

emacs $ cp kahua.el ~/local/lib/elisp/

emacs $

- emacs初期化ファイルに追記。
(when (eq system-type 'gnu/linux)
(require 'kahua)
(setq auto-mode-alist
(append '(("\\.kahua$" . kahua-mode)) auto-mode-alist)))
- OK.

こつこつ。

2009年7月3日金曜日

【フムフム本】26章 継続渡しによるWebアプリケーション


* 26章 継続渡しによるWebアプリケーション
- おお、sessionベースとcontinuationベースの比較が
できるのか! 贅沢。
** 26.1 簡易HTTPサーバ
*** 26.1.1 ネットワークとソケット
- う、名前付きletが読めない。ためす。
gosh> (let fn-name ((x 1))
x)
1
gosh> (let fn-name ((x 1) (y 2))
(list x y))
(1 2)
gosh> (let fn-name ((n 4))
(if (<= n 1)
1
(+ (fn-name (- n 1)) (fn-name (- n 2)))))
5
gosh>
- 理解した。
*** 26.1.2 HTTPリクエストの解析
- うーん。Gaucheの正規表現リテラルがscheme-modeも
paredit-modeも破綻させてしまうことがある。
modeが対応していないのがわるいんだけど。。。
これらmodeが無いとまともにコードが書けない自分で
あることも事実。
- list*。仕様を忘れた。ためす。
gosh> (list*)
()
gosh> (list* 1)
1
gosh> (list* 1 2)
(1 . 2)
gosh> (list* '())
()
gosh> (list* 1 2 3)
(1 2 . 3)
gosh> (list* 1 '(2 3))
(1 2 3)
gosh>
- consの可変長引数拡張。
*** 26.1.3 HTTPレスポンスの生成
- 特になし。
*** 26.1.4 コンテンツの生成
- 特になし。
*** 26.1.5 ここまでのまとめ
- お、動いた。
** 26.2 アプリケーションの仕様
- 特になし。
** 26.3 セッションオブジェクトによる状態管理
- 特になし。
*** 26.3.1 プレーヤーの移動と表示
- さあ、ここまで書いたのが動かない。どこでタイポ
したか。。。このデバッグは結構大変かも。
- デバッグ実況してみる。
- 次のエラー。ブラウザはロード中のまま。
*** ERROR: attempt to accept from a closed socket: #<socket (closed)>
Stack Trace:
_______________________________________
0 (socket-accept server-sock)
At line 1680 of "(stdin)"
- render-contentに#?=をちょこちょこしこむ。異常は
なさげ。
- render-contentを以前のものに戻す。正常に動作す
る。やはりrender-contentのようだ。
- 新しいrender-contentのHTML構成部を"hoge"に変更
してみる。動いた。HTML構成部らしい。
- render-selector以外の部分を戻して実行。
render-selectorをmapするところはlambdaにて簡易
な処理にしておく。これはerror。
- locationまわりで異常があるのかと思い、location、
car location, cdr locationを出力させるが問題な
し。
- html:ulのところをコメントアウトして実行。これは
OK。かなり限定できてきた。render-selectorの中。
- render-selectorのhtml:aの中のcontentでおこって
いるようだ。あ! get-directionか?
- get-directionの最後のdirの入力忘れだった。orz
- まあ、Unit Testつくりながら写経しているわけじゃ
ないからしかたなし。
- 動いた。めでたし。
*** 26.3.2 Backボタン問題
- 特になし。
**** セッション管理のセキュリティ
- 特になし。
** 26.4 継続渡しスタイルによる状態管理
- おお、ばすばすhashにクロージャを入れていくのか。
呼び出し毎に新しいクロージャを生成してるよね、こ
れ。。。なんというか、ファイルのセーブが実は複製
であり全セーブ履歴を保持しているファイルシステム
みたい。継続渡しというよりクロージャ祭りの方がイ
メージにあっているかも。私の理解が間違っているのか。
*** 26.4.1 抽象化
- a/cont。見事だなぁ。
** 26.5 継続渡しスタイルの特徴
- 特になし。
** 26.6 まとめ
- 特になし。

継続渡しによるWebアプリケーションを理解できたかもしれない。だとしたら嬉しい。
結構なタイピング量だった。手首がいたい。

こつこつ。

【フムフム本】25章 スケジュール管理アプリケーション


* 25章 スケジュール管理アプリケーション
- 特になし。
** 25.1 カレンダーを作ろう
- iota。今さらだが、なんでιという命名なんだろ?
** 25.2 カレンダーをtable表示してみよう
- 特になし。
- 実践Common LispやAnsi Common Lispにもあったが、
HTMLタグをリストで構築して操作するのはとても楽し
い。その反面、HTMLとCSSという組み合わせがデータ
ビジュアリゼーション言語として整理が悪いため描画
に関するコードのモジュール性が低くなっているのが
やはり気になる。それをadhocに解消するにはHTMLテ
ンプレートの採用などがあるように思う。しかしそれ
はやはりadhocにすぎないだろう。
- でも、リストでHTMLをいろいろいじるのはなんだか
楽しい。
** 25.3 CGIスクリプトにして動かしてみよう
- 特になし。
** 25.4 別の月に移動可能にしてみよう
- 特になし。
** 25.5 予定を保存させてみよう
- 特になし。
** 25.6 使い勝手を改良してみよう
- 特になし。
*** 25.6.1 予定のある日に色をつける
- 特になし。
*** 25.6.2 予定表示と入力の分離
- 特になし。
*** 25.6.3 予定の消去
- 特になし。

こつこつ。

2009年7月2日木曜日

【フムフム本】24章 GaucheでCGIスクリプトを書いてみる


* 24章 GaucheでCGIスクリプトを書いてみる
** 24.1 SchemeスクリプトをCGIスクリプトとして実行する
- 特になし。
** 24.2 最も簡単なCGIスクリプト
- hello.cgiの設置場所。Ubuntu 8.10では、/var/www/
ではなく、/usr/lib/cgi-bin/に置くと実行できた。

http://127.0.0.1/cgi-bin/hello.cgi

** 24.3 www.cgiモジュールを利用する
- 実は、CGIスクリプトってほとんど書いたことがない。
楽しい。
*** 24.3.1 cgi-main手続きでCGIスクリプトを簡単にする
- 特になし。
*** 24.3.2 cgi-header手続きでHTTPヘッダ部を出力する
- 特になし。
*** 24.3.3 html-doctype手続きでHTML DOCTYPEを出力する
- 特になし。
*** 24.3.4 text.html-liteモジュールでHTML要素のリストを構築する
- 特になし。
*** 24.3.5 CGIパラメータを受け取る
- 特になし。
** 24.4 www.cgi.test
- sxml.xml-testが便利そう。いつか見てみたい。

もしかしたらShibuya.lisp TT3までに読み終わるかも?

こつこつ。

【フムフム本】23章 日付と時刻


* 23章 日付と時刻
** 23.1 現在の日付を得る
** 23.2 型の値を生成する
** 23.3 ある日付を与えてその月の最初の日を求める
** 23.4 次の月、前の月を求める
** 23.5 ユリウス日と改訂ユリウス日を求める
** 23.6 日数(= 日付の差)を計算する
** 23.7 その月の日数を求める
** 23.8 ある日付を与えてその日の曜日を得る
** 23.9 ある日付を与えてその月のカレンダーを生成する。
** 23.9.1 月の最初の日までの曜日を埋める
** 23.9.1 先頭を埋めた日付のリストを作る
- この章、特になし。
- ただし、日付と時刻とカレンダーの取扱いは業務シス
テムの基礎なので、このようにまとまっているとあ
りがたい。

こつこつ。

【フムフム本】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 予定の登録、削除
- 特になし。

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

こつこつ。

2009年7月1日水曜日

【フムフム本】21章 デバッグ


* 21章 デバッグ
- 特になし。
** 21.1 基本的な調査
- 特になし。
** コラム syntaxオブジェクト
- Common Lispだと、symbol-functionでcellをコピーす
る。
** 21.2 #?=(debug-print)
- 特になし。
*** 21.2.1 リーダ構文の調査
- sharpsign macroみたいなものを特殊リーダ構文と呼
ぶらしい。
*** 21.2.2 デバッグプリントは末尾呼び出しを破壊する
- 特になし。
*** 21.2.3 debug-print-width
- 特になし。
** 21.3 apropos
- 特になし。
** 21.4 d(describe)
- 特になし。
** 21.5 オブジェクトの調査
- 特になし。
*** 21.5.1 refとslot-ref
- 特になし。
*** 21.5.2 class-of
- 特になし。
*** 21.5.3 class-slots
- 特になし。
*** 21.5.4 class-direct-supers
- 特になし。
** 21.6 モジュールの調査
- 特になし。
*** 21.6.1 all-modules
- 特になし。
*** 21.6.2 current-module
- 特になし。
*** 21.6.3 find-module
- 特になし。
*** 21.6.4 module-exports
- 特になし。
*** 21.6.5 reload
- 特になし。
** 21.7 マクロの調査
- 特になし。
*** 21.7.1 macroexpand/macroexpand-1
- 特になし。
*** 21.7.2 展開される環境と評価が実行される環境
- 特になし。

特になし、が多いですが、一応手を動かしてまじめに読んではいるんです。
Common Lispとの対比をコメントするのがやりきれなくなってはいます。

こつこつ。

【フムフム本】20章 モジュールシステム


* 20章 モジュールシステム
- そういえば、ちゃんとしたモジュールシステムをやっ
たことがない。Common LispのPackageはちょっと違
うような気がするし。
** 20.1 モジュールの例
- 特になし。
** 20.2 モジュールの作成
- 特になし。
*** 20.2.1 インターフェイスの定義
- 特になし。
*** 20.2.2 本体の定義
- あれ、なんかCommon Lispのpackageと似ているとこ
ろも多いな。モジュールシステムがこういうものな
らば、Common Lispのpackageもモジュールシステム
と言って差し支えなさそうだ。
*** 20.2.3 provideでファイルを登録
- 特になし。
** 20.3 モジュールの利用
- 特になし。
** コラム モジュールの読み込み対象となるパス
- 特になし。
** 20.4 モジュールの継承
- 特になし。
** 20.5 モジュールのテスト
- test-module、これはありがたい。

こつこつ。

【フムフム本】19章 継続


* 19章 継続
- 特になし。
** 19.1 制御の流れについての2つのモデル
- 寓話は理解できた。
** 19.2 Schemeによる継続渡しの表現
- process/break。nextに束縛されるのがクロージャで
bindingsも維持するんだな。
** 19.3 さらに継続を渡して
- 特になし。
** 19.4 call/cc
- 継続渡しよりもcall/ccの方がわかりやすい。
** コラム call-with-current-continuation
- 特になし。
** 19.5 大域脱出
- for-each-ext。誤植。
** 19.6 break/next 名前付きfor-each
- 特になし。
** 19.7 簡易な例外機構
- 特になし。
** 19.8 コルーチン
- 特になし。


継続は力なり。こつこつ。

【フムフム本】18章 構文の拡張


* 18章 構文の拡張
- Schemeではspecial operatorsという概念は使わずに、
構文と呼ぶようだ。すると具体的な構文に、意味(評
価時の仕様)が直接結合しているんだな。そこが分離
していて、あくまでstandard syntaxでしかない
Common Lispとは違いがあるな。
- と思ってページをめくったら、特殊形式と呼ぶここ
もあるとあった。うむむ。そうするとspecial
operatorsがとるspecial formの別名を構文と呼ぶの
かも? まあいいや。言葉遊びになっちゃうので。
** 18.1 手続きと構文
- 特になし。
** 18.2 必須構文
- ユーザが構文を定義する際に使うのがマクロ。
- Gaucheには、2種類のマクロがある。R5RSマクロと伝
統的マクロ。
** 18.3 パターンマッチによるマクロ
- おお、R5RSマクロってパターンマッチと置き換えその
ものなんだ。
*** コラム 詳細なエラー情報を表示したい
- 特になし。
** 18.4 マクロの健全性
- 健全さをシステムが保証するなら、安全は安全。
- 変数の衝突を自動的に回避する仕組みがどんなもの
が知りたかった。
** 18.5 マクロの使用例
- 特になし。
** 18.6 R5RSマクロの限界
- 特になし。
** 18.7 伝統的なマクロ
- 特になし。
** コラム なぜマクロではなくevalを使うとうまくいかないのか?
- 特になし。

こつこつ。

【フムフム本】17章 総称関数とオブジェクト


* 17章 総称関数とオブジェクト
- CLOS、久しくやってないので理解できないかも?
** 17.1 総称関数
- ふと、Schemeではdefine-setf-expanderとかがどう
なってるのかな、と思った。
** 17.2 コレクションとシーケンス
*** 17.2.1 コレクション
- お、もしかしてGaucheのコレクションは、ちゃんと
した?CLOSのクラスなのかも。そうだと便利だなぁ。
Common Lispは違う。。。
- group-collection。うーん、こういう手続きをつく
るという発想がすごい。視野を広く、発想を柔軟に
しなければ。
*** 17.2.2 シーケンス
- 特になし。
** 17.3 メソッド
- 特になし。
*** 17.3.1 メソッドの優先度
- Gaucheではクラスの最上流は<top>。
*** 17.3.2 next-method
- 特になし。
** 17.4 ユーザ定義型(クラスとインスタンス)
- やはり、Gaucheは組み込み型のクラスがちゃんと
CLOSで組まれているのか?期待。
*** 17.4.1 クラス定義
- 特になし。
*** 17.4.2 スロット定義
- 特になし。
*** 17.4.3 インスタンス生成
- 特になし。
*** 17.4.4 スロット値の参照と変更
- 特になし。
*** 17.4.5 インタンスの初期化
- 特になし。
*** 17.4.6 継承
- 特になし。
*** 17.4.7 スロットの保持
- う、「Gaucheでは<object>をCPLに持っていない(つ
まり、直接間接を問わずdefine-classで定義された
クラスを継承していない)クラスを継承することはで
きません。」残念。
- オブジェクト指向プログラミング言語に慣れてはい
ないのだが、このことを残念に思ったことは何回か
あった。スキルが低いからなのだろう。。。
** 17.5 メタオブジェクトプロトコル
- 特になし。
*** 17.5.1 メタクラスの作成
- そっか。別のメタクラスに属するクラス同士って
mix-inに使えるんだ。
*** 17.5.2 インスタンス化のカスタマイズ
- おもしろい。
*** 17.5.3 メソッド適用のカスタマイズ
- CLOSはやったことがあるが、MOPは不勉強だったので、
とても勉強になる。MOP使いこなせたら気持ちよさそ
うだなぁー。
** コラム すべてオブジェクトである(もしそれがお望みなら)
- 特になし。

こつこつ。

2009年6月30日火曜日

【フムフム本】16章 さまざまなデータ構造


* 16章 さまざまなデータ構造
- 特になし。
** 16.1 ベクタ
- 特になし。
*** 16.1.1 ベクタの由来
- うお。ベクタリテラル、クォートが必要なんだ。。。
なんでだろう。Schemeだから、合理的な理由があるん
だろうけど、思いつかない。ちなみにCommon Lispで
は不要。単なるsharpsign macro。
*** 16.1.2 アクセスと代入
- vectore-refをplaceにしてset!がちゃんと動いた。
gosh> (set! (vector-ref v 0) 100)
#<undef>
gosh> (vector-ref v 0)
100
gosh>
*** 16.1.3 ユニフォームベクタ
- 特になし。
** 16.2 ハッシュテーブルとツリーマップ
- ツリーマップはCommon Lisp標準ではないような。楽
しみ。
*** 16.2.1 ハッシュテーブルの作成
- ハッシュテーブルをつくるときの

gosh> (define table2 (make-hash-table 'string=?))

にて、string=?をquoteしてるのはなんでだろう?
手続きを渡すという意味ではいらんだろう。
やってみる。

gosh> (define table3 (make-hash-table string=?))
*** ERROR: unsupported hash type: #<subr string=?>
Stack Trace:
_______________________________________
0 (make-hash-table string=?)
At line 59 of "(stdin)"
gosh>
なるほど。シンボルからhash typeを特定するという
機構を内蔵しているからなんだろうな。
*** 16.2.2 データの登録と削除
- hash-table-push!。なるほどハッシュの個々の値は
スタックになっているのか。これはこれで便利かも。
*** 16.2.3 その他のアクセス手続き
- hash-table...。これらは総称関数を利用していない
ので、名前が冗長。elispやってるときはそんなに気
にならないんだけど、Schemeでは気になるな。
*** 16.2.4 ツリーマップ
- なるほどこれはこれで便利。Common Lisp標準にはな
かったはず。
** 16.3 ストリーム
- 遅延評価は、可能無限の実装なんだな。
- 特になし。

こつこつ。

【フムフム本】15章 テキストの構築


* 15章 テキストの構築
- 特になし。
** 15.1 木を用いたテキストの表現
- 特になし。
** 15.2 text.html-lite
- 実践Common Lispにもでてきたけど、S式にしちゃう
とHTML生成は楽だなぁ。
- あれ?Gaucheでは、ユーザがREPLで手続きを定義し
て、同名の手続きがあるモジュールをuseした場合、
もとのユーザ定義がイキになる?
** 15.3 SXML
*** 15.3.1 *TOP*要素
*** 15.3.2 *PI*要素
*** 15.3.3 XMLルート要素
*** 15.3.4 属性の表現
*** 15.3.5 SXMLの要素の記述
*** 15.3.6 SXMLからXMLを出力する。
*** 15.3.7 SXMLを扱う便利なモジュール
- 特になし。

こつこつ。

【フムフム本】14章 入出力


* 14章 入出力
** 14.1 入力
*** 14.1.1 read
- Gaucheにはreadがある。
*** 14.1.2 その他の入力手続き
- 特になし。
** 14.2 出力
- 特になし。
*** 14.2.1 オブジェクトの外部表現の出力
- 特になし。
*** 14.2.2 人が読むための出力
- format。~{~}とかはなさそうだ。
** 14.3 ポート
- 特になし。
*** 14.3.1 ファイルポート
- 特になし。
*** 14.3.2 文字列ポート
- 特になし。
- 練習問題
これは後程やろう。
*** 14.3.3 現在のポート
- current-input-port。Gaucheでは手続きでアクセス
するんだな。Common Lispではspecial変数にbindし
ている。
*** コラム 動的環境
- Gauche(またはScheme)のwith-input-from-portの実
装にもよるが、それを動的「環境」とまで呼ぶもの
なのかなぁ。つまり動的な振舞だけだとしたら、そ
れを環境と呼ぶべきかどうか、ということ。
- x: (accum n), o: (accum 5)
今までもいくつか誤植があったが、ここは初学者に
は痛いかも。
- 動的、ということを自分がちゃんと理解していない
ので、ここの記述がいまひとつ飲み込めない。
*** 14.3.4 ポートの操作
- port-fold。なるほど、mapやfold的に考えるという
視点にたてば、いろいろな用語や概念がでてくる。
必要は発明の母、というのは相対的。
*** 14.3.5 その他のポート
- 特になし。

こつこつ。

【フムフム本】13章 文字と文字列の処理


* 13章 文字と文字列の処理
** 13.1 文字
- 特になし。
** 13.2 文字列の基本操作
- 「文字列は本来変更不可能であるべき」の「本来」が
気になる。なんだろう?
** 13.3 文字列の作成
*** 13.3.1 連結して作る
- 特になし。
*** 13.3.2 オブジェクトを文字列に変換する
- 特になし。
*** 13.3.3 文字列補間
- 文字列補間ってsharpsign dipatch reader macro的実
装なんだな。
- いまさらながらだが、Schemeのシンボルってcase
sensitiveなんだな。
gosh> (eq? 'hoge 'HOGE)
#f
*** 13.3.4 プログラムの出力を文字列として得る
- with-output-to-string。この引数がthunkという心
は、with-output-to-stringがマクロなので、引数
が評価されるまえにwith-output-to-stringの支配下
に入るということでいいのかな。
** 13.4 文字列の操作
- 特になし。
*** 13.4.1 リストへの変換
- 特になし。
*** 13.4.2 文字コードの変換
- 特になし。
*** 13.4.3 文字列の分割と統合
- 特になし。
*** 13.4.4 文字列の比較
- 特になし。
** 13.5 文字集合
- 文字集合を表すオブジェクト、なるほど。文字集合
をオブジェクトとして捉えるところがおもしろい。
*** 13.5.1 文字集合についての述語
- 特になし。
*** 13.5.2 文字集合の用途
- 特になし。
*** 13.5.3 その他の文字集合手続き
- 特になし。
** 13.6 正規表現
- object-apply。これは秀逸なアイデアだな。。。
object-applyをCommon Lispでやるとなると結構大変
なような? 本質的にはevaluatorをいじるべきだから。
通常の括弧を別キャラクタに逃がした上で、
reader-macorで( -> (object-applyとしてやればい
けるかも。すべてdispatchすることになっちゃうけ
ど。
- うーん。object-apply、#/.../リテラル、regmatch
オブジェクトの連携がとてもきれい。

期せずして、Shibuya.lisp TT3までにはSchemeも楽しめるようになっているかもしれない。

こつこつ。

2009年6月29日月曜日

【フムフム本】12章 数値


* 12章 数値
** 12.1 数の表現
- お、定数としてのπは組み込みでは無いんだな。
** 12.2 数値についての述語
- class-of。Gaucheは、classに統一されていてtypeが
無いのかも? 先々分かるだろう。
** 12.3 正確数と不正確数
- 特になし。
** 12.4 桁の丸め
- 特になし。
** 12.5 数値の比較
- 特になし。
** 12.6 四則演算
- 特になし。
** 12.7 最大、最小
- 特になし。
** 12.8 超越関数
- 特になし。
** 12.9 平方根、乗数
- 特になし。
** 12.10 文字列変換と数値変換
- x->number。変換できないときは0というのは大丈夫
なのか。
** コラム 総称関数であることを確かめる
- 特になし。

こつこつ。

【フムフム本】11章 評価モデル


* 11章 評価モデル
** 11.1 置き換えモデル
*** 11.1.1 作用順序評価
*** 11.1.2 副作用
** 11.2 環境フレームモデル
- この章、特になし。
- レキシカルオンリーならモデルの理解は簡単。

ここで基礎をやって、これからいろいろ増していくのだろう。

こつこつ。

【フムフム本】10章 テストと例外処理


* 10章 テストと例外処理
** 10.1 gauche.testモジュール
- 同じファイルに書いちゃうのが好み。Common Lispだ
と#+testとかつかったり。
- あとREPLから呼ぶ方が好み。shellからを紹介するの
は、スクリプト言語としてのGaucheの側面を強調し
ているのだろうか。
*** 10.1.2 比較手続き
- 特になし。
*** 10.1.3 まとめてテスト
- おお、makeに行くのか。
*** 10.1.4 テストのパラメタライズ
- 特になし。
** 10.2 例外処理
- 特になし。
*** 10.2.1 例外の捕捉
- そうか、Gauche(SRFI-34?)のcondition systemには
restartは無いようだ。
*** 10.2.2 例外を発生させる
- 特になし。
** 10.3 テストレームワークを書いてみる
- thunkってこういう風に使うんだ。勉強になるなぁ。

こつこつ。

【フムフム本】9章 状態の管理


* 9章 状態の管理
** 9.1 集合
- お、Schemeには大域変数の考え方があるんだな。
- Common Lispではspecial宣言されたdynamic
variablesの名前を*...*とするのが慣習。
- う、SRFI-1のmember、keywordを使ってないのでいち
いち引数の並びを覚えなければいかん。
- 練習問題
この問題難しい。。。時間ができたときにやる。

- 練習問題をやるなかで、Gaucheでdocstringが無いこ
とやlambda-listの仕様が環境にて表示されないのが
不便に感じた。
** コラム ベンチマークを取ってみる
- 特になし。
** 9.2 連想リスト
- 特になし。
** 9.3 手続きによるパターンの抽象化
- 特になし。
** 9.4 連想リストふたたび
- 特になし。
** 9.5 名前つきlet
- 特になし。
** 9.6 リストの変更と一般化set!
- set!はplaceに使えるんだ。
** コラム リテラルデータの破壊に注意
- Schemeでは'(1 2)がリテラルであり、immutableなん
だな。Common Lisp とは違うなぁ。そもそもCommon
Lispはreaderが前面に出ているからか、リテラルとい
う概念はあまり使わないが。
** 9.7 準クォート
- 特になし。
** 9.8 グラフ
- ちょこっとだけ。
** 9.9 具象と抽象の往復
- コード書きながら考えたり気づきがあるときと、頭の
中でこねくりまわしたり、図に書いたり、人にはなし
たりという中で考えたり気づきがあったりすることが
あるわけで、それらをどうmingleするかが、人となり、
な気がする。

こつこつ。