4.2. The compiler mimics human C programmer

The format of the intermediate C code generated by the ECL compiler is the same as the hand-coded C code of the ECL source programs. For example, supposing that the Lisp source file contains the following function definition:

   (defvar *delta* 2)
   (defun add1 (x) (+ *delta* x))

The compiler generates the following intermediate C code.

   /*	function definition for ADD1                                  */
   static cl_object L1(cl_object V1)
   { VT2 VLEX2 CLSR2
   cl_object value0;
   value0=number_plus(symbol_value(VV[0]),V1); NVALUES=1;
   return value0;
   /*      initialization of this module                                 */
   void init_CODE(cl_object flag)
   { VT1 CLSR1
   cl_object value0;
   if (!FIXNUMP(flag)){
   #ifndef ECL_DYNAMIC_VV
   flag->cblock.data = VV;
   flag->cblock.data_size = VM;
   flag->cblock.data_text = compiler_data_text;
   flag->cblock.data_text_size = compiler_data_text_size;
   #ifdef ECL_DYNAMIC_VV
   VV = Cblock->cblock.data;
   T0= MAKE_FIXNUM(2);
   if(SYM_VAL(T0)!=OBJNULL) cl_setq(VV[0],T0);

The C function L1 implements the Lisp function add1. This relation is established by cl_def_c_function in the initialization function init_CODE, which is invoked at load time. There, the vector VV consists of Lisp objects; VV[0] and VV[1] in this example hold the Lisp symbols *delta* and add1. VM in the definition of L1 is a C macro declared in the corresponding H-file. The actual value of VM is the number of value stack locations used by this module, i.e., 2 in this example. Thus the following macro definition is found in the H-file.

   #define VM 2