空想犬猫記

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

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

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

コード自体はいじっていなかったが,日々頭の中でアイデアは生まれていたので,一日で色々なことに取り組んだ。

まずは Lisp 関数のオブジェクト化。C++ で実装されている Lisp の関数は,今まで C の関数に一対一対応していたが,C++ のクラスに格上げした。似た関数同士の実装の共有やフック,デバッグ機能とかを考えたときに,ソースコードの見通しが良くなるので。eto::Function クラスの導出クラスを作成して,それを実行時に eto::RunTime に登録すれば,新しい関数が追加されるという仕組み。将来的に C++ で拡張する分かり易い方法がほぼこれで確立されたともいえるだろう。

次にシンボル名解決の高速化。これは今までたんに string で持っていたシンボルを,parse 時に文字列ではなく整数値に変換して持つようにした。今までたんに lazy 過ぎただけともいえる。

続いて hash および vector(array)の実装。hash は lisp で構造体を実現するために必須であると思われるので,面白い機能ではないけど,入れておいた。

今まで封印してきたが,ついに禁断の boost を導入。もともと auto_ptr だらけのコードなんだけど,用途に応じて intrusive_ptr, shared_ptr, noncopyable などを使い始めた。実用性を考えると正規表現が欲しいところ。boost の正規表現ライブラリってどうなんだろ。本当はそろそろいい加減な参照カウンタをやめて,ゴミ集めを実装しなければならないという課題もある。材料は既にあり,そちらはもう少し頭の中で煮詰まる熟成するのを待っているところ。

ちびちびと,最近は暇つぶしに作って来た etolisp も,そろそろ1年半!なかなかの巨大プロジェクトになって来た。午後は,Lisp のテストコードを書きながら,CLOS よりも分かり易い Object System ってできないかなぁと,色々,擬コードを書いてみる。Common Lisp Object System が CLOS(クロス)なら,EtoLisp Object System は ELOS(エロす)だなぁと妄想してたら,ますます作りたくなった。