The FLI provides the macro define-foreign-function for creating interfaces to foreign functions. It takes the name of the function you wish to interface to, the argument types the function accepts, and the result type the function returns.
Given the following C declaration to
FahrenheitToCelsius
:
float FahrenheitToCelsius( int );
The FLI interface is as follows:
(fli:define-foreign-function
(fahrenheit-to-celsius "FahrenheitToCelsius" :source)
((fahrenheit :int))
:result-type :float
:language :ansi-c
)
The first argument to define-foreign-function declares that
fahrenheit-to-celsius
is the name of the Lisp function that is generated to interface with the C function
FahrenheitToCelsius
. The
:source
keyword is a directive to the define-foreign-function name mangler that Fahrenheit
ToCelsius
is the name of the C function as seen in the source files. On some platforms the actual symbol name available in the foreign object file we are inferfacing with could include character prefixes such as "
.
" and "
_
", and so the
:source
keyword encoding allows you to write cross-platform portable foreign language interfaces.
The second argument to define-foreign-function,
((fahrenheit :int))
, is the argument list for the foreign function. In this case, only one argument is required. The first part of each argument descriptor is the lambda argument name. The rest of the argument describes the type of argument we are trying to interface to and how the conversion from Lisp to C is performed. In this case the foreign type
:int
specifies that we are interfacing between a Lisp integer and a C type "int".
The
:result-type
keyword tells us that the conversion required between the C function and Lisp uses the foreign type
:float
. This tells Lisp that C will return a result of type "float", which needs to be converted to a Lisp single-float.
The final keyword argument,
:language
, specifies which language the foreign function was written in. In this case the example uses ANSI C. This keyword determines how single-floating point values are passed to and returned from C functions as described for define-foreign-function.