問題5.1-5.3
4章最後ごにょごにょしましたが終わったので、5章に入ります。なんかざっと眺めてみると5章最後の方もごにょごにょしそうです。
いつも通り先にシミュレータを作っておきます。超循環評価器より構造が楽ですね。extract-labelsで継続っぽいこともやってて面白い。あと昨日命令列を配列に並べていくのが面白いって言いましたけど、ここでも同じようなことやってますね。やっぱり一般的な方法なんだなー。
make-execution-procedure(制御命令の振り分けと実行手続き生成関数)見てると総称関数の便利さがよく分かった気がする。やってる内容はあんまり変わらないと思うけど。
実践Common Lisp p393-468
終わったああああああああ。
- MP3ブラウザのイメージが掴めないからいまいちピンとこない。
- HTMLとS式は相性いいなー。
- SICPで評価器何個か書いたけど、やっぱりHTMLインタプリタも構造似てる。インデントまでカバーしてて実践的だなと思います。あとコードがなんか読みやすい。全体像が把握しやすいからかな。
- 命令を配列に格納して実行手順を作るってのは面白いなと思いました。でも結構基本的な考え方だったりするのだろうか。
- マクロすごいなーと思いつつ、でもやはりまだあんまり読めない。eval-whenもまだあんまり分かってない。次読むOn Lispで修行したい。
- シンボルが持つ属性リストの具体的な使い方みたいなのが分かった。そういえばEmacsの設定ファイルでもput,getでなにやらやってたけどEmacs Lispにもシンボルに属性リストがあって同じような感じのことをやってたのかな。
- 他の言語を呼ぶためにFFIというものがあるらしい。
- asdf便利。
- declareとtheで型宣言もできる。Cみたいに早くて危険なコードも書ける。
- リファレンスが欲しいけどお金ないからできればHyperSpecで事足りてほしい。でもCLtL2がなんか読み物として面白いっぽいのでそのうち買って読みたい。
- CLOS勉強しててオブジェクト指向に少し興味を持ったので、smalltalkをそのうちやってみたい。
- The Hacker's Dictionary読んでみたい。面白そう。
p459ここで紹介したWebサイトや本を読むことでプログラミングを妨げられないように...身につける唯一の方法は使ってみることだ。
その通りでした。読んでばっかじゃなくて何か書きます。
- 処理系依存をラップするのもマクロで簡単に書ける。マクロつよい。
全体的な感想も少し書きます。
- 特にオブジェクト指向全然知らなかったのでここらへんきつかったです。後半のMP3の実践プログラムもdefclassとかコンディションとかそれに絡んでマクロなんか使っててコード追うの大変でした。慣れると読みやすくなるのかな。
- Common Lispは実践的な言語だと分かりました。関数とかいっぱいあるし、言語に組み込まれてる機能もいっぱいあるし、マクロつよいし。
- Common Lispの大まかな像のようなものを見ることができました。いろいろくっついてて歴史があるなーなどと思いました。
- 読んでて面白かったです。特にマクロあたり。
- Practical Common Lispは原文がHTMLで公開されてるのですが、英語得意じゃないので翻訳が出版されてて助かりました(英語もそのうち勉強しなきゃいけないんだろうけど)。訳者の方々ありがとうございます。
ということで読み終わりました。すごくぱっとしない感想ばかりですが自分用なので勘弁してください。しばらくCommon Lispお休みしてSICP解きます。
実践Common Lisp p349-392
実践のところはあんまり書くことがないなぁ。
- 今更だけど総称関数ってSICPでいうデータ主導流的なものっぽいですね。
- Allego Serve便利ですね。
- Knuth先生の本もそのうち読んでみたいな。
- バイナリの読み書きがどういう流れでされてるのかなんとなく分かってきた。
p390脚注*8より。SchemeからCommon Lispに来た人たちは、...再帰的に呼ばないことを疑問に思うかもしれない。Schemeの処理系は「アクティブな末尾呼び出しの数に上限がないこと」への対応が規格によって要求されているので、...Common Lisp...では要求されていない。そういうわけで、Common Lispらしい繰り返しの書き方はループ構文だ。再帰ではない。
Common Lispで要求していないのはなんでだろ。実装面倒くさいのかな。それともLOOPが同等の能力を持つから別に必要ないんだろうか。でも再帰いっぱい書きたいです。偉い人お願いします。
あとちょっとなので今日で終わらせられるかな。そのあとSICP進めます。
実践Common Lisp p299-348
さぼってました。1日さぼるとなんかこうそのまま数日さぼっちゃったりするのを治したい。あと今日すごい風強くて恐い。
- マクロが未だよく分からないオブジェクト指向と組みあわさっててとてもややこしい。
- (declare (ignorable ,streamvar))が何やってるのか分からない。コンパイラに何か指示してるらしいけど。
- 25章で作ったマクロを使ってクラスを作ったりしてるところでようやくなんとなく何がしたかったか分かってきた。マクロって実際使わないとなかなか理解できないんですかね。
- 汎用性を持たせるためにいろいろクラスを作ってるのは分かるんだけど、ここまでしないとダメなのかなぁなどと思ってしまう。でもパーサってそんなものなのかな。
バイナリファイルの解析の一例を勉強できました。ちょっと面倒だったけど結構面白かった。数日さぼったから遅れてるけど、できれば明後日までに全部読み終えたいです。
問題4.76できない
急に難しくなった。続き。
続きを読む実践Common Lisp p253-298
感想。
- 名前をつけるとき重複を気にしないようにできるっていうのは便利。
- LOOPってそんなに複雑かなぁ。FORMATが死ぬほど複雑だったように感じてるからあんまり気にならない。
- CL-PPCREを使えばって書いてあるけどどうするんだろう。とりあえずREPLでそれっぽいファイルをLOADすればできるのかなぁ。
- …できないなぁ。やっぱりasdfを使うのがよさそうなのでいろいろ調べてみる。
- こちらを発見。Allegroなのでrequireするだけでたぶんasdfが使えるはず。
こんな風にしてみる。
packages.lisp
(in-package :cl-user) ;;; pathnames packageを定義 (defpackage :com.nrvct.pathnames (:use :common-lisp) (:export :list-directory :file-exists-p :directory-pathname-p :file-pathname-p :pathname-as-directory :pathname-as-file :walk-directory :directory-p :file-p)) ;;; spam packageを定義 (defpackage :com.nrvct.spam (:use :common-lisp :com.nrvct.pathnames))
定義を書いてるファイルの先頭で、
(load "/<...>/packages.lisp") ;;; cl-ppcreを導入 (require 'asdf) (load "/<...>/cl-ppcre.asd") (asdf:oos 'asdf:load-op :cl-ppcre) (in-package :com.nrvct.spam) ;;;以下本体 (defun ...
して、REPLにロードして
CL-USER> (in-package :com.nrvct.spam) #<The COM.NRVCT.SPAM package> SPAM> (extract-words "abcde") ("abcde") SPAM> (extract-words "I can fly") ("can" "fly") SPAM> (extract-words "The big fat cat eats the student") ("The" "big" "fat" "cat" "eats" "the" "student")
で動かせました。よかった。文字列をスペーストークンで区切って単語文字列に分割し、長さ3以上の単語文字列のリストを返すみたいですね。asdfとかloadとかどう書くべきなのかはまた後でちゃんと勉強しよう。
- 帰無仮説。統計の授業でやったけどこういう風に応用できるのかぁ。フィルターとか認識とかいろんな文脈で使えそう。統計の勉強しなおそうかな。うーん。いやどちらかというと応用の方を勉強した方がいい気がする。何かいい本ないかな。今度探してみよう。
- 今度spamのリストを拾ってきてちゃんとフィルタできるかどうか試してみよう。今日は眠いからやらない。
ということでやっと実践に入りました。パッケージの使い方がなんとなく分かった気がします。確率、統計についてもうちょっと勉強してみようかな、という気になりました。何か面白いことができそうな気がします。