2008-03-01から1ヶ月間の記事一覧

CLHS 3.1.1 Introduction to Environments

Binding について実装の観点から調べている。暫く調べていたが、let の入れ子になった環境で、中の環境から外の環境が参照できる、という当たり前のことが仕様書のどこに書かれているのか分からなくなった。http://www.lisp.org/HyperSpec/Body/sec_3-1-1.ht…

Design by contract (2)

dbc.lisp をほんの少しだけ使ってみた。※以下の例はいまいち。 ;; stack pop (defgeneric stack-pop (st) (:method-combination dbc)) ;; pop の本体 (defmethod stack-pop ((st stack)) (vector-pop (items st))) ;; 事前条件 スタックは空でないこと。スタ…

Design by contract

http://d.hatena.ne.jp/cranebird/20080322/1206197358 で気にしたような、コンパイラだとかインタプリタだとかのような複雑なプログラムをちゃんと実装するには、何らかの手法が必要。 何となく「契約による設計」という言葉を思い出した。知っているのは不…

クロージャーの実装

自作 Lisp インタプリタ続き。クロージャーを実装してみた。まだいろいろと細かい点が怪しいので、あとで HyperSpec とにらめっこして調べる。特にラムダ式の場合が怪しい、というより、この処理系には funcall がまだ無いので、試せない。TODO. defun によ…

OpenMCL

http://lemonodor.com/archives/2008/03/open_source_mcl_52_released.html 経由。 Mac で動く Common Lisp 処理系。IDE 付き。 使い方が良くわからないが、example/turtles.lisp が唯一分かった。昔懐かしのタートルグラフィックの Common Lisp 版だ。CLOS …

資料追加

東大工学部の資料 http://www.jsk.t.u-tokyo.ac.jp/~inaba/soft4/index-j.html ※文字エンコードを sjis に指定して見ること。これは素晴らしい資料かもしれない。試行錯誤を楽しんでいたのだが、ある意味で「正解」がズバリと書いていそうで怖い。

tester

自作 Lisp インタプリタ。関数の内部でグローバル変数を setq できないバグがあった。それを直すと再帰関数がおかしな値を返すようになった。変数への値の束縛のバグで、現在の環境で新しく束縛するか、上位の環境をたどって束縛するかの場合分けが必要だっ…

インタプリタ

順序が逆だがマクロ展開する macroexpand を実装した。 マクロのためには文字列から S式を作る read 関数が欲しくなってきた。 gcl の info ファイルを入手して emacs で読めるようにした。ただし on line の hyperspec の方が見やすい‥

マクロの実装

自作 Lisp インタプリタで、まだ list もバッククォートも無いが、マクロがいちおう動作するようになった。下の例は、 変数の値を1増やす incf マクロ。Warning として表示しているように、与えられた式を変形した上で、評価する。 Warning: form: (incf x)…

refactoring

自作の Lisp インタプリタのリファクタリング中。ちゃんとやっておかないとコンパイラにするときに苦労しそうなので。 関数の中に一つの式しか許さない作りになっていたことに気づく。defun で定義する関数の body は、暗黙的な progn に囲まれている、と思…

CLHS: 22.1.3.5: Printing Lists and Conses

リスト構造を Common Lisp の構造体で作って試している。リスト構造をきれいに表示するのができなくて試行錯誤していたのだが、HyperSpec にちゃんと書いてあった。 最初普通に再帰的にリスト構造を表示しようとしたのだが、ドットが多くなって見辛く、また…

memo

CLHS: 3.1.2.1 を眺める。 symbol: シンボルマクロか変数 cons = compound form: special form, macro form, function form, lambda form のいずれか。 special form: block, catch, .., setq, .. lambda form: compound form の car はシンボルでなければ l…

特定の日(2008-01-20)のブログエントリーに大量にスパムコメントが来る。よくわからないので移動。 Software Design 2008/01 Emacs 特集 なかなか良い。elisp と java との比較は苦しいが。ところで、最近入れた emacs 22.1.1 の環境では、 emacs の組み込み…

Lisp interpreter

素直に Lisp interpreter から実装してみた。http://www.csg.is.titech.ac.jp/~chiba/lecture/os/index.html の講義資料をほとんどそのまま。やっぱりインタプリターとは言えちゃんと順番にやってみるもんだ。とにかく自分には謙虚さが足りない。スキルも謙…

資料追加

OS/Programming http://www.csg.is.titech.ac.jp/~chiba/lecture/os/index.html Lisp インタプリタ、Tiny-C のコンパイラ。これもとても良い講義資料。

資料

http://wiki.monaos.org/pukiwiki.php?Scheme MonaOS id:higepon さんの MonaOS/Scheme シェルの大計画。 http://practical-scheme.net/wiliki/wiliki.cgi?Rui Gauche のソースコードの読み方。Gauche ハッカー。 http://sbcl-internals.cliki.net/Compiler …

学習計画 - 後戻りのまとめ

結局、講義資料をそのまま Common Lisp に変換した。 S式 -> AST -> 命令列 という順番で変換する。 C の構造体をそのまま CL の構造体に対応させる。Lispのコンスセルとかシンボルとか使っていると、自分がどのレベルを触っているのか分からなくなるので。…

学習計画 - 後戻り

教材ではちゃんと AST (Abstract Syntax Tree) を基本的なデータ構造として使っているが、自分は手抜きで S 式を使っていた。このため理解がこんがらがっている、と分かった。本を後ろから前に向かって読むのは良くない。http://d.hatena.ne.jp/cranebird/20…

ジョエル・スポルスキー(Joel Spolsky)

エッセイ集「BEST SOFTWARE WRITING」(青木靖訳)や、彼自身のエッセイを読んでいる。 昔から知っていたハズだが、経験が多少増えて読み直すと、また違う印象を受ける。 恐らく。10、20年前、ソフトウェア業界が無邪気なこどもであったときに、彼やマイク…

Emacs Version Control

「まじめに版管理をするほどじゃない勉強用のプログラムだけど、コメントアウトした古いコードが多くなってきて醜い、 でも消してしまったらあとで困るかもしれない」 => Emacs VC を使う

学習計画 3-1 でリファクタリング

学習計画 3-1 でリファクタリングしてみた。 注意していないと自分が vm を書いているつもりなのか、ただの Lisp の関数を書いているのか、マクロを書いているのか分からなくなりそうだ。ちょっと考えかたを変えて、コンパイラはS式を vm の命令のみで作られ…

学習計画

コンピューターを理解する道として。1)簡単なスタックマシン 1-1)簡単な計算をするためのスタックマシン(vm1)を Common Lisp で書く。 1-2)直接vm1の命令を実行させて動作確認。 2)簡単なコンパイラ 2-1)S-式(例: (+ 1 (+ 3 4)))をvm1用にコンパイルするコン…

Stack in Common Lisp (Vector ver.)

スタックを Common Lisp で書いてみたものの、思い直して組み込み vector-push, vector-pop を使うことにした。 vector は一次元配列のこと。 (defclass vm () ;; stack machine ((codes :accessor codes :initform nil) (stack :accessor stack :initform (…

Stack in Common Lisp

スタックマシンにはスタックが必要。リストで代用しても別にいいが、メモリーの物理的な構造とほとんど同じである配列で試して勉強してみる。 個人的には有限な固定長の「配列」にはとてもとても心理的抵抗がある。単に自分は何かの恐怖症なのかもしれないが…