* Essenのサンプルコード-01-0001 -(by [[K]], 2016.10.13) ** 註 -Essenは現在開発途上で、以下のプログラムはまだ現バージョンの処理系では動きません。 -「理想としてこういう記述ができる言語を目指している」ということだとお考えください。 ** (1) 2から1万までの範囲で素数の個数を数える -[pure-Essen版: 2016.10.13] 0001: for {i = 2}{i <= 10000}{i++} { // init(a, 0) だけでできるようにしたい 0002: a[i] = 0 0003: } 0004: c = 0 0005: for {i = 2}{i <= 10000}{i++} { 0006: if (a[i] == 1) { continue } 0007: c++; 0008: for {j = i * 2}{j <= 10000}{j += i} { 0009: a[j] = 1 0010: } 0011: } 0012: print(c) --[解説] --Essenではmain関数の宣言やincludeを書かずとも簡単なことはできる。 --Essenでは変数の宣言はいらない。1行目から3行目で値を初期化しているが、これももっと簡便な表記を提供すべきだと思っている。 --Essenでは基本的にセミコロンはいらない。あってもいいがなくていい。ただし例外として7行目にはセミコロンを付けた。これは次のforに対する++なのかcに対する++なのかが混乱するかもしれないと心配したからである。 --Essenではifやforの中身が1文しかなくても、中カッコを省略はできない。 --このサンプルでは、新出ローカル変数に対して#を省略してもエラーにならないモードを前提にしている(簡便のため)。 -[インラインC版: 2016.10.13] 0001: f = inline.c {{ 0002: void entry(int *p) 0003: { 0004: static char a[10001]; // Essenでは大きなスタック変数は取れない 0005: int i, j, c = 0; 0006: for (i = 2; i <= 10000; i++) 0007: a[i] = 0; 0008: for (i = 2; i <= 10000; i++) { 0009: if (a[i] != 0) continue; 0010: c++; 0011: for (j = i * 2; j <= 10000; j += i) 0012: a[j] = 1; 0013: } 0014: *p = c; 0015: } 0016: }} 0017: c = zerobyte(4) 0018: f(c) 0019: print(getBl32(c, "c").c) --[解説] --1行目から16行目は関数宣言である。だから一度実行すれば何度も実行しなくてもよいものではある。 --このサンプルでは、新出ローカル変数に対して#を省略してもエラーにならないモードを前提にしている(簡便のため)。 --getBl32という関数は、第一引数にバイト列を取り、第二引数にフォーマット文字列を取る。上記の例だと「32bitの整数にcという名前を付ける」という意味になる。ということで、構造体が作られてメンバ名cに値が入る。 * こめんと欄 #comment