Essenの開発メモ#0001
こういうのがやりたい#1
- [問題提起]
- 「フィボナッチ数列を10個表示してください」という課題は、C言語で回答するとこんな感じになるだろう。
void fibo()
{
int a[10], i;
a[0] = 0;
a[1] = 1;
for (i = 2; i < 10; i++)
a[i] = a[i - 2] + a[i - 1];
for (i = 0; i < 10; i++)
printf("%d ", a[i]);
}
0 1 1 2 3 5 8 13 21 34
- 私はこれが気に入らない。だってこのプログラムは出力結果の活用がしにくいことこの上ない。たしかにこれでも表示はできる。OSのリダイレクト機能を使えばテキストファイルにもできる。・・・でも、これらの数の総和を出したいと思っても、簡単にはできない。
- じゃあこうしたらどうか?
void fibo(int *a, int n)
{
int i;
a[0] = 0;
a[1] = 1;
for (i = 2; i < n; i++)
a[i] = a[i - 2] + a[i - 1];
}
- これはいい。結果が変数に入っているから。
- しかし今度はこれを簡単に表示する手段がない。
- つまり、きれいに出力すれば結果を活用しにくくなるし、かといって活用しやすい形式で出力すれば、今度は結果がぜんぜん見えなくなる。
- [案]
- 標準のprintを強化すればいい。配列を普通に関数の返値にできて、その上で簡単に配列や構造体を表示できればいい。
- まず、Essenでは任意の配列を表示しようとしたときは、それを行に展開する。
>print(a)
0:0,
1:1,
2:1,
3:2,
4:3,
5:5,
6:8,
7:13,
8:21,
9:34,
- この表示が気に入らなければ、インデックス非表示を指示する。
>printf((0:(index:0)), a) // 展開深さ0では、index=0
0,
1,
1,
2,
3,
5,
8,
13,
21,
34,
- 改行を阻止したければ、配列の配列にしてしまう。
>printf((1:(index:0)), (a))
0:(0, 1, 1, 2, 3, 5, 8, 13, 21, 34),
- 完全に望む表示ではないかもしれないけど、それなりに近づけることはできた。
- もっとがんばればもっとできるかもしれない。
>printf((0:(index:0), 1:(index:0 separator:" ")), (a))
(0 1 1 2 3 5 8 13 21 34),
- っていうか、配列の添え字が整数で0から始まっていて1ずつ増えるのなら、index=0をデフォルトにしてもいいかもしれない。
- なんにせよ、printfでどこまでやるかはそんなに難しく考えなくていいと思う。徹底的に細かくやりたければ、自前でforループをまわして好きなように表示すればいいだけのことなんだから。
- 要点は、標準のprintだけでもそれなりには表示できること。それが達成されていれば、ユーザはがんばって表示しようとはしなくなる。そうなれば表示ではなく結果を返すように仕向けやすい。
- あ、こうすればいいんじゃないか?
>printf((0:(separator:" ")), a)
0 1 1 2 3 5 8 13 21 34
こういうのがやりたい#2
- しかし上記を見ていると、カッコがやたらと多い。私はそれは好みではない。どうにかしてカッコを減らしたい。カッコが多いとそれだけでややこしそうに見える。
- 今のところEssenでは、小カッコと角カッコを区別しないので、
>printf([[separator:" "]], a)
- のように書くことはできる。しかしなあ、それでもややこしい感じがするのは否めない。
- どうしたらいいのかなー。
- 簡単に構造体・配列が作れるからって、それを多用するのがいけなかったのか。
- それともカッコ以外で構造体・配列が作れるようになるべきなのか。
- うーむー、まだ名案がない・・・。
- printfの引数の範囲を明示しなくてもいいことにするか?(セミコロンまで)
>printf [[separator:" "]], a;
- こういう書き方を許すと、引数の範囲を明示したいときに
>(printf [[separator:" "]], a)
- とかやるようになって、さらにLispっぽい書き方が選べるようになる(笑)。
こめんと欄
|