Versión 1.0pre1 - Ideas de Base
Mayo 1, 2002
Carlos A. Rueda

Este documento borrador describe algunas de las ideas de base para el futuro desarrollo del modelo de objetos del lenguaje Loro. Se utiliza Java como lenguaje de contraste. Todo comentario será muy bienvenido y puede canalizarse a través de la lista de correo loro-spec.

Síntesis:

  1. Loro es un lenguaje basado en objetos (no basado en clases).
  2. Los tipos para los objetos se establecen explícitamente mediante interfaces. Una interface establece las operaciones que ciertos objetos deben proveer.
  3. Un objeto puede implementar directamente las operaciones de una interface (sin necesidad de una clase mediadora). En particular, un objeto puede definirse desde tiempo de compilación.
  4. Una clase no establece un tipo, pero es la implementación (posiblemente parcial) de una o más interfaces (tipos) y actúa como una plantilla que permite crear objetos que satisfacen dichas interfaces en tiempo de ejecución.
  5. No se maneja el concepto de miembros de clase. Más bien, se insiste en el comportamiento como objeto que en efecto se presenta para tal caso en otros lenguajes. Esto evita introducir términos adicionales.

Algunos comentarios

El mecanismo static de Java hace que una clase tome algunos comportamientos objetuales, pero no todos. Por ejemplo, Math.random() es la invocación del método random() del objeto (clase) Math. Sin embargo, Math no es una instancia de Object. Lo siguiente es inválido en Java:

Object obj = java.lang.Math; 

Una clase en Java establece de manera implícita un tipo a nivel de miembros tanto de instancia como de clase. Por simple consistencia, se hace necesario que el tipo se indique de manera explícita particularmente en el caso de los miembros de clase: ¿cuál es el tipo de Math visto como objeto? Por esta razón, en Loro se evita este esquema poco claro para fines didácticos.

Un ejemplo ilustrativo

Veamos más concretamente cómo se refleja este modelo en la estructura del lenguaje. Hagamos una interface para objetos que pueden realizar ciertas operaciones matemáticas (al estilo de java.lang.Math, aunque no hay un objeto para esto).

interface IMat
''Algunas operaciones matemáticas.''

operación pot(base: real, n: entero) -> res: real
''Eleva un número real a una potencia entera
no negativa.''

  entrada
base: ''La base.''
n: ''La potencia.''
salida res: ''El resultado.''
pre { n >= 0 }
pos { res = pot' }
fin operación

operación obtRealAleatorio() -> res: real
''Obtiene un número real aleatorio mayor o igual
a 0.0 y menor que 1.0.''
salida
res: ''El valor aleatorio.''
pos { res = res' }
fin operación

... otras operaciones

fin interface // IMat

En Loro se puede crear un objeto para la interface IMat mediante la siguiente definición.

objeto mat para IMat
''Implementación básica de IMat.''

método para pot(base: real, n: entero) -> res: real
...
fin método

método para obtRealAleatorio() -> res: real
...
fin método

... otros métodos

fin objeto // mat

Basta compilar este código para que el objeto mat comience su existencia. Esto sucede también en Java pero, en Loro, mat es un verdadero objeto. De esta manera se permiten nuevas implementaciones para IMat. Una posibilidad es definir un nuevo objeto que opera como mat salvo porque ofrece una implementación diferente de una o algunas de las operaciones.

objeto mat2 extiende mat
''Implementación mejorada para IMat.''

método para pot(base: real, n: entero) -> res: real
''Estrategia dividir-y-conquistar ...''
...
fin método

fin objeto // mat2

Situación similar sucede a nivel de clases. Sin embargo, en Loro se busca hacer inicialmente un énfasis en objetos más que en clases. El Entorno integrado permitiría, por una parte, la definición directa de los objetos deseados, y por la otra, la interacción de tales objetos tanto con el usuario, como entre sí (quizá desde el Intérprete Interactivo). En un momento posterior, el profesor haría manifiesta la necesidad de lidiar con multiplicidades.

Last updated: May 3, 2007.