You can define simple C-like
typedefs through the
defctype macro. Defining a typedef is as simple as giving
defctype a new name and the name of the type to be wrapped.
;;; Define MY-INT as an alias for the built-in type :INT. (defctype my-int :int)
With this type definition, one can, for instance, declare arguments to
foreign functions as having the type
my-int, and they will be
passed as integers.
CFFI offers another way to define types through
define-foreign-type, a thin wrapper macro around
defclass. As an example, let’s go through the steps needed to
(my-string &key encoding) type. First, we need to
define our type class:
(define-foreign-type my-string-type () ((encoding :reader string-type-encoding :initarg :encoding)) (:actual-type :pointer))
:actual-type class option tells CFFI that this type will
ultimately be passed to and received from foreign code as a
:pointer. Now you need to tell CFFI how to parse a type
specification such as
(my-string :encoding :utf8) into an
my-string-type. We do that with
(define-parse-method my-string (&key (encoding :utf-8)) (make-instance 'my-string-type :encoding encoding))
The next section describes how make this type actually translate between C and Lisp strings.