(define-ffi-function NAME C-NAME RETURN ARGS LIBRARY &optional DOCSTRING)
.
This is a macro that defines a new Lisp function. It takes as many arguments as
were in ARGS
. While there is internal support for varargs functions, it is
not exposed by define-ffi-function
.
NAME
is the symbol to define. C-NAME
is a string, the name of the
underlying C function.
RETURN
describes the return type of the C function and ARGS
describes the
argument types. RETURN
may either be a type-keyword
or a pair of
(type-keyword docstring)
. Similarly, ARGS
may either be a list of
type-keyword
or a list of (type-keyword name &optional arg-docstring)
.
LIBRARY
is the library where the C function should be found. This is just a
symbol, most usually defined with define-ffi-library
.
Using define-ffi-function
, we can define Elisp-accessible functions as such:
(define-ffi-function test-function "test_function" :int nil test.so) (test-function) ;=> 27
(define-ffi-function test-function-char "test_function" :char nil test.so) (test-function-char) ;=> 27
(define-ffi-function test-c-string "test_c_string" :pointer nil test.so) (test-c-string) ; => user-ptr
(define-ffi-function test-add "test_add" :int [:int :int] test.so) (test-add 23 -23) ;=> 0
However, the docstring for test-add
is not that great.
(describe-function 'test-add)
There is, however, a more sophisticated way to define a function that leads to better docstrings.
(define-ffi-function test-add "test_add" (:int "The sum of two numbers") ((:int a "A: The first number") (:int b "B: The second number")) test.so "Return the sum of A and B.") (test-add 23 -23) ;=> 0
The benefit of this more verbose signature is better docstrings for the functions in elisp.
(describe-function 'test-add)