/* les de'clarations de types Lisp en C */


typedef int LL←FIX;

typedef int LL←FLOAT;

/* 
   Comme C ne connai↑t pas les types polymorphes, il faut se rabbatre
   sur la de'claration suivante pour les objets Lisp.

typedef union {
     struct LL←SYMBOL *ll←symbol;
     struct LL←CONS   *ll←cons;
     struct LL←STRING *ll←string;
     struct LL←VECTOR *ll←vector;
            LL←FIX     ll←fix;
            LL←FLOAT   ll←float;
} LL←OBJECT;

   C n'autorise he'las pas le passage d'une union comme argument de fonctions
   (me↑me si cette union a pour taille un pointeur!).

   On en arrive donc a` l'horreur suivante\ :
 */

typedef char *LL←OBJECT;

struct LL←SYMBOL {
     LL←OBJECT  ll←cval;
     LL←OBJECT  ll←plist;
     LL←OBJECT  ll←fval;
     LL←OBJECT  ll←alink;
     LL←OBJECT  ll←pkgc;
     LL←OBJECT  ll←oval;
     char       ll←ftype;
     char       ll←ptype;
     short      ll←pad;
     LL←OBJECT  ll←pname;

};
struct LL←CONS {
     LL←OBJECT  ll←car;
     LL←OBJECT  ll←cdr;

};
 /*
    C n'autorise pas les structures de taille variable.
 
    Le champ  ll←strfil  contient le premier caracte`re de la chai↑ne
    Lisp. Les autres caracte`res sont conse'cutifs a` celui-ci dans
    la me'moire.

 Exemple\ : impression d'une chai↑ne Lisp
 
   voir(s) struct LL←STRING *s; {
       write(1, &((s->ll←strobj)->ll←strfil), (s->ll←strobj)->strsize);
   }
 */

struct LL←STRING {
     struct {
        struct LL←STRING *ll←strarr;
        int               ll←strsiz;
        char              ll←strfil;
     }  *ll←strobj;
     LL←OBJECT ll←strtyp;
};

 /*
   Me↑me remarque pour le champ ll←vecfil que pour le champ ll←strfil
 */

struct LL←VECTOR {
     struct{
         struct LL←VECTOR *ll←vecarr;
         int               ll←vecsiz;
         LL←OBJECT         ll←vecfil;
     } *ll←vecobj;
     LL←OBJECT ll←vectyp;
};


/* Les types symbolique des arguments */

#define LLT←T 0      /* Objet quelconque */
#define LLT←FIX 1    /* Entier */
#define LLT←FLOAT 2  /* Flottant */
#define LLT←STRING 3 /* Chaine de caracteres */
#define LLT←VECTOR 4 /* Vecteur */

/* Les fonctions permettant l'interface C --->  Lisp */

/*  struct LL←SYMBOL *getsym (pname) char *pname; */
struct LL←SYMBOL *getsym();

/*  void pusharg (ll←type, value) int ll←type; any value; */
void pusharg();

/*  LL←OBJECT lispcall (ll←type, narg, symbol)
         int ll←type, narg; struct LL←SYMBOL *symbol;  */
                                              
LL←OBJECT lispcall();