Chapter 5. Data and control flow

5.1. LET, FLET, LABELS and function lambda list ANSI addendum
5.2. Minimal compilation
5.3. Function types
5.4. C Calling conventions
5.5. C Reference
ecl_bds_bind — Bind a special variable
ecl_bds_unwind — Undo one variable binding
ecl_setq — C equivalent of setq
ecl_symbol_value — C equivalent of symbol-value
ecl_va_arg — Accepting a variable number of arguments
ecl_nth_value, ecl_nvalues — Accessing output values
ecl_return0, ecl_return1, ... — Returning multiple values
ECL_BLOCK_BEGIN — C macro for block
ECL_CATCH_BEGIN — C macro for catch
ECL_UNWIND_PROTECT_BEGIN — C macro for unwind-protect
ANSI Dictionary — Common Lisp and C equivalence

5.1. LET, FLET, LABELS and function lambda list ANSI addendum

ANSI doesn't specify what should happen if any of the LET, FLET and LABELS blocks contain many bindings (or functions) sharing the same name. Because the behavior varies between the implementations and the programmer can't rely on the spec, ECL signals an error if such situation occurs. This is also very unlikely, that programmer does that intentionally, since there is no valid use-case for it.

Moreover, while ANSI defines lambda list parameters in the terms of LET*, when used in function context programmer can't provide an initialization forms for required parameters. If required parameters share the same name error is signalled.

Described behavior is present in ECL since version 16.0.0. Previously the LET operator were using first binding, while lambda lists used last occurrence. Both FLET and LABELS were singalling an error if C compiler was used and used last binding as visible one when bytecmp was used.