Next: Up: Previous:

外部手続きの宣言法

外部手続きをABCL/fから宣言するにはdeclare-external宣言を使う. 例えば, 現在時刻を整数で返してくるようなC関数current-time ()を ABCL/fから呼び出したいとする. その場合次のように書く.
(declare-external current-time () 
  (declare (reply-type fixnum))
  :lang C "current_time")
最後の行を除いたヘッダ部分はちょうどdefunの文法と同じように, 引 数および返り値を宣言すれば良い.

最後の行の, :lang CはこれがC関数として実現されること, および "current-time"はその関数のC内における名前が"current-time"であ ることを宣言している. :langの後ろに書けるのは, CまたはC++のどち らかである.

こうして宣言されたC関数は通常のABCL/f関数と同様に呼び出すことができる. つまり,

(current-time)
とすることで, C関数"current-time"を呼び出すことができる. ただし future呼び出しやremoteな呼び出しはできない. それをするにはその 外部関数を呼び出すだけの小さなABCL/f関数を(defunを使って)書け ば良い. 例えば以下は, future呼びだし可能なcurrent-timeの定義である.
(declare-external c-current-time () 
  (declare (reply-type fixnum))
  :lang C "current_time")

(defun current-time ()
  (declare (reply-type fixnum))
  (c-current-time))

このように宣言された関数は最後にリンクを行なう時に適切にリンクされれれ ば使用することができる. したがって, CやC++の標準ライブラリに含まれる関 数をABCL/fから使用するには単にこの宣言を書くだけで良い. 例えば,

(declare-external
 random () (declare (reply-type fixnum))
 :lang C "random")
は, Cのライブラリ関数"random ()"を呼び出すのに 必要な全ての記述である.



Mitsubishi Research Institute,Inc.
Thu Feb 27 20:14:12 JST 1997