別スロットの関数名/命令名
■ライブラリの直接呼びされることを想定しないDEFは、COMMON DEFにしないようにしよう
ライブラリとして呼び出したプログラムに、自分のプログラムと同じ関数名/命令名があると、Duplicate functionエラーになる。
SLOT 0
USE 1 ?"A=";A() ?"B=";B() DEF B() RETURN 1 END
COMMON DEF A() RETURN B() END DEF B() RETURN 2 END
この結果は次のように表示される。(当然だが...)
A=2 B=1
仮にSLOT 1のDEF B()が、COMMON DEF B()になっていると、Duplication functionエラーになる。
ちなみにSLOT 0のDEF B()をCOMMON DEF B()にした場合もなぜか同様。
(SLOT 1からSLOT 0はUSEしていないので本来はエラーにならなくてもよさそうだが...)
結論としては、USEされたスロットは全部で一つの名前空間になり、COMMON DEFがある時、その名前と同じDEFが存在してはいけない、ということになる。
これを踏まえてライブラリプログラム作成時の注意事項を以下に書いておく。
以下では、ライブラリプログラムを呼び出すプログラムを「ホストプログラム」と呼ぶことにする。
ほしけんさんのプチコン漢字ライブラリ(KNJLIB)が広く使われるようになり、ライブラリプログラムの中に埋め込んで使うケースも出てきた。
さらにライブラリプログラムを利用したホストプログラムがあり、そのホストプログラムにもKNJLIBを埋め込んであるとする。
すると、ホストプログラム、ライブラリプログラムの両方にKNJLIBが埋め込まれていることになり、名前の衝突が起こってしまう。
この場合、ホストプログラム、ライブラリプログラム双方のKNJLIB部分のCOMMON DEFをDEFに変えることで名前の衝突を回避できる。
もちろんホストプログラム側の対応も必要だが、ライブラリプログラムを公開している方は上記を検討してみていただけると大変助かる。