[トップ][ノート][編集履歴][一覧][最近の更新][->English]

Scheme/Gauche/Gauche-lazy-ffi

Category of Scheme

Gaucheから共有ライブラリ内の関数を呼び出します。 コードの一部はChickenのeggs:lazy-ffiから頂いています。

必要なもの

動作環境

libffiがインストールできて、dlcfn(3)が動くなら動作可能だと思います。

配布物

使用法

CでのポインタをGaucheから扱うには、 lazy-ffiパッケージにて組み込まれる、オブジェクト<c-pointer>を使用します。

lazy-ffi:lazy-ffi? obj

objが<lazy-ffi>オブジェクトならば#tを返します。

lazy-ffi:strerr

最後に失敗した操作に対するエラー文字列を返します。

lazy-ffi:open solib

solibを開きます。成功するとlazy-ffiオブジェクトを返し、失敗すると#fを返します。

libm.soを開いて<lazy-ffi>オブジェクトをlibmで呼び出せるようにします。

 (define libm (lazy-ffi:open "libm.so"))

lazy-ffi:close obj

objを閉じます。

lazy-ffi:function-to-pointer obj pred

obj内から関数名predを検索し、predのアドレスを<c-pointer>オブジェクトにして返します。 失敗すると#fを返します。

lazy-ffi:function obj pred item

obj内のpredを呼び出します。 predは文字列、または<c-pointer>オブジェクトを指定します。 itemはオブジェクト単体、 またはtype objectのキーワード形式でtypeには以下のものを指定します。 オブジェクト単体のみの場合、自動的に型を判定します。

keywordが:returnのとき以外は引数のリストを指定したことになります。

:returnが省略された場合、返り値はvoidを指定したことになります。

キーワード 意味
:return predの返り値
:boolean int (1 or 0)
:float, :double double
:char char
:pointer :locative <c-pointer>
:string, :symbol char *
:scheme-object ScmObj
(and-let* ((libm (lazy-ffi:open "libm.so.2.0")))
          (lazy-ffi:function libm "sin" :return :double :double 1.0))

lazy-ffi:pointer? obj

objが<c-pointer>オブジェクトならば#tを返します。

lazy-ffi:pointer-address obj

<c-pointer>オブジェクトobjの値を整数で返します。

lazy-ffi:make-null-pointer

nullポインタを持つ<c-pointer>オブジェクトを生成します。

lazy-ffi:make-pointer int

ポインタの値がintである<c-pointer>オブジェクトを生成します。

lazy-ffi:allocate-foreign-object size

sizeの大きさのメモリを持った<c-pointer>オブジェクトを返します。

lazy-ffi:allocate-foreign-string size

sizeの大きさの文字列用のメモリを持った<c-pointer>オブジェクトを返します。

lazy-ffi:free-foreign-object obj

<c-pointer>オブジェクトobjに割り当てられたメモリを開放します。

lazy-ffi:convert-from-foreign-string obj

<c-pointer>オブジェクトobjの保持するメモリ領域を文字列にして返します。

lazy-ffi:convert-to-foreign-string string

文字列stringを内部に保持するポインタオブジェクトを返します。

lazy-ffi:pointer-to-TAGvector size obj

<c-pointer>オブジェクトobjの保持するポインタの始めからsize分をTAGvectorに変換して返します。

lazy-ffi:TAGvector-to-pointer obj

TAGvectorオブジェクトobjを<c-pointer>オブジェクトに変換して返します。

注意

<c-pointer>によって確保したメモリはGCの管理から外れるため、 クロージャから出るときに明示的にlazy-ffi:free-foreign-objectを呼ぶ必要があります。 扱いには注意してください。