;; License along with this library; if not, write to the Free Software
;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-;; $Id: ffi.lisp,v 1.16 2005-02-22 17:27:25 espen Exp $
+;; $Id: ffi.lisp,v 1.18 2005-03-13 18:06:51 espen Exp $
(in-package "GLIB")
`(,name ,(alien-type type))))
args))
,(to-alien-form
- `(let (,@(mapcar #'(lambda (arg)
- (destructuring-bind (name type) arg
- `(,name ,(from-alien-form name type))))
- args))
+ `(let (,@(delete nil
+ (mapcar #'(lambda (arg)
+ (destructuring-bind (name type) arg
+ (let ((from-alien
+ (from-alien-form name type)))
+ (unless (eq name from-alien)
+ `(,name ,from-alien)))))
+ args)))
,@body)
return-type))))
(defun callback (af)
(sb-alien:alien-function-sap af))
+#+sbcl
+(deftype callback () 'sb-alien:alien-function)
;;;; Definitons and translations of fundamental types
(declare (ignore type args))
+size-of-float+)
+(defmethod to-alien-form (form (type (eql 'single-float)) &rest args)
+ (declare (ignore type args))
+ `(coerce ,form 'single-float))
+
+(defmethod to-alien-function ((type (eql 'single-float)) &rest args)
+ (declare (ignore type args))
+ #'(lambda (number)
+ (coerce number 'single-float)))
+
(defmethod writer-function ((type (eql 'single-float)) &rest args)
(declare (ignore type args))
#'(lambda (value location &optional (offset 0))
(declare (ignore type args))
+size-of-double+)
+(defmethod to-alien-form (form (type (eql 'double-float)) &rest args)
+ (declare (ignore type args))
+ `(coerce ,form 'double-float))
+
+(defmethod to-alien-function ((type (eql 'double-float)) &rest args)
+ (declare (ignore type args))
+ #'(lambda (number)
+ (coerce number 'double-float)))
+
(defmethod writer-function ((type (eql 'double-float)) &rest args)
(declare (ignore type args))
#'(lambda (value location &optional (offset 0))