Essenのサンプルコード-01-0001

  • (by K, 2016.10.13)

  • Essenは現在開発途上で、以下のプログラムはまだ現バージョンの処理系では動きません。
  • 「理想としてこういう記述ができる言語を目指している」ということだとお考えください。

(1) 2から1万までの範囲で素数の個数を数える

  • [pure-Essen版: 2016.10.14]
    0001: c = 0
    0002: init(a, 0)
    0003: for (i, 2, 10001) { // 変数名, 初期値, 修了値
    0004:   if (a[i] == 1) { continue }
    0005:   c++;
    0006:   for (j, i * 2, 10001, i) {  // 変数名, 初期値, 修了値, 増分
    0007:     a[j] = 1
    0008:   }
    0009: }
    0010: print(c)
    • [解説]
    • Essenではmain関数の宣言やincludeを書かずとも簡単なことはできる。
    • Essenでは変数の宣言はいらない。2行目にはinit()なるものがあって、なにやら宣言しているようにも見えるかもしれないが、これは for (i, 2, 10001) {a[i] = 0} の代用である。
    • Essenでは基本的にセミコロンはいらない。あってもいいがなくてもいい。ただし例外として5行目にはセミコロンを付けた。これは次のforに対する++なのかcに対する++なのかが混乱するかもしれないと心配したからである。
    • Essenではifやforの中身が1文しかなくても、中カッコを省略はできない。
    • このサンプルでは、新出ローカル変数に対して#を省略してもエラーにならないモードを前提にしている(簡便のため)。
    • [補足1] initは中身に何も格納されていない配列(もしくは構造体)を作る。そして未定義の場合は何を返せばいいかというデフォルト値を設定する。
  • [インラインC版: 2016.10.14]
    0001: f = inline.gcc {{
    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に値が入る。

こめんと欄


コメントお名前NameLink

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-10-14 (金) 00:29:04 (2750d)