Ir al contenido

Common Lisp Object System

De Wikipedia, la enciclopedia libre
Esta es una versión antigua de esta página, editada a las 21:24 17 sep 2016 por Invadibot (discusión · contribs.). La dirección URL es un enlace permanente a esta versión, que puede ser diferente de la versión actual.

Common Lisp Object System (CLOS por sus siglas en inglés) un sistema de objetos. Forma parte del estandár ANSI de Common Lisp. Ha sido adaptado por otros dialectos de Lisp como EuLisp o Emacs Lisp.[1][2]​ CLOS está inspirado en anteriores sistemas de objetos en Lisp como MIT Flavors o Common LOOPS. Uno de las metas de diseño fue que sea compatible con estos sistemas.[3]​ CLOS provee al programación la capacidad de modificar y extender su semántica a través de un Protocol de Meta-objetos (MOP por sus siglas en inglés).[4]

Características

Resolución múltiple

CLOS es un sistema de resolución múltiple. Esto significa que los métodos se pueden distinguir según los tipos de todos los argumentos. Muchos lenguajes OO son de resolución simple, sus métodos sólo se distinguen con el primer argumento. Los métodos en CLOS se agrupan en funciones genéricas, colecciones de métodos con el mismo nombre y estructura de argumentos, pero con argumentos de tipos diferentes.

Combinación de métodos

Una illustración que muestra como se combinan los métodos en la combinación estándar.

CLOS permite combinar los diferentes métodos asociados a una función genérica bajo diferentes estrategias. El resultado de esta combinación se denomina método effectivo (effective method). La estratega por defecto tiene el nombrde de estándar. Adicionalmente CLOS define las siguietnes combinaciones de métodos: progn, +, and, append, list, max, min, or y nconc. El usuario puede definir nuevas combinaciones usando el MOP. La estrategia estándar sigue la siguiente lógica: Se elije el método :around más especifico. Es método puede elegir si llamar o no el resto de métodos usando (call-next-method); luego se ejeuctan todos los métodos :before de mayor a menor especificidad seguido del método primario más especifico y por último toos los métodos :after de menor a mayor especificidad.

Herencia múltiple

CLOS permite herencia múltiple. Cuando el orden por defecto en que los métodos se ejecutan en herencia múltiple no es correcto, el programador puede resolver el problema del diamante especificando el orden de combinación de los métodos.

Dinámico

CLOS es dinámico, no sólo los contenidos, sino también las estructuras de los objetos se pueden modificar en tiempo de ejecución. CLOS soporta la carga de definiciones de clases al vuelo (incluso cuando las instancias de las clases ya existen) así como el cambio de los miembros de la clase de una instancia dada a través del operador change-class.

Basado en clases

CLOS no es un lenguaje basado en prototipos, las clases tienen que ser definidas antes de que los objetos puedan ser instanciados como miembros de esa clase. Sin embargo existe Sheeple, un sistema orientado a objetos basado en protipos, que en su propio protocolo de meta-objetos[5]

Protocolo de meta-objetos

Fuera del estándar ANSI, hay una extensión de CLOS ampliamente utilizada llamada protocolo de meta-objetos (MOP). EL MOP define una interfaz estándar para apuntalar las implementaciones de CLOS, tratando a las propias clases como instancias de metaclases y permite la definición de nuevas metaclases y la modificación del comportamiento cásico. La flexibilidad de las CLOS-MOP adelanta la Programación Orientada a Aspectos que fue desarrollada más tarde por algunos de los mismos ingenieros, como Gregor Kiczales.

Referencias

  1. "CLOS is a standard. Multiple vendors supply CLOS. CLOS (or parts of it) is being used to add object orientation to other Lisp dialects such as EuLisp or Emacs Lisp." pg 110 of Veitch 1998
  2. «EIEIO (“Enhanced Implementation of Emacs Interpreted Objects”)». 
  3. Bobrow, Daniel (1993). «CLOS in context: the shape of the design space» (en inglés). MIT Press. Consultado el 13 de marzo de 2015. 
  4. pg 108 of Veitch 1998
  5. https://github.com/sykopomp/sheeple

Enlaces externos

En inglés:

  • The Common Lisp Object System: An Overview por Richard P. Gabriel y Linda DeMichiel proveeo una buena introducción a la motivación de definir clases por medio de funciones genéricas.
  • Kiczales, des Rivieres, y Bobrow, The Art of the Metaobject Protocol. 1991, MIT Press. ISBN 0-262-61074-4
  • Keene, Sonya. Object-oriented Programming in Common Lisp: A Programmer's Guide to CLOS. 1988, Addison-Wesley. ISBN 0-201-17589-4.
  • "CommonLoops: merging Lisp and object-oriented programming", por Daniel G. Bobrow, Kenneth Kahn, Gregor Kiczales, Larry Masinter, Mark Stefik, Frank Zdybel. 1986, Portland, Oregon, Estados Unidos. Páginas 17 - 29 de la Conference on Object Oriented Programming Systems Languages and Applications, ISSN 0362-1340.
  • "A History and Description of CLOS", por Jim Veitch. Páginas 107-158 del Handbook of Programming Languages, Volume IV: Functional and Logic Programming Languages, ed. Peter H. Salus. 1998 (1st edition), Macmillian Technical Publishing; ISBN 1-57870-011-6