uiop:symbol-call
(uiop:symbol-call package name &rest arguments)
UIOP の遅延束縛呼び出しです: 実行時に package の中から name を探し、arguments
に適用します。どちらも指定子で、キーワード・シンボル・文字列のいずれでも構いません。
依存関係に持たない(まだロードされていないかもしれない)システムをライブラリが呼ぶ
ための手段であり、直接呼び出しではなく実行時の名前引きとして綴られているのはその
ためです。
存在しないパッケージや、そのパッケージが持たない名前を渡すとエラーを送出します --
呼び出し側は結果をそのまま適用しようとしているので、nil を返して 1 フレーム先で
失敗させるよりエラーが正しい答えです。
関数値としても使えます。実際のイディオムはたいていこの形です: 複数のバックエンドの
いずれかへ振り分けるライブラリは、受け取った引数列に #'uiop:symbol-call を
apply し、フォームを読むだけでパッケージの存在を要求しないようバックエンド名を
未インターンシンボルで綴ります。
こうした振り分けの各腕は個別に解決されるので、このプログラムが持たないバックエンドを 名指しする腕があっても、実行されたときの呼び出し時エラーで済み、それ以外では何の コストもかかりません。
バックエンドサポート
- インタプリタ: 完全サポート(生きたパッケージ表と関数表に対して名前を引きます)。
- JVM と WASM: 完全サポート -- 実行時にインターンしたシンボルの
funcallと同様に、コンパイル済み名前レジストリを通じて遅延束縛され、#'uiop:symbol-callも他の関数と同じく値として扱えます。存在しない パッケージは従来どおりエラーを送出します。存在しない名前は、名前引きの時点 ではなく呼び出し時に(未定義関数エラーとして)エラーになります -- インタプリタ 自身の検査よりわずかに遅いものの、同じように大きな音で失敗します。