Resumen de lenguajes basados en prototipos

Advertencia: esto puede ser un poco fumado.

Hemos trabajado hasta aquí la noción de objeto como la primera forma de definir conceptos, agrupar comportamiento y encapsular estado. Al objeto le puedo enviar un mensaje y el method lookup se resuelve porque el objeto receptor es el que responde al mensaje.

Esta forma de definir código en base a un objeto no es exclusiva de Wollok:

Self

La primera idea de tener la noción de objeto fue Self en 1986, que nació en Xerox Parc Place como hermano menor de Smalltalk (comparten una sintaxis muy similar).

Cada objeto define

self

Fue también el primero que introdujo la idea de manipulación enteramente visual de objetos:

morphic

Te dejamos dos videos que muestran

Javascript

Un tiempo más tarde nació Javascript (el 01/01/1997), que popularizó el término prototype-based para los lenguajes que trabajan exclusivamente con objetos (al menos hasta la versión ES6 que incorporó las clases como syntatic sugar). Vamos a hacer el ejemplo de pepita en javascript, que pueden probar en la consola de cualquier navegador (presionando F12)

// pepita es un objeto...
var pepita = {

  energia: 0,   // que tiene energia

  volar: function(kilometros) {  // que sabe volar n kilómetros (function es equivalente al method de Wollok)
    this.energia = this.energia - (8 * kilometros)   // y eso le resta energia (this es equivalente al self de Wollok)
  },

  comer: function(gramos) {      // que sabe comer g gramos
    this.energia = this.energia + (4 * gramos)	
  },

  cantar: function() {	// que sabe cantar
    console.log("pri pri pri")
  }
}

Lo probamos en la consola del navegador

// copiamos la definición anterior de pepita
pepita
pepita.energia   // puedo acceder a información de pepita
pepita.comer(50)
pepita
pepita.volar(10)
pepita.energia = 170  // incluso puedo asignar información de pepita sin mandar mensajes
pepita.descansar = function() { this.energia = 1000 }  // groso! Puedo definir comportamiento nuevo
// incluso puedo crear referencias nuevas
pepita.durmioSiesta = false
// pisamos la definición
pepita.descansar = function() {
  this.durmioSiesta = true
  this.energia = 1000
}
// y vemos qué pasa
pepita.durmioSiesta
pepita.descansar()
pepita.durmioSiesta

Similitudes con Wollok:

Algunas diferencias respecto a Wollok

En Wollok es necesario cambiar la referencia a un nuevo objeto para poder lograr que un mensaje pueda ser entendido:

>>> var pepita = object { }
an Object[]
>>> pepita.jugar()
wollok.lang.MessageNotUnderstoodException: anonymousObject does not understand message jugar()

>>> pepita = object { method jugar() { } }
an Object[]
>>> pepita.jugar()
>>>

Si quieren chusmear más pueden profundizar sobre

Ioke

Ioke (06/11/2008) fue un proyecto basado en la VM de Java que proponía trabajar con prototipos, intercalando lenguajes como Io, Ruby y Lisp. Vemos la misma implementación de pepita en Ioke:

pepita = Origin mimic do(
  energia = 0.0
  comer = method(gramos, self energia += 4 * gramos)
  volar = method(kilometros, self energia -= (kilometros + 10))
  show = method("Pepita energia: $#{energia}" println)
)

pepita show
"Pepita come 10 gramos" println
pepita comer(10)
"Pepita vuela 3 kilometros" println
pepita volar(3)
pepita show

El archivo pepita.ik tiene la definición de pepita y luego el script que prueba cómo come y vuela.

Lo evaluamos en la consola

fernando@fernando-laptop ~/apps/ioke/bin $ ./ioke pepita.ik
Pepita energia: $0.0
Pepita come 10 gramos
Pepita vuela 3 kilometros
Pepita energia: $27.0

Ozono

Ozono (anteriormente llamado LOOP: Learning Object-Oriented Programming) fue una herramienta desarrollada por algunos docentes de esta facultad que permitía el trabajo con objetos antes de utilizar otras herramientas de Smalltalk.

Pueden ver en esta página una demostración funcionando (por lo general el primer TP de la materia se hacía en este entorno).

Otras apariciones de object

En Scala aparece la noción de objeto pero asociada al Singleton.