Asir においては, 組み込み関数と同名の関数を定義することはできない.
[101] def fctr(X) { print("afo");}
def : builtin function fctr() cannot be redefined.
定義しようとする関数が, 組み込み関数としてもう存在しているかどうかは,
関数 flist() の出力を見ればわかるが, とりあえずダミーで定義して
みるのが最も簡単だろう. (flist() の出力をみるのは大変である.)
とは言え, 実際に困るのは, 既にあるライブラリ中のユーザ関数名との衝突であ
る. あるセッションで, 既に定義されているユーザ関数との衝突は,
ctrl("verbose",1) により見ることができる.
[183] def afo(X) { print("afo");}
[184] def afo(X) { print("bfo");}
Warning : afo() redefined.
[185]
しかし, この方法は読み込んであるファイルにしか対応できないので, 結局の
ところ, 関数名に固有の prefix をつけるのが現実的であろう. 例えば, 関数
名は, noro_ のように, 書いた本人を識別できるような文字列で始ま
るようにする. poly_ やmatrix_ のように数学的に意味がある
prefix を使うのは自然なように見えるが, これらは「当たる」危険性が高い
ので避けたほうがよい.
以上のような方法の他にモジュール機能を用いて自分の書いたライブラリを
カプセル化してしまう方法がある.
これについては, 次の節で解説する.
これに関連して, Asir Contrib プロジェクトにおいて
種々のシステムを混用する際の関数名の
混乱を避けるために, 著者 (T) が OpenXM 版のソースにおいて
OpenXM/src/asir-contrib/packages/src/names.rr なるテンプレートを準備
している.
そこでは, 共通関数名仕様に基いて, それを実現する Asir プログラム
が書かれている.
OpenXM 版の Risa/Asir (OpenXM/Risa/Asir
)
では asir contrib ライブラリを起動時に自動的に読み込む.
names.rr に定義されている関数が,
OpenXM/Risa/Asir の asir contrib のトップレベルの関数
である.
たとえば以下のようなきまりで, 関数名がついている.
| base_ で始まる関数 | 置き換えなど基本的な種々の演算 |
| matrix_ で始まる関数 | 行列に関する種々の演算 |
| print_ で始まる関数 | TeX への変換などの演算 |