simple exmaple cffi
CFFI入門で紹介されている方法をubuntu7.10でより単純化して動かしてみた
以下のfloat.cをcffiを使ってcommon lispから呼ぶ
//float.c #include <stdio.h> int float_to_bits (float f) { return *((int*)&f); }
以下でshared libのfloat.soができる(参考 )
$gcc -Wall -fPIC -shared -o float.so float.c
cffiを導入する
$sudo apt-get install clisp cl-cffi cl-asdf
clispを起動して以下を行う
$clisp (asdf:oos 'asdf:load-op :cffi) (cffi::define-foreign-library libfloat (:unix"float.so") (:windows "float.dll")) (cffi::load-foreign-library 'libfloat) (cffi::defcfun ("float_to_bits" float-to-bits) :int (f :float))
以上でfloat-to-bits を次のようにして呼べるようになった。
>(float-to-bits 10.0) 1092616192
ここにも簡単な例がある
http://d.hatena.ne.jp/masatoi/20070228/1172652335
もう少しだけ複雑にしたバージョン
$clisp (asdf:oos 'asdf:load-op :cffi) (defpackage :example.cffi (:use #:cl #:cffi) (:export #:float-to-bits )) (in-package :example.cffi) (define-foreign-library libfloat (:unix"float.so") (:windows "float.dll")) (defun load-directory () (let ((here #.(or *compile-file-truename* *load-truename*))) (make-pathname :directory (pathname-directory here)))) (let ((*foreign-library-directories* (list (load-directory)))) (load-foreign-library 'libfloat)) (defcfun ("float_to_bits" float-to-bits) :int (f :float))