2009年04月23日(Thu) 雨、寝不足 [長年日記]
● [sicp] guileとgaucheはnormal-order evaluationか?
やっとこさ、Structure and Interprtation of Copmuter Programsを読み始めた。
Lispの式を評価するのには2種類のやりかたがあるのだそう。 The Substitution Model for Procedure Applicationの項で、Lispの式を手で評価していっている。 ここで、内側のかっこの中から順に評価するのをnormal-order evaluation、 外側のかっこを評価するのに必要なかっこだけを評価するのをapplicative-order evaluationと言うのだそうだ。 そして、Lispはapplicative-order evaluationを使います、と書いてある。
Exercise 1.5にあるのは、処理系がどちらの評価順で式を評価するかを確かめる方法。僕の想像は、normal-order evaluationの場合は(test 0 (p))の評価の過程で(p)が評価され、その結果は(p)なので無限に評価され続けるので、(test 0 (p))の結果は返らない、というもの。 Lispはappllicative-order evaulationで、その場合はtestの定義中、yは評価されずにtestはすぐに0を返すはず…なのだけれど、Guileでは、
おや?じゃあGauche。
うーむ。どちらもnormal-order evaluationなのかしら。
それにしても、Lispを使ってるとviの対応するかっこをハイライトする機能のありがたみがわかりますね。Emacsだと一瞬ジャンプしてくれるよね。
● [memo] Ubuntu 9.04 desktopをインストールしてみる
ubuntu-9.04-desltop-i376のCDから起動、適当に進む。 タイムゾーンを設定する地図がかっこいい。 このマシンにはWindowsも含めいろいろ入っているので、hd0にはブートローダを入れない(で、後から手でgrub.confを編集するつもり。)
昼やすみから帰ってくると、リブートが終わったようで、ライブCDが起動していた。 ここから再起動しようにも、うーん、initrd.imgがみあたらない。
Momonga 5を起動してUbuntuの分のルートパーティションをマウントしてみると、 げ。使用率100%。どうも、Windowsに入れていた巨大なデータ (職場で撮ったビデオ)がそのままUbuntuの/home以下にコピーされていた。 うげえ…。インストール時にMigration assitantが何だか言ってたような気がする。
まずは要らないファイルを消して、修復作業。 Ubuntuの/は/mnt/tmpにマウントした。
initrdはlinux-genericパッケージには含まれないのか。
apt-cache search linux-genericしてlinux-image-2.6.28-11-genericをみつけた。
/procとか/dev/ptsとかが無いので不十分かもしれないが、とりあえずinitrd.imgができたようだ。
シンボリックリンクも期待通りにできている。起動してくれますように。
● Ubuntu、無事にブートしてくれた。念のためもう一度initrdを作らせておこう。
● [memo] Ubuntu 9.04 desktopでskkを使えるようにする
apt-get installでscim-skkとdbskkd-cdb(と依存パッケージ)をインストールして、下記の操作をした。
次に、/etc/default/localeの内容を以下のようにした。
/etc/init.d/gdmを見るとこれが反映されるためにはgdmがrestartされないように見えたので、/etc/init.d/gdm restartしたらXが落ちて戻ってこなくなった。 情けないがCtrl+Alt+F1で得られたコンソールからリブートしたら、そのまま自動ログインしたユーザーでskkで漢字をタイプできるようになった。
● [sicp] 展開と評価
SICPで述べられていた式の評価順について悩んでいた ら、第一人者の方からヒントをいただいてしまった。 ああ、すばらしきかなインターネット。ありがとうございます。
いただいたヒントを自分なりに理解する。
- 展開と評価は違う→Normal-order evaluationで最初にやるのは評価じゃなくて展開
- Normal-order evaluationの場合、
- 展開の順番は問わない→いろいろな順番で展開できる。結果が変わっちゃう?
- 展開しているうちに消えちゃう式がある→Exercise 1.5だと(p)が消えるのかな?
というわけでもう一度考える。
1.1.5項の前半で説明されているのは、えーと、Applicable-orderかな。 この場合、1.1.3項に戻って、
- 内側の式を評価する
- 評価の結果得られた値に演算子を適用する
ことにしてみる。
む!これがGuileとGaucheの動作かな?
一方、Normal-order evaluationの場合。Applicative order versus normal orderの項より、
- まず、式をどんどん展開(substituteしながらexpand)する
- Primitiveな演算子(って 1.1.3項の「machine instruction sequences」に置き換えられる「built-in operators」のことだよね) だけが残ったら、それらを評価していく
ことになるのかな。
うーん。ここで(p)をこのままにして評価を始めれば、
となるのだけれど、やっぱり(p)を展開したくなるなあ。
と、この辺で時間切れですね。次回(いつ)に続きます。
SICPのそこはちょっと混乱しやすいんですが、GuileもGaucheも(というか標準のSchemeは)applicative-orderです。<br><br>* expansionとevaluationは違う<br>* normal order は "fully-expand and reduce" と説明されているが、(1)末端の式からexpandしなければならないということはない。というかexpansionの順番は問わない (2)normal orderでexpandしてゆくと、使われない式がfully expandする前に消えちゃう場合がある。<br><br>3章4章を読んでくとわかるようになってるんですが、なまじ普通の(applicative orderな)プログラミング言語の知識があると上の(1)に気づかずに引っかかるように思います。多分、実際の講義ではTAか教官によるフォローが入るんでしょうけれど。<br><br>Exercise 1.5で *先に* (p)を全部展開しなければならない、と感じてしまったら、あなたは既にapplicative-order脳に犯されているのです。
ありがとうございます!<br><br>いきなり楽しそうな落とし穴に落ちたようです。がんばって理解します。
最近のツッコまれどころ