next up previous contents index
: 変数名の衝突 : ライブラリの書き方 : ライブラリの書き方   目次   索引

関数名の衝突の回避

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 への変換などの演算

このファイルで定義されている関数名は, 数学的に自然なものが使われている. Asir contrib の各関数の本体は taka_print_tex_form などと プログラムを書いた人の識別子 (この場合は taka) からはじまる 名前がついてる. Asir contrib のトップレベルの関数からは このような名前の関数が呼ばれている. たとえば print_tex_form は, taka_print_tex_form を現在は呼んでいる. 他によりよい実装がでたら, そちらを呼ぶようにすればいいだけでトップレベルの 関数名 print_tex_form はかわらない.



Nobuki Takayama 平成15年9月12日