空想犬猫記

※当日記では、犬も猫も空想も扱っておりません。(旧・エト記)

Lisp

etolisp 進捗 (33) 〜 継続について考えてみる

「なんでも継続」というテキストを読んで,継続について考えてみた。メモ代わりに文章化してみる。 ぶっ飛んだ理解 プログラミングにでてくる継続の概念が難しく感じるのは,私が馴染んでいるようなC/C++のような言語から見ると,継続は言語のランタイムによ…

etolisp 進捗 (32) 〜 GCの改良と高速化!

徒然なるままにetolispをいじってみた。そのむかし,etolispにGC(ガーベージコレクタ)を組み込むにあたってCodeProjectでたまたま見つけたサンプルコードを参考にしたのだが,思えばこれが悪い出発点だったのかもしれない(評価は4.5ポイントと高いが…)。…

Practical Common Lisp

http://www.gigamonkeys.com/book/ 書き方が教科書的でないというか,基本的にソースコード以外は平文で図も少ないのが特徴。なので,文章をちゃんと読まないと行けないのが辛い。うーむ,技術書の斜め読みに慣れてしまっている自分を矯正するには良いのかな…

そろそろ答を見るかの。

今までetolispの実装に関しては「他の実際を一切参考にしない」というスタンスだった。それによって,何か新しいものが生まれると思いきや,できたものは,素朴で効率の悪い構文木を直に評価するLispだった。まあ,そんなものだろう。目下のところ,Emacs が…

SLIMEの勉強

Emacs Lispの実装を見たら,etolispやる気無くしたんで,次のアイデアが熟すまで,しばらくLispで実用的なプログラムを書いて遊ぶことにした*1。開発環境は,どうやらSLIMEというものが標準的なようなので,それを利用する。Paul Grahamの赤い本の次はPracti…

Emacsのソースコード

今まで読まなくて正解だった。これを読んでたら,まず,C++で書こうなんて思わなかっただろうし,影響を受けまくっていただろうなぁ。半日,見た限りでは,Emacs Lispはかなり素朴であることが分かった。Lispを記述能力の高いDSLとして利用するぶんには,そ…

House Cleaning など

ポロポロと出てくる小さい不具合(てけとーな仕様の解釈による怪しい動き)を直したり,コードを綺麗にした。パーサを少しいじったせいで,&RESTや&BODYなどの&付の特殊なシンボルを利用している関数が,動かなくなっているっぽい。テスト流しておくんだった…

Generic Method の呼び出し順序

