next up previous contents
Next: 5 El análisis léxico Up: Comunicación entre LE-LISP y Previous: Un pequeño ejemplo

Llamando al sistema LE-LISP desde C

 

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:

  1. Se llama al sistema LE-LISP.
  2. Desde LE-LISP se llama a una función C enlazada dinámicamente.
  3. Dicha función C llama al sistema LE-LISP.

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:

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_Tgif.

Los pasos generales a seguir para llamar a una función LE-LISP desde una función escrita en lenguaje C son los siguientes:

  1. Obtener el símbolo correspondiente a la función LE-LISP mediante una llamada a getsym.
  2. Situar en la pila los argumentos de la función LE-LISP utilizando para ello la función pusharg. El orden en que se realizan estas operaciones coincide con la posición de los argumentos de la función LE-LISP que se va a llamar, es decir, primero se sitúa el primer argumento de la función LE-LISP, después el segundo, etc.
  3. Llamar a la función LE-LISP mediante lispcall.

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.

ÿ


next up previous contents
Next: 5 El análisis léxico Up: Comunicación entre LE-LISP y Previous: Un pequeño ejemplo

Miguel A. Alonso Pardo
Thu Nov 20 16:47:01 CET 1997