;; change to noffi to make work with sbcl 2.5.3 ;; I redefined defcfun to be this and it seems to work: #+SBCL (defmacro defcfun ((name res-type) lambda-list &body body) ;; ### Box as a :FUNCTION! (let ((pascal-name (intern (format nil "(PASCAL-FUNCTION ~A)" (verbatim name)) (symbol-package name))) (temps (mapcar (lambda (x) (declare (ignore x)) (gensym "ARG.")) lambda-list)) (ftype (make-function-type res-type (mapcar #'(lambda (type) ;; ### `(decl nil (nil ,type))) (mapcar #'cadr lambda-list))))) `(progn (defparameter ,pascal-name (sb-alien::alien-lambda (:cdecl ,(foreign-type-for-funcall res-type)) ,(mapcar (lambda (temp parameter) (destructuring-bind (var type) parameter (declare (ignore var)) (list temp (foreign-type-for-funcall type)))) temps lambda-list) (unbox-to-native-object (let ,(mapcar (lambda (parameter temp) (destructuring-bind (var type) parameter `(,var (box-native-object ,temp ',type)))) lambda-list temps) ,@body) ',res-type) )) (define-symbol-macro ,name (cons-ptr (sb-alien:alien-sap ,pascal-name) 0 (make-pointer-type ',ftype)))))) ;; --clothespin