A symbol naming the Lisp function to be created.
The
defcfun macro provides a declarative interface for defining Lisp functions that call foreign functions.
When one of
lisp-name or
foreign-name is omitted, the other is
automatically derived using the following rules:
- Foreign names are converted to Lisp names by uppercasing and replacing underscores with hyphens.
- Lisp names are converted to foreign names by lowercasing and replacing hyphens with underscores.
If you place the symbol
&rest in the end of the argument list after the fixed arguments,
defcfun will treat the foreign function as a variadic
function. The variadic arguments should be passed in a way similar to what
foreign-funcall would expect. Unlike
foreign-funcall though,
defcfun will take care of doing argument promotion. Note that in this case
defcfun will generate a Lisp macro instead of a function and will only work for Lisps that support
foreign-funcall.
Examples
(defcfun "strlen" :int
"Calculate the length of a string."
(n :string))
CFFI> (strlen "123")
=> 3
(defcfun ("abs" c-abs) :int (n :int))
CFFI> (c-abs -42)
=> 42
Function without arguments:
(defcfun "rand" :int)
CFFI> (rand)
=> 1804289383
Variadic function example:
(defcfun "sprintf" :int
(str :pointer)
(control :string)
&rest)
CFFI> (with-foreign-pointer-as-string (s 100)
(sprintf s "%c %d %.2f %s" :char 90 :short 42 :float pi
:string "super-locrian"))
=> "A 42 3.14 super-locrian"