とりあえず reader 完成 ?
お〜し,目が痛すぎて (真っ赤に充血),超やる気無いながらも,とりあえず ET 言語フルセットの reader は書けた.
俺って,こんなメチャクチャな C 言語のコードを勢いだけで書いて動かせたんだ… と,我ながらびっくり.だんだん C 言語を思い出してきました !
実数とか,配列とか,情報付き変数とか無名変数とか,いろいろサポート.
(et.h より)
実行例は,こんな感じです.
すごくソースが汚くなってしまったので,公開はそのうちということで… まだ挙動がかなり怪しいですし,コピペの嵐 (C は,関数いっこ追加するのも面倒…) なので w
(ソースを公開もしないで,こんな機械語レベル (低水準のエンコード) の話をいきなりされても,完全にチラシの裏だと思いますが…)
結論 : ノリと勢いだけで機能追加するのは良くない.
C はいろいろな意味で面白すぎる言語なので,ついつい遊んでしまって良くない.
一応,これ以上追加する機能 (オブジェクトのサポート) は無いから,ちょっくらテストケースとか書いて,ちゃんと関数切り分けたり,べた書きしているところを間接的に書いたりして,そろそろ真面目にリファクタリングとかもしないとなぁ.その過程でバグもたぶん取れると思う.
というか,まず,未だにタグに 1 word 使っているのは,さすがにどうにかしないと.word じゃなくて,ちゃんと byte の配列に,可変長で S 式をエンコードするようにする予定.
C 言語の構造体的に書くと,例えば情報付き変数は,今のところは
みたいな感じで,24 byte とか使っているんだけど,これが
みたいな感じになるのかな.
実際は,単なるフラットなバイト配列だけど.このやり方ならば,整数型の大きさとかをいろいろ調節したりもできそう.本気出せば,無限精度にも.
う〜ん,C 言語でテストを自動化するフレームワークって,何か無いのかなぁ…
gcc は,tcl とかで書かれた,謎のテストスィートを使っているらしい.
kkojima日誌 2006-07-01 GCC summit
GDB でやっている人もいるらしい.
GDBによるテスト自動化への試み
# まぁ,「テストなんて邪道 ! テストなんて書いている暇があったら,証明をしろ,証明を ! もしくは仕様 (テスト) を書き上げて,そこからプログラムを自動生成しろ ! 」ってのが,ソフトウェア工学的には正論っちゃ正論なんですが (笑)
さすがに,C 言語は XP にも向いてます ! っていうネタはいろいろ無理があるか w
でもなんというか,C は,本当に中途半端 (それほどポータブルでも,それほどアセンブリでも無い) でどうしようもない言語なんだけど,歴史が長いぶんツールとかライブラリが大量にあって,中途半端な言語では太刀打ちできない凄みがある.
そういう百戦錬磨の悪女的な魅力が,我々駄目人間の心を掴んで離さないのでしょう.一つ一つはそれほど魅力は無くて,むしろ見た目とかいろいろ,たるんでいたりくたびれていたり,欠点だらけなのに.
いや,ま,面倒ごとが少なくて若くて綺麗なピチピチ女子高生 (C# とか) が好きって人の気持ちもわからなくはないのですがねぇ.
やっぱりいろいろな人に長年使い込まれた言語は,いろいろ深くて渋くて味わい深いのです.あと,いろいろスゴイテクニックも豊富に蓄積されていますしね.中途半端に触ると深みにはまったり,火傷したりもしますが.
(何の話やねん)
俺って,こんなメチャクチャな 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# とか) が好きって人の気持ちもわからなくはないのですがねぇ.
やっぱりいろいろな人に長年使い込まれた言語は,いろいろ深くて渋くて味わい深いのです.あと,いろいろスゴイテクニックも豊富に蓄積されていますしね.中途半端に触ると深みにはまったり,火傷したりもしますが.
(何の話やねん)
