EuLisp es un dialecto de Lisp con ámbito estático y dinámico , desarrollado por un grupo informal de usuarios y desarrolladores de Lisp, tanto industriales como académicos, de toda Europa. Los estandarizadores pretendían crear un nuevo Lisp «menos condicionado por el pasado» (en comparación con Common Lisp ) y no tan minimalista como Scheme . Otro objetivo era integrar adecuadamente el paradigma de la programación orientada a objetos . Se trata de un lenguaje de programación de tercera generación .
Origen
El proceso de definición del lenguaje comenzó en una reunión celebrada en París en 1985 y duró varios años. La especificación completa y una primera implementación ( solo interpretada ) estuvieron disponibles en 1990.
Características distintivas
Sus principales características son que es un Lisp-1 (sin espacios de nombres de funciones y variables separados), tiene un sistema orientado a objetos de tipo función genérica al estilo del Common Lisp Object System (CLOS) llamado The EuLisp Object System (TELOS) integrado desde cero, tiene un sistema de módulos incorporado y está definido en capas para promover el uso de Lisp en hardware pequeño, integrado y máquinas educativas. Admite continuaciones , aunque no tan potentemente como Scheme . Tiene un mecanismo de procesos simple y ligero ( hilos ).
Resumen
- Una definición en niveles, actualmente Nivel-0 y Nivel-1
- Módulos basados en entornos léxicos (no de primera clase ) .
- De alcance léxico , con enlace dinámico o tardío disponible en el Nivel 1.
- Un único espacio de nombres para funciones y variables (como en Scheme ).
- Procesos ligeros.
- Un sistema de objetos totalmente integrado con herencia simple en el Nivel 0 y herencia múltiple y protocolo de metaobjetos en el Nivel 1.
- Un sistema de condiciones orientado a objetos .
Implementaciones
Una implementación temprana de EuLisp fue Free and Eventually Eulisp (FEEL). El sucesor de FEEL fue Youtoo ( versiones interpretadas y compiladas ), de la Universidad de Bath en el Reino Unido . [ 3 ] Un intérprete para el nivel básico de EuLisp, nivel 0 , fue escrito por Russell Bradford en XScheme, una implementación de Scheme de David Michael Betz, originalmente llamado EuScheme, pero la versión más reciente se renombró como EuXLisp.para evitar confusiones. También Eu2C, un compilador optimizador de EuLisp, fue creado por Fraunhofer ISST dentro del proyecto APPLY en Alemania..
Se desarrolló un dialecto de EuLisp, denominado Plural EuLisp. Se trataba de EuLisp con extensiones de programación para computación paralela .
Ejemplo
Ejemplo de uso de clases en el algoritmo para resolver el problema de las " Torres de Hanoi ".
( defmodule hanoi ( syntax ( syntax-0 ) import ( level-0 ) export ( hanoi ));;;------------------------------------------------- ;;; Definición de la torre ;;;------------------------------------------------- ( defconstant *max-tower-height* 10 )( defclass <torre> () (( lector de id : tower-id palabra clave: id: ) ( accesor de bloques : tower-blocks )))( defun construir-torre ( x n ) ( etiquetas (( bucle ( i res ) ( si ( = i 0 ) res ( bucle ( - i 1 ) ( cons i res ))))) (( setter torre-bloques ) x ( bucle n ())) x ))( defmethod generic-print (( x <torre> ) ( s <flujo> )) ( sformat s "#<torre ~a: ~a>" ( tower-id x ) ( tower-blocks x )));;;------------------------------------------------- ;;; Acceso a bloques de torres ;;;------------------------------------------------- ( defgeneric push ( x y ))( defmethod push (( x <tower> ) ( y <fpi> )) ( let (( blocks ( tower-blocks x ))) ( if ( or ( null? blocks ) ( < y ( car blocks ))) (( setter tower-blocks ) x ( cons y blocks )) ( error <condition> ( fmt "no se puede empujar un bloque de tamaño ~a en la torre ~a" y x )))))( defgeneric pop ( x ))( defmethod pop (( x <torre> )) ( let (( blocks ( tower-blocks x ))) ( if blocks ( progn (( setter tower-blocks ) x ( cdr blocks )) ( car blocks )) ( error <condición> ( fmt "no se puede extraer un bloque de una torre vacía ~a" x )))));;;------------------------------------------------- ;;; Mover n bloques de la torre x1 a la torre x2 usando x3 como búfer ;;;------------------------------------------------- ( defgeneric move ( n x1 x2 x3 ))( defmethod move (( n <fpi> ) ( x1 <tower> ) ( x2 <tower> ) ( x3 <tower> )) ( if ( = n 1 ) ( progn ( push x2 ( pop x1 )) ( print x1 nl x2 nl x3 nl nl )) ( progn ( move ( - n 1 ) x1 x3 x2 ) ( move 1 x1 x2 x3 ) ( move ( - n 1 ) x3 x2 x1 ))));;;------------------------------------------------- ;;; Inicializa y ejecuta las 'Torres de Hanoi' ;;;------------------------------------------------- ( defun hanoi () ( let (( x1 ( make <tower> id: 0 )) ( x2 ( make <tower> id: 1 )) ( x3 ( make <tower> id: 2 ))) ( build-tower x1 *max-tower-height* ) ( build-tower x2 0 ) ( build-tower x3 0 ) ( print x1 nl x2 nl x3 nl nl ) ( move *max-tower-height* x1 x2 x3 )))( Hanói );;;------------------------------------------------- ) ;; Fin del módulo hanoi ;;;-------------------------------------------------Referencias
- "Una visión general de EuLisp" , editado por Julian Padget, Greg Nuyens y Harry Bretthauer. LISP and Symbolic Computation , volumen 6, números 1-2, 1993, páginas 9-98.
- "Equilibrando el protocolo de metaobjetos de EuLisp" , Harry Bretthauer, Jürgen Kopp, Harley Davis y Keith Playford. LISP and Symbolic Computation , Volumen 6, Número 1-2, agosto de 1993, páginas 119-138.
- "EuLisp en la educación" , R. Bradford y DC DeRoure. LISP y computación simbólica , volumen 6, número 1-2, páginas 99-118.
- "Aplicaciones de Telos" , Peter Broadbery, Christopher Burdorf. LISP and Symbolic Computation , Volumen 6, Número 1–2, agosto de 1993, páginas 139–158.
- "Un enfoque práctico para la inferencia de tipos en EuLisp" , Andreas Kind y Horst Friedrich. LISP and Symbolic Computation , Volumen 6, Número 1-2, agosto de 1993, páginas 159-176.
- "EuLisp Threads: A Concurrency Toolbox" , Neil Berrington, Peter Broadbery, David DeRoure y Julian Padget. LISP and Symbolic Computation , Volumen 6, Número 1-2, agosto de 1993, páginas 177-200.
- "Plural EuLisp: Un modelo paralelo de datos simbólicos primitivos" , Simon Merrall, Julian Padget. LISP and Symbolic Computation , Volumen 6, Número 1–2, agosto de 1993, páginas 201–219.
- "Un recolector de basura conservador para un compilador de EuLisp a ASM/C" , E. Ulrich Kriegel. Taller OOPSLA'93 sobre recolección de basura y gestión de memoria , Washington, DC, 27 de septiembre de 1993.
- "Una implementación de Telos en Common Lisp" Archivado el 14 de febrero de 2006 en Wayback Machine , Object Oriented Systems , vol. 3, pp. 31–49, 1996. ISSN 0969-9767.
Enlaces externos
- Preguntas frecuentes y enlaces de EuLisp
- Versión .99 de la especificación final de 1993 – ( PDF )
- Versión .991 Archivada el 06-03-2012 en Wayback Machine Definición preliminar actualizada no oficial (2010) – ( PDF )
- Fuentes de EuScheme
- EuLisp en GitHub , últimas versiones de: EuLisp (con soporte para 64 bits y más), EuXLisp, Eu2C
- Lenguajes de programación de tipado dinámico
- Lenguajes funcionales
- Familia de lenguajes de programación Lisp
- Lenguajes de programación multiparadigma