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

### プリプロセッサ

Asir のユーザ言語は C 言語を模したものである. C の特徴として, プリプロセッサ `cpp` によるマクロ展開, ファイルのインクルード があるが, Asir においてもユーザ言語ファイルの読み込みの際 `cpp` を通してから読み込むこととした. これによりユーザ言語 ファイル中で `#include`, `#define`, `#if` などが使える.

- `#include`
  UNIX では インクルードファイルは, Asir のライブラリディレクトリ (環境変数 ASIR_LIBDIR で指定されたディレクトリ) と `#include` が書かれているファイルと同じディレクトリをサーチする. UNIX 以外では `cpp` に特に引数を渡さないため, `#include` が書かれているファイルと同じディレクトリのみをサーチする.
- `#define`
  これは, C におけるのと全く同様に用いることができる.
- `#if`
  `/*`, `*/` によるコメントは入れ子にできないので, プログラム の大きな部分をコメントアウトする際に, `#if 0`, `#endif` を使うと便利である.

次の例は, ``defs.h'` にあるマクロ定義である.

    #define ZERO 0
    #define NUM 1
    #define POLY 2
    #define RAT 3
    #define LIST 4
    #define VECT 5
    #define MAT 6
    #define STR 7
    #define N_Q 0
    #define N_R 1
    #define N_A 2
    #define N_B 3
    #define N_C 4
    #define V_IND 0
    #define V_UC 1
    #define V_PF 2
    #define V_SR 3
    #define isnum(a) (type(a)==NUM)
    #define ispoly(a) (type(a)==POLY)
    #define israt(a) (type(a)==RAT)
    #define islist(a) (type(a)==LIST)
    #define isvect(a) (type(a)==VECT)
    #define ismat(a) (type(a)==MAT)
    #define isstr(a) (type(a)==STR)
    #define FIRST(L) (car(L))
    #define SECOND(L) (car(cdr(L)))
    #define THIRD(L) (car(cdr(cdr(L))))
    #define FOURTH(L) (car(cdr(cdr(cdr(L)))))
    #define DEG(a) deg(a,var(a))
    #define LCOEF(a) coef(a,deg(a,var(a)))
    #define LTERM(a) coef(a,deg(a,var(a)))*var(a)^deg(a,var(a))
    #define TT(a) car(car(a))
    #define TS(a) car(cdr(car(a)))
    #define MAX(a,b) ((a)>(b)?(a):(b))

C のプリプロセッサを流用しているため, プリプロセッサは `$` を正しく処理できない. たとえば `LIST` が定義されていても `LIST$`は置換されない. `$` の前に空白をおいて `LIST $` と書かないといけない.

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