[Ecls-list] Latest changes

Juan Jose Garcia Ripoll lisp at arrakis.es
Mon Jul 4 02:54:07 UTC 2005


Hi,

a major reorganization of the compiler is taking place. Roughly, the old 
{K,G,E}CL lisp-to-C translators were designed as three layers, called 
T1, T2 and T3, which do

(T1) Process each top-level form and translate it into some internal 
representation (C1FORMs).

(T2) Process the C1FORMs, removing unreachable code and finally 
producing C/C++ code for each form.

(T3) Similar to T2, but for each of the local/global functions which 
were created in each of the toplevel forms.

The major problem is that, as you see, everything is organized around 
the notion of toplevel form. For each of these, there is a processing 
function which compiles it. However, many of the lisp forms can appear 
both as toplevel and non-toplevel: for instance PROGN, SYMBOL-MACROLET, 
or even DEFUN. This leads to a horrible duplication of code and with 
time it has meant that the improvements for non-toplevel forms have not 
been propagated to the toplevel compiler.

Right now I am working on reorganizing/redesigning the compiler so that 
there is no notion of toplevel form, but just of lisp form. The idea is 
that in a near future you will be able to write code as follows

    (with-compiler-environment
       ;; Process all forms into C1 intermediate representation
       (let* ((*compile-toplevel* 'T))
              (c1forms (mapcar #'lisp-to-c1form myforms)))
           ;; Finally output the code.
           (with-compiler-output (:c-file "foo.c" :h-file "foo.h")
             (mapc #'compile-c1form c1forms))))

Of course few people are going to use this, but the idea is that the 
compiler should have a very clear, very simple structure, where the fact 
that a form is toplevel is signified only by a global variable.

As of now, the code duplication in the T1 phase has been eliminated, and 
this has resulted in several fixes for the EVAL-WHEN forms. Furthermore, 
there is no longer need for special processing of DEFUN forms, and 
CLINES is implemented now as a very simple macro. There's still quite a 
lot to do, such as simplifying everything down to the LISP-TO-C1FORM and 
COMPILE-C1FORM interface, introducing new macrology, using the condition 
system for signalling errors/warnings, and unifying the environments for 
toplevel and nontoplevel forms.

Although I am conducting extensive testings before each minor commit, I 
expect some instability in CVS. If this is a concern, please stay with 
code before 3th July 2005.

Regards,

Juanjo




More information about the ecl-devel mailing list