小さなスクリプト言語を開発し、最初のネイティブライブラリバインディングの作成を開始しました。これは、スクリプト言語のネイティブ拡張を書いているのは事実上初めてなので、概念的な問題に遭遇しました。
この言語から使用できるように、一般的なライブラリのグルーコードを書きたいと思います。私が書いたエンジンの設計により、これはstruct
、仮想マシン、および関数ポインタ。
したがって、ネイティブバインディングは実際には単なるグローバル配列変数であり、ここで明らかに(できれば適切な)名前を付ける必要があります。Cでは、myscript_parse_source()
またはのように、関数名の前にカスタムプレフィックスを付加することにより、自分の関数を「名前空間」に配置するのが慣用的myscript_run_bytecode()
です。カスタム名は、理想的には、それが属しているライブラリの名前を表すものとします。ここで混乱が生じます。
のバインディングを書いているとしましょうlibcURL
。この場合、次のように拡張ライブラリを呼び出すのが合理的curl_myscript_binding
です。
MYSCRIPT_API const MyScriptExtFunc curl_myscript_lib[10];
しかし、これはcurl
名前空間と衝突します。(私はそれを呼び出すことさえ考えましたcurlmyscript_lib
が、残念ながらlibcURLはcurl_
プレフィックスのみを使用していません-パブリックAPIにはCURLCODE_*
やなどのマクロが含まれているCURLOPT_*
ため、これにより名前空間も乱雑になると思います。)
もう1つのオプションはmyscript_curl_lib
、それをとして宣言することですが、バインディングを作成するのが私だけである場合にのみ有効です(自分の名前空間で何をしているのかわかっているため)。他のコントリビューターが独自のネイティブバインディングを追加し始めるとすぐに、myscript
名前空間が乱雑になります。(私はいくつかの調査を行いましたが、たとえば、Perl cURLバインディングはこのパターンに従っているようです。それについて私が何を考えるべきかわかりません...)
では、変数に名前を付けるにはどうすればよいでしょうか。従うべき一般的なガイドラインはありますか?
SomeLang_register_extension("curl", "H2CO3", "000.001.000", the_extension)
、wherethe_extension
は拡張構造を指しますが、グローバルには表示されません。言語は内部データ構造を保持し、名前、バージョン、作成者で拡張機能を並べ替えます。