Función genérica - Generic function

En programación de computadoras , una función genérica es una función definida por polimorfismo .

En idiomas escritos estáticamente

En lenguajes de tipado estático (como C ++ y Java ), el término funciones genéricas se refiere a un mecanismo de polimorfismo en tiempo de compilación ( distribución estática ), específicamente polimorfismo paramétrico . Estas son funciones definidas con TypeParameters , destinadas a resolverse con información de tipo de tiempo de compilación . El compilador usa estos tipos para crear instancias de versiones adecuadas, resolviendo adecuadamente cualquier función que se sobrecargue .

En el sistema de objetos Common Lisp

En algunos sistemas de programación orientada a objetos como el Common Lisp Object System (CLOS) y Dylan , una función genérica es una entidad compuesta por todos los métodos que tienen el mismo nombre. Normalmente, una función genérica es una instancia de una clase que hereda tanto de la función como del objeto estándar . Por lo tanto, las funciones genéricas son tanto funciones (que pueden llamarse con argumentos y aplicarse a ellos) como objetos ordinarios. El libro El arte del protocolo de metaobjetos explica en detalle la implementación y el uso de las funciones genéricas de CLOS.

Una de las primeras extensiones de programación orientada a objetos de Lisp es Flavours . Utilizó el paradigma de envío de mensajes habitual influenciado por Smalltalk . La sintaxis de Flavours para enviar un mensaje es:

 (send object :message)

Con New Flavors, se decidió que el mensaje debería ser una función real y se debería utilizar la sintaxis habitual de llamada a la función:

 (message object)

El mensaje ahora es una función genérica , un objeto y una función por derecho propio. Las implementaciones individuales del mensaje se denominan métodos .

La misma idea se implementó en CommonLoops . New Flavors y CommonLoops fueron la principal influencia para el sistema de objetos Common Lisp.

Ejemplo

Lisp común

Defina una función genérica con dos parámetros objeto-1 y objeto-2. El nombre de la función genérica es colisionar .

 (defgeneric collide (object-1 object-2))

Los métodos que pertenecen a la función genérica se definen fuera de las clases. Aquí definimos un método para la función genérica collide que está especializado para las clases asteroide (primer parámetro objeto-1) y nave espacial (segundo parámetro objeto-2). Los parámetros se utilizan como variables normales dentro del cuerpo del método. No hay un espacio de nombres especial que tenga acceso a los espacios de clase.

 (defmethod collide ((object-1 asteroid) (object-2 spaceship))
   (format t "asteroid ~a collides with spaceship ~a" object-1 object-2))

Llamando a la función genérica:

? (collide (make-instance 'asteroid) (make-instance 'spaceship))
asteroid #<ASTEROID 4020003FD3> collides with spaceship #<SPACESHIP 40200048CB>

Common Lisp también puede recuperar métodos individuales de la función genérica. FIND-METHOD encuentra el método de la función genérica collide especializada para las clases asteroide y nave espacial .

? (find-method #'collide nil (list (find-class 'asteroid) (find-class 'spaceship)))
#<STANDARD-METHOD COLLIDE NIL (ASTEROID SPACESHIP) 4150015E43>

Comparación con otros idiomas

Las funciones genéricas corresponden aproximadamente a lo que Smalltalk denomina métodos , con la notable excepción de que, en Smalltalk, la clase del receptor es el único determinante de qué cuerpo de código se llama: los tipos o valores de los argumentos son irrelevantes ( envío único ). En un lenguaje de programación con despacho múltiple cuando se llama a una función genérica, el despacho de método ocurre sobre la base de todos los argumentos, no solo uno que tiene privilegios. New Flavors también proporcionó funciones genéricas, pero solo un envío único.

Referencias