について確認。 (defclass first () ()) (defclass second (first) ()) (defclass third (second) ()) (defmethod test :before (x y) (format t "0 0~%")) (defmethod test :before (x (y first)) (format t "0 first~%")) (defmethod test :before (x (y s…

etolisp 進捗 (31) 〜 Undoのサポート

以前,etolisp は「Lisp界のSQLiteを目指す」と書いたことがある。SQLiteは僕が最もクールだと感じたソフトウェアの1つである。その理由にはいくつかある。一つは,全てにおいてシンプルであること。ライセンス形態はパブリックドメインで,何も考えず商用ソ…

ランタイムの Undo

には,少々,無理があった。そもそもC++外部のオブジェクトがラップされてランタイムに登録されたりするわけだから,無理だな。どう考えても。もう少し機能限定の reversable オブジェクト*1を作ることにしよう。全然,目新しくないアイデアに落ち着きつつあ…

フィボナッチ数を計算する

…イヤ,そんなことは,始めから,わかっていたことだ。末尾呼び出しの最適化のない etolisp には無理だろうってことくらい。sbcl にだって,無いんだから。いいじゃないか。そんなところで勝負したって,詮無いことだ。 (defun fib (n) (if (< n 2) n (+ (fi…

etolisp 進捗 (30) 〜 Object Systemの実装 (4):Auxiliary Mehotds

午前中,before-method,after-method,around-method が動くようになった。before,after は想像の範囲内。around は少々面倒だった。たかがメソッドの呼び出しを,よくもここまで高機能にして仕様化してくれたものだ…。ちっ…。一応,本に書いてある通り me…

etolisp 進捗 (29) 〜 Object Systemの実装 (3):defmethod

defmethod の実装が限定的に終わる。今のところ,メソッドの検索は class ID をキーに,ハッシュを利用した n 分木構造を辿る仕組みにしている。効率的ではないかも知れないが,一番,直感的に思える実装。Generic Function は,関数の配列と,関数を検索す…

etolisp 進捗 (28) 〜 Object Systemの実装 (2):defclass

今日は defclass の実装。継承もスタティックメンバもサポートできた。この辺,赤い本は少ししか言及がないので,理解が正しいかどうか不安だ。取りあえず本に載っているコードは全て動くようになった。Precedence も,図を書いて説明すると複雑そうだが,実…

etolisp 進捗 (26) 〜 Packageの実装 (5)

半年以上 塩漬け になっていた package 絡みの問題を解決。なんかもう記憶が定かではないのだが,拙い blog の記述によれば,実行時にシンボル名を解決していたのが問題になっていたらしい。結局「,」や「,@」を,CL package*1のexportシンボルにして,「,ho…

etolisp 進捗 (27) 〜 Object Systemの実装 (1)

【ニコニコ動画】創世のアクエリオンを聞きながら作業。「あっいーしーてーるー」がリフレインしてあまり捗らない。ニコニコ動画に「作業用BGM」タグがあるのを発見。ニコニコだと時間制限がないので,平気で「神曲メドレー90分」とかがアップされている。MP…

etolisp 進捗 (25) 〜 ガーベージコレクタの実装 (4)

Code Project の記事をもとに実装し始めたガーベージコレクタも,そろそろ etolisp での使用に耐えるものに出来上がってきた。元のコードは分かり易さのためか(?)マーキングの処理で明らかに非効率な線形サーチを行っていた。そのため10万ノードのゴミ掃…

etolisp 進捗 (24) 〜 ガーベージコレクタの実装 (3)

id:xoinu:20080515 の続き。本日は gc_ptr の配列版の実装。動的配列やハッシュなど,cons 以外のデータ構造についてもちゃんとガーベージコレクタが働くようにするには,node_t::contains() によって参照関係をトレースできるような gc_ptr の配列を作る必…

etolisp 進捗 (23) 〜 ガーベージコレクタの実装 (2)

このまえ(id:xoinu:20080503:1209891180)の続きをごにょごにょ。A garbage collection framework for C++ のコンセプトコードは確かに面白いが,致命的な問題が2つ。1つはそのままのコードだとデストラクタが正しく呼ばれない。node_t のデストラクト時に…

etolisp 進捗 (22) 〜 ガーベージコレクタの実装

C++/CLI を少しいじって,メモリ管理から開放される気楽さを知ってしまった。興味がわいたので,A garbage collection framework for C++の実装を参考にお手軽 gc_ptr を実装した。正確にいうと,リンク先の gc_ptr の実装を理解しただけ,ということになる…

SICPを読み始めた

etolispの実装はC/C++のstackモデルにどっぷり使っていて,末尾呼び出しの最適化や,call/cc のサポート(Common-Lispにそれは求められていないかも知れないが)をするときに,何かひねりを加えなければならなそう。etolispは,面白い実装が思いつくまでしば…

継続

ネットでSchemeの継続(continuation)について調べていた。どうやら私の頭はC/C++のstackによる処理の制御しか存在していないようである。ここで,より一般的な「継続」を理解することで,もう少しプログラミングの奥行きが広がるんじゃないかと期待してい…

My Lisp Experiences and the Development of GNU Emacs

via Matzにっき偉大なソフトを書いた人が,そのとき何を考えていたのかを知ることができるというのは,とても参考になる。 I implemented Common Lisp once on the Lisp machine, and I'm not all that happy with it. One thing I don't like terribly much…

etolisp 塩漬け

前回の package の修正後,また更に名前空間がらみでバグを発見。今までの実装はかなりいい加減で,back quote の「,」や「,@」を含むシンボルを「,arg」や「,@body」などのように,ひとつのシンボルとしてパースし,back quote の評価時に「,」や「,@」以降…

etolisp 進捗 (21) 〜 Packageの実装 (4)

朝起きると神のお告げがあり,etolispはまたも邪悪な「俺仕様」に陥らずに済んだ。イヤ,結局,仕様に当たったわけではないんだけど,私の好ましい方を支持する指摘があったので,そっちを信じることにした(『神のお告げ』たる所以・笑)。name ID とか sym…

etolisp 進捗 (20) 〜 Package (3)

追記:このエントリは誤っている可能性が高いです。 前々回,前回の実装は,parse 時にシンボルの値を決定していたが,それはやってはならないことだった。というのも,Common-Lisp では動的に active なパッケージを切り替えることができるので,パースした…

etolisp 進捗 (19) 〜 Package の実装 (2)

パッケージについてもう少し考えてみる。Paul Graham の本は package についてほんの3ページしか割かれていないが,その冒頭には A package is a Lisp object that maps names to symbols. とある。そう,Common-Lisp においてパッケージはオブジェクトなの…

etolisp 進捗 (18) 〜 package の実装

テストフレームワークも少し進化して,こんな感じでテストを書き始めた(少し冗長なのは,本人のスキル不足と etolisp 自体に最低限の関数しか用意されていないから)。 (defmacro nice-caught (&body body) `(progn (nice-catch 'error ,@body) *last-nice-…

etolisp 進捗 (17) 〜 user interface, test framework

Macro も大体動くようになって(まだまだ細かいところで問題は山積みであるが)いよいよ次は構造体や CLOS の実装を試してみようという気になってきた。ただそのためにはシンボル操作周りの関数が不足しているので,いくつか実装する必要がある。一つ一つ実…

etolisp 進捗 (16) 〜 変態マクロ動く

おやすみなさいと,オフラインになってから寝るまでの,1時間のコーディングが至福の一時だったりする。昨日の方針通り back quote にネストされた back quote の中身は展開しないという方針で,変態マクロが動くようになった。back quote を使って「`,@hoge…