acl4の開発ログ #03
ここまでのもくじ
2026.01.01(木) #0
- ずっと悩んでいました。機能的にやりたいことを実現するのは全然難しくないのです。
- でもそれをかっこよく書くことができませんでした。どうやってもドンくさいのです。
- しかし今日になって、やっといい感じに書く方法を見つけました。
func(a, b, .c) → func(a, b, ADot1(c))
int func(int a, double b, .char *c) → int func(int a, double b, ADot1(char *c))
→ つまりドット1つから書き始めると、それはカッコ閉じか、次のコンマまでADot1(...) で囲われた形に置換されます。
..int d, e; → ADot2(int d, e;)
→ ドット2つから書き始めると、セミコロンまでを ADot2(...) で囲われた形に置換されます。
func.(a, b, c) → func(ADotArg1, a, b, c)
→ 関数呼び出しの際にドットを入れておくと、ADotArg1という引数を勝手に追加します。
func(,a,,c) → func(a, c)
→ 関数呼び出しなどで、不要なコンマはすべて自動で削除されます。
- たったこれだけをやってくれる簡易プリプロセッサがあれば、私がやりたくてたまらないことは実現できそうなのです。
2026.01.01(木) #1
- どんなことがしたいのか?
- [1] 目立たない方法でいくつかの引数を追加で渡したい。具体的に何を渡すかは後で考える。→ func.(...)
- [2] デバッグモードの時だけ追加の引数を渡したい。→ func(a, b, .c)
- [3] デバッグモードの時だけ変数を宣言したい。そのたびに #if ~ #endif を使うのはかっこわるい。→..int d, e;
2026.01.07(水) #0
- やりたいことを簡潔にまとめたい。こんな感じのことをC言語でやりたい(ライブラリ整備とプリプロセッサ拡張で)。
void func()
{
Enter;
MyClass1 *a = new_MyClass1.();
MyClass2 *b = new_MyClass2.(1, 2, 3.4);
aやbを使って色々する.
Leave;
}
// ポイント:
// newしたけどdeleteしなくていい. Leave すると関数内でnewしたものはすべてdeleteされるから.
// Leaveのタイミングで消えてほしくないときは、 newX_...を使う.
// [Q] newしたポインタを誤ってreturnとかで返してしまったら?
// [A] デバッグレベルが2以上なら、エラーで止まってくれるので何の心配もない. エラー個所も簡単にわかる.
// [Q] Leaveをやり忘れてreturnしたらどうなるの?
// [A] デバッグレベルが2以上なら、エラーで止まってくれるので何の心配もない. エラー個所も簡単にわかる.