Next: , Previous: callback, Up: Callbacks


defcallback

Syntax

— Macro: defcallback name-and-options return-type arguments &body body => name

name-and-options ::= name | (name &key calling-convention cconv) arguments ::= ({ (arg-name arg-type) }*)

Arguments and Values

name
A symbol naming the callback created.
return-type
The foreign type for the callback's return value.
arg-name
A symbol.
arg-type
A foreign type.
calling-convention
cconv
One of :cdecl (default) or :stdcall.

Description

The macro defcallback defines a Lisp function the can be called from C (but not from Lisp). The arguments passed to this function will be converted to the appropriate Lisp representation and its return value will be converted to its C representation.

This Lisp function can be accessed by the callback macro or the get-callback function.

Portability note: defcallback will not work correctly on some Lisps if it's not a top-level form.

Examples

  (defcfun "qsort" :void
    (base :pointer)
    (nmemb :int)
    (size :int)
    (fun-compar :pointer))
   
  (defcallback < :int ((a :pointer) (b :pointer))
    (let ((x (mem-ref a :int))
          (y (mem-ref b :int)))
      (cond ((> x y) 1)
            ((< x y) -1)
            (t 0))))
   
  CFFI> (with-foreign-object (array :int 10)
          ;; Initialize array.
          (loop for i from 0 and n in '(7 2 10 4 3 5 1 6 9 8)
                do (setf (mem-aref array :int i) n))
          ;; Sort it.
          (qsort array 10 (foreign-type-size :int) (callback <))
          ;; Return it as a list.
          (loop for i from 0 below 10
                collect (mem-aref array :int i)))
  => (1 2 3 4 5 6 7 8 9 10)

See Also

callback
get-callback