En ciertas máquinas, entre las que se encuentran las Sun4, se puede llamar al sistema LE-LISP desde una función C que a su vez había sido llamada desde LE-LISP. Este proceso consta de los tres pasos siguientes:
El límite de la profundidad de estas llamadas mutuas lo marca el agotamiento de los recursos del sistema.
Las funciones C llamadas desde LE-LISP se deben declarar mediante defextern. Desde dichas funciones C se pueden utilizar las siguientes funciones definidas en el fichero lelisp.h:
struct LL_SYMBOL * getsym(s) char *s; { ... /* codigo de getsym */ };
pusharg(type, val) int type; any val; { ... /* codigo de pusharg */ }
LL_OBJECT lispcall(typeres, narg, function) int typeres; int narg; struct LL_SYMBOL *function; { ... /* codigo de lispcall */ }
Los tipos de los argumentos para pusharg así como el valor devuelto por
lispcall deberá ser LLT_FIX, LLT_FLOAT, LLT_STRING,
LLT_VECTOR o LL_T.
Los pasos generales a seguir para llamar a una función LE-LISP desde una función escrita en lenguaje C son los siguientes:
Se permite la realización de llamadas recursivas mutuas entre funciones C y funciones LE-LISP, lo que muestra el alto grado de integración que se puede conseguir entre ambos lenguajes.
En ciertas máquina, incluso se puede pasar el control de una aplicación LE-LISP a una función C. En la distribución de LE-LISP para algunas versiones de Unix se proporciona un fichero llmain.c cuya misión es la de actuar como programa principal para lanzar el sistema LE-LISP. El usuario puede ejecutar todo el código C que desee antes de lanzar LE-LISP. Posteriormente, se puede llamar a funciones C utilizando defextern y el proceso de enlace dinámico o bien retornar al programa principal en C. Este mecanismo se implementa mediante las llamadas al sistema de Unix setjmp y longjmp.
ÿ