お〜し,目が痛すぎて (真っ赤に充血),超やる気無いながらも,とりあえず ET 言語フルセットの reader は書けた.
俺って,こんなメチャクチャな C 言語のコードを勢いだけで書いて動かせたんだ… と,我ながらびっくり.だんだん C 言語を思い出してきました !
実数とか,配列とか,情報付き変数とか無名変数とか,いろいろサポート.
enum ETC_DATA_TAG { /* プログラム全体において,配列の 0 番目には, 配列の長さが入っている (Pascal 文字列) ので,絶対に使用されない * (NULL ポインタ代わりとしても使用できる) */ NIL = 0,
INT, REAL, CHAR, SYM, PVAR, IVAR, ARRAY, STR, PTR, CONS };
(et.h より)
実行例は,こんな感じです.
$ ./etc "{?~(1 -2 3) {a r r a y} ?~(*x *y *z~(a b c))}"
----------------------------------------------------------
String : "{?~(1 -2 3) {a r r a y} ?~(*x *y *z~(a b c))}"
Array : {104, PTR, 21, STR, 1, '?', CONS, INT, 1, PTR, 11, CONS, INT, -2, PTR, 16, CONS, INT, 3, NIL, 0, IVAR, 3, 6, SYM, 26, STR, 1, 'a', SYM, 31, STR, 1, 'r', SYM, 31, SYM, 26, SYM, 40, STR, 1, 'y', ARRAY, 5, 24, 29, 34, 36, 38, PTR, 97, CONS, PVAR, 57, PTR, 60, STR, 1, 'x', CONS, PVAR, 40, PTR, 65, CONS, PTR, 94, NIL, 0, STR, 1, 'z', CONS, SYM, 26, PTR, 78, CONS, SYM, 83, PTR, 86, STR, 1, 'b', CONS, SYM, 91, NIL, 0, STR, 1, 'c', IVAR, 70, 73, IVAR, 3, 52, ARRAY, 3, 1, 43, 50}
Prity print : Array : {
length : 104
1 (p 21) 3 str 4 length : 1 5 ? 6 cons 7 (i 1) 9 (p 11) 11 cons 12 (i -2) 14 (p 16) 16 cons 17 (i 3) 19 () 21 (ivar (p 3) ~ (p 6)) 24 (sym (p 26)) 26 str 27 length : 1 28 a 29 (sym (p 31)) 31 str 32 length : 1 33 r 34 (sym (p 31)) 36 (sym (p 26)) 38 (sym (p 40)) 40 str 41 length : 1 42 y 43 array 44 length : 5 45 (p 24) 46 (p 29) 47 (p 34) 48 (p 36) 49 (p 38) 50 (p 97) 52 cons 53 (pvar (p 57)) 55 (p 60) 57 str 58 length : 1 59 x 60 cons 61 (pvar (p 40)) 63 (p 65) 65 cons 66 (p 94) 68 () 70 str 71 length : 1 72 z 73 cons 74 (sym (p 26)) 76 (p 78) 78 cons 79 (sym (p 83)) 81 (p 86) 83 str 84 length : 1 85 b 86 cons 87 (sym (p 91)) 89 () 91 str 92 length : 1 93 c 94 (ivar (p 70) ~ (p 73)) 97 (ivar (p 3) ~ (p 52)) 100 array 101 length : 3 102 (p 1) 103 (p 43) 104 (p 50) }
Symbolic expression => { ?~(1 -2 3) { a r r a y } ?~(*x *y *z~(a b c)) } ----------------------------------------------------------
すごくソースが汚くなってしまったので,公開はそのうちということで… まだ挙動がかなり怪しいですし,コピペの嵐 (C は,関数いっこ追加するのも面倒…) なので w
(ソースを公開もしないで,こんな機械語レベル (低水準のエンコード) の話をいきなりされても,完全にチラシの裏だと思いますが…)
結論 : ノリと勢いだけで機能追加するのは良くない.
C はいろいろな意味で面白すぎる言語なので,ついつい遊んでしまって良くない.
一応,これ以上追加する機能 (オブジェクトのサポート) は無いから,ちょっくらテストケースとか書いて,ちゃんと関数切り分けたり,べた書きしているところを間接的に書いたりして,そろそろ真面目にリファクタリングとかもしないとなぁ.その過程でバグもたぶん取れると思う.
というか,まず,未だにタグに 1 word 使っているのは,さすがにどうにかしないと.word じゃなくて,ちゃんと byte の配列に,可変長で S 式をエンコードするようにする予定.
C 言語の構造体的に書くと,例えば情報付き変数は,今のところは
struct information_variable { Word data_tag; // 全オブジェクト共通 Word index_to_str; Word index_to_SExp; };
みたいな感じで,24 byte とか使っているんだけど,これが
struct information_variable { Byte data_tag; Byte index_to_str1; Byte index_to_str2; Byte index_to_str3; Byte index_to_str4; Byte index_to_SExp1; Byte index_to_SExp2; Byte index_to_SExp3; Byte index_to_SExp4; };
みたいな感じになるのかな. 実際は,単なるフラットなバイト配列だけど.このやり方ならば,整数型の大きさとかをいろいろ調節したりもできそう.本気出せば,無限精度にも.
う〜ん,C 言語でテストを自動化するフレームワークって,何か無いのかなぁ…
gcc は,tcl とかで書かれた,謎のテストスィートを使っているらしい.
kkojima日誌 2006-07-01 GCC summit
GDB でやっている人もいるらしい.
GDBによるテスト自動化への試み
# まぁ,「テストなんて邪道 ! テストなんて書いている暇があったら,証明をしろ,証明を ! もしくは仕様 (テスト) を書き上げて,そこからプログラムを自動生成しろ ! 」ってのが,ソフトウェア工学的には正論っちゃ正論なんですが (笑)
さすがに,C 言語は XP にも向いてます ! っていうネタはいろいろ無理があるか w
でもなんというか,C は,本当に中途半端 (それほどポータブルでも,それほどアセンブリでも無い) でどうしようもない言語なんだけど,歴史が長いぶんツールとかライブラリが大量にあって,中途半端な言語では太刀打ちできない凄みがある.
そういう百戦錬磨の悪女的な魅力が,我々駄目人間の心を掴んで離さないのでしょう.一つ一つはそれほど魅力は無くて,むしろ見た目とかいろいろ,たるんでいたりくたびれていたり,欠点だらけなのに.
いや,ま,面倒ごとが少なくて若くて綺麗なピチピチ女子高生 (C# とか) が好きって人の気持ちもわからなくはないのですがねぇ.
やっぱりいろいろな人に長年使い込まれた言語は,いろいろ深くて渋くて味わい深いのです.あと,いろいろスゴイテクニックも豊富に蓄積されていますしね.中途半端に触ると深みにはまったり,火傷したりもしますが.
(何の話やねん)
|