Go to the first, previous, next, last section, table of contents.

## 文法 (C 言語との違い)

Asir の文法は C 言語に準拠している. おもな相違点は次の通りである. 以下で, 変数とは Asir における プログラム用の変数, すなわち大文字で始まる文字列を意味することとする.

- 変数の型がない.
  既に説明したとおり, Asir で扱われる対象自身は全て何らかの型 を持っている. しかし, プログラム変数自体は, どのような対象でも 代入できるという意味で型がないのである.

      [0] A = 1;
      1
      [1] type(A);
      1
      [2] A = [1,2,3];
      [1,2,3]
      [3] type(A);
      4

- 函数内の変数は, デフォルトでは仮引数をこめてすべて局所変数.
  ただし, `extern` 宣言された変数は, トップレベルにおける大域変数となる. すなわち, 変数のスコープは大域変数と局所変数の 2 種類に単純化されている. トップレベル, すなわちプロンプトに対して入力された変数は全て大域変数 として登録される. また函数内では次のいずれかとなる.
  1. 函数が定義されるファイルにおいて, その函数定義以前に, ある 変数が `extern` 宣言されている場合, 函数内のその変数も大域変数 として扱われる.
  2. `extern` 宣言されていない変数はその函数に局所的となる.

      % cat afo
      def afo() { return A;}
      extern A$
      def bfo() { return A;}
      end$
      % asir
      [0] load("afo")$
      [5] A = 1;
      1
      [6] afo();
      0
      [7] bfo();
      1

- プログラム変数は大文字で始まり, 不定元, 函数は小文字で始まる.
  この点は, 既存の数式処理システムのほとんどと異なる点である. Asir がこの仕様を採用したのは, ユーザが不定元のつもりで使用した変数に なんらかの値が代入されていた場合に混乱を招く, という, 既存の システムにありがちな状況を避けるためである.
- `switch` 文, `goto` がない.
  `goto` がないため, 多重ループを一度に抜けるのがやや複雑になる場合がある.
- コンマ式は, `for (A;B;C)` または, `while(A)` の `A`, `B`, `C` にのみ使うことができる.
  これは, リストを正式なオブジェクトとして加えたことによる.

以上は制限であるが, 拡張としては次の点が挙げられる.

- 有理式に対する計算を, 通常の C における計算と同様にできる.
- リストが扱える. 構造体を用いるまでもない要素の集合体を, リストで表すことができ, C で直接書く場合に比較してプログラムが短く, 読みやすく書ける.
- ユーザ定義函数における一行ヘルプ. Emacs-Lisp に類似した機能である. 詳しくは, See section ユーザ定義函数 を見よ.
- ユーザ定義函数におけるオプション指定. これに関しては, See section オプション指定.

Asir では次の語句がキーワードとして定められている.

- C 言語に由来: `break`, `continue`, `do`, `else`, `extern`, `for`, `if`, `return`, `static`, `struct`, `while`
- C 言語からの拡張: `def`, `endmodule`, `function`, `global`, `local`, `localf`, `module`
- 函数: `car`, `cdr`, `getopt`, `newstruct`, `map`, `pari`, `quote`, `recmap`, `timer`

Go to the first, previous, next, last section, table of contents.