Sistema de objetos Lisp común


El Common Lisp Object System (CLOS) es la instalación para la programación orientada a objetos que forma parte de ANSI Common Lisp . CLOS es un poderoso sistema de objetos dinámicos que difiere radicalmente de las facilidades OOP que se encuentran en lenguajes más estáticos como C++ o Java . CLOS se inspiró en sistemas de objetos Lisp anteriores como MIT Flavors y CommonLoops , aunque es más general que cualquiera de ellos. Propuesto originalmente como un complemento, CLOS se adoptó como parte del estándar ANSI para Common Lisp y se ha adaptado a otros dialectos de Lisp como EuLisp o Emacs Lisp .. [1]

Los componentes básicos de CLOS son métodos , clases , instancias de esas clases y funciones genéricas . CLOS proporciona macros para definir aquellos: defclass, defmethody defgeneric. Las instancias se crean con el método make-instance.

Las clases pueden tener varias superclases , una lista de espacios (variables miembro en el lenguaje C++/Java) y una metaclase especial . Los espacios se pueden asignar por clase (todas las instancias de una clase comparten el espacio) o por instancia. Cada tragamonedas tiene un nombre y se puede acceder al valor de una tragamonedas por ese nombre usando la función slot-value. Además, se pueden definir funciones genéricas especiales para escribir o leer valores de ranuras. Cada ranura en una clase CLOS debe tener un nombre único.

CLOS es un sistema de despacho múltiple . Esto significa que los métodos se pueden especializar en cualquiera o en todos sus argumentos requeridos. La mayoría de los lenguajes OO son de envío único, lo que significa que los métodos solo se especializan en el primer argumento. Otra característica inusual es que los métodos no "pertenecen" a las clases; Las clases no proporcionan un espacio de nombres para funciones o métodos genéricos. Los métodos se definen por separado de las clases y no tienen acceso especial (por ejemplo, "esto", "auto" o "protegido") a los espacios de clase.

Los métodos en CLOS se agrupan en funciones genéricas . Una función genérica es un objeto que se puede llamar como una función y que asocia una colección de métodos con un nombre compartido y una estructura de argumentos, cada uno especializado para diferentes argumentos. Dado que Common Lisp proporciona clases que no son CLOS para estructuras y tipos de datos incorporados (números, cadenas, caracteres, símbolos, ...), el envío de CLOS también funciona con estas clases que no son CLOS. CLOS también admite el envío sobre objetos individuales (eql especialistas). CLOS no admite de forma predeterminada el envío sobre todos los tipos de datos de Common Lisp (por ejemplo, el envío no funciona para tipos de matrices completamente especializados o para tipos introducidos por deftype). Sin embargo, la mayoría de las implementaciones de Common Lisp proporcionan un protocolo de metaobjetosque permite que las funciones genéricas proporcionen reglas de despacho y especialización específicas de la aplicación.

Este mecanismo de envío funciona en tiempo de ejecución. Por lo tanto, agregar o eliminar métodos puede dar lugar a cambios en los métodos efectivos (incluso cuando se llama a la función genérica con los mismos argumentos) en tiempo de ejecución. Cambiar la combinación de métodos también puede conducir a diferentes métodos efectivos.


Combinación de métodos estándar en ANSI common lisp