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))