The defun preprocessor allows for convenient definition of Lisp functions with optional and keyword arguments and the use of Lisp symbols in ECL’s own C source code. It generates the C code necessary to use optional function arguments and to access symbols in ECL’s builtin symbol table.
Usage:
dpp [in-file [out-file]]
The file named in-file is preprocessed and the output will be written to the file whose name is out-file. If in-file is "-" program is read from standard input, while if out-file is "-" C-program is written to standard output.
The function definition:
@(defun name ({var}*
[&optional {var | (var [initform [svar]])}*]
[&rest var]
[&key {var |
({var | (keyword var)} [initform [svar]])}*
[&allow_other_keys]]
[&aux {var | (var [initform])}*])
C-declaration
@ {
C-body
} @)
name is the name of the lisp function
&optional may be abbreviated as &o.
&rest may be abbreviated as &r.
&key may be abbreviated as &k.
&allow_other_keys may be abbreviated as &aok.
&aux may be abbreviated as &a.
Each variable becomes a C variable.
Each supplied-p parameter becomes a boolean C variable.
Initforms are C expressions. If an expression contains non-alphanumeric characters, it should be surrounded by backquotes (‘).
Function return:
@(return {form}*);
Return function expands into a lexical block {}, so if it’s
used inside if/else, then it should be enclosed, even if we
use sole @(return);, because ";" will be treated as the next
instruction.
Symbols:
@'name'
Expands into a C statement, whole value is the given symbol from symbols_list.h
@[name]
Expands into a C statement, whole value is a fixnum corresponding to the index in the builtin symbols table of the given symbol from symbols_list.h. Used for handling type errors.