空想犬猫記

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

Lisp

etolisp 進捗 (15)

天からの突っ込みが入った進捗(13)の修正を正式に復帰する。実際にはパース時にHashを作っていたのを,LambdaおよびMacroが評価されるタイミングで作成するように戻しただけなので,実質的にはコードの場所を移しただけ。よくよく考えれば進捗(13)はあまり意…

etolisp 進捗 (14) 〜 macro expansion

で,結局こうなった。context frame とか lexical context とか,正確な定義をしないまま変数名に使っているので,この辺は,間違っていたら,おいおい修正しようと思う。進捗(8) の方針をそのまま実装した。defun は lambda を setf したのとほぼ等価な実装…

Macro 再考

風も日差しも強く,波も悪そうなので,海に行かず Lisp のマクロについて,もう一度読み直してみる。どうやら7ヶ月前に妄想したこと(進捗(8) )がだめだったのかもしれない。Practical Common-Lisp を読み直して,もう一度マクロについてまじめに考えてみる…

etolisp 進捗 (13) 〜 パーサの改良

追記:このエントリは誤っている可能性が高いです。 今までパーサでは愚直に cons tree をくみ上げていたが,&optional や &key の文脈によっては,cons 以外の構造体,たとえば hash などで構文木を作った方が効率的であることに気付き始めた。いろいろでき…

パーサを元に戻したそうかどうか考えている件

パーサで構文木をいじるとマクロで困ると id:practicalscheme さんより指摘があった。マクロは ANSI Common LISP (Prentice Hall Series in Artificial Intelligence) だと,10章にあって,その辺りまでいくと [あとで考える] タグが付いていて,正直あまり…

パーサー改良中

パーサのデバッグを視覚的に行う。趣味でスクリプト言語の実装をやってるっていうと,自慢できそうだけど,こうやって構文木をダンプすると,如何に簡単なことをしているかってのが白日にもとに晒されてしまう(笑)こんな絵ばっかりかいていると,だんだん…

etolisp 進捗 (12) 〜 例外処理 〜

Array と Hash の実装も終わって,いよいよ CLOS が見えてきた。アロケータの最適化とかゴミ集めなど,むずそうなトピックは取りあえず棚上げにして,まず実用的な機能をばというわけで,catch と throw の実装をした。これができると,ようやくまともなLisp…

etolisp 進捗 (11) 〜 hash と vector の実装,シンボル名の高速化

今週末は LA には珍しく天気が悪く,サーフィンはお預け。頭の中で整理したいことがあったので,読書などで新しいものごとを学ぶ雰囲気でもない。かといって,ボーっとニコニコ動画を見るのもなんだったで,じつに半年ぶりくらいに etolisp をいじった。コー…

プログラマの階段

構文木をそのまま記述できる Lisp をいじってたら,プログラミング言語というのは,たんにシンタックス・シュガーを,あれこれ,もてあそんで,味付けしてるだけであって,どれも大差ないんだなーと思えるようになってきた。Ruby が Matz Lisp と呼ばれたり…

SBCL がいい感じ

etolisp を実装するにあたっては,Paul Graham の本と私の理解だけで,どこまで出来るものか試すために,他の実装がどうなっているのかとか,いっさい見てこなかった。まぁ,チラ見はしてたんだけど,今まで,あまりビビっと来るものがなかったのが実情。今…

etolisp 今後の開発方針

ANSI Common LISP (Prentice Hall Series in Artificial Intelligence) を読みながらノリで書き始めた Lisp インタプリタ etolisp も,関数,マクロ,ローカル変数,ブロックやその他の制御が出来るようになり,原理的に興味があった部分については,大体実…

etolisp 進捗 (10) return の実装

今日は,return-from や return の実装をした。etolisp のもう一つの設計方針は,Lisp の関数が C の関数(あるいは C++ の関数オブジェクト)に一対一対応になるようにする,というもの。それはコードの見通しの良さと,将来,C/C++ で簡単に拡張可能できる…

etolisp 進捗 (9) &REST, &OPTIONAL, &KEY, ,@ の実装

defmacro は,id:xoinu:20070227 の方法で,とりあえず動いているようだ。Lamda を保持する ValueLambda クラスがあって,それを継承して ValueMacro クラスを作った。ついでに &REST,&OPTIONAL,&KEY,に加えて,back-quote でリストを splice する prefix…

etolisp 進捗 (8) defmacro の実装

恐らく,私は,Lisp を理解する前に,インタプリタを実装しようとしている,数少ない部類の人だと思う。で,今日は defmacro を良く理解せずに,とりあえず実装してみた。 (defmacro nil! (x) `(set ,x nil)) (nil! y) に相当するコードを,実装済の関数で実…

etolisp 進捗 (7)

仕事も終わり,今日一日は OFF。おみやげとクリスマスプレゼントの買い物を済ませ,etolisp をいじることにする。d:id:xoinu:20060526 から長らく塩漬けになっていた。defun を実装して再帰がちゃんと動くことを確認。段々,自分が作ったインタプリタが,自…

etolisp 進捗 (6)

San Jose と California 中北部の森の余韻に浸っていたら,この一週間はあっという間に過ぎてしまった。 今日は一旦休憩して parser の改良と print 系の関数を実装。parser はカッコとコッカとコメントしか考慮しないインチキなものだったので,ちゃんと「'…

etolisp 進捗 (5)

仕事が一段落し,時間が出来たのでいじる。前回のもくろみはうまくいかず,結局,前々回の計画どおり実装。本日は do の実装と parser の強化。 お手軽な parser の実装ってどうやるのがいいのかな。Interpretorパターンは速度的に不安があったので,結局コ…

etolisp進捗 (4)

ループよりも先に再帰とループと同等な末尾再帰を実装する。

etolisp進捗(3)

怠けていて細かい関数ばかり手をつけている。さっさとマクロを実装して,あとはLispで書いてしまうというのが,手っ取り早いように思えてきた。 その場合,C++で実装するのに較べると,lambdaを介するために少し動作が遅くなるのと,読み込みのため起動が少…

etolisp進捗(3)

前述のコードの if ( !pCons->cdr()->isNil() ) THROW_TOO_MANY_ARG; という記述がいまいち格好わるい。 pCons->mustBeRearGuard(); などという呼び出しに変えてみた。Rear Guradは「殿(しんがり)」という意味。Consのリストを,隊列を組んで作戦に取り組…

etolisp進捗(2)

今日は if の実装。九行。 LISPF_TRY( If ) { const Cons *pCons = pValue->asCons(); const Value *pCond = pCons->car(); pCons = pCons->cdr()->asCons(); const Value *pTSub = pCons->car(); pCons = pCons->cdr()->asCons(); const Value *pFSub = pCo…

etolisp進捗(2)

etolispのlambda実装完了。しかし,どうやらシンボルとか関数とかの考え方がCommon Lispとは違っていることに気付く。後で気付くのは「仕様はこんなもんだろう」と我ながら適当に作ってるせいだ。私の実装はlambdaもbuilt-in関数も,単なるシンボルも,全て…

etolisp進捗(1)

今日は時間があったのでetolisp*1の実装を行う。今日の目玉はlambdaの実装。lambdaは,関数やクロージャの定義の他にも,lexical context(ローカル変数)の定義にも使う。プログラムを抽象化,モジュール化させる機能を一手に引き受けてしまうのだ。そう考…

多態な参照剥がし

現在のetolispでは値はシンボルも含めて全て Value クラスを派生させて作っている。シンボル名の解決に参照剥がし演算子が使えれば,Lisp上での参照剥がしとC++での参照剥がしが同じメタファーで実現できてカッコいいなあ,と思ってたんだけど virtual const…

etolisp

Paul GrahamのANSI Common Lispを読んでいたらLispの処理系を作りたくなってきた。Consを作って構文木を組み立てて,式の評価をさせれば意外と簡単に実装できるような気がしたので。文法の違いはパーサが吸収してくれるので,同じ原理で色んな種類の言語が実…

Common Lisp Again

新年の誓い(?) にて,捨てたつもりだったが,訳あってCommon Lispの勉強を再開した。現在の仕事はC++がメインだが,Common Lispの考え方(どちらかというと実装の方)が今取り組んでいる仕事に役立ちそうな気がしたからである。考え方を学ぶのであれば本当は…