Compilar código en Pharo es tan sencillo como hablar con el objeto compiler pasándole, entre otras cosas, el código a compilar y un objeto que sepa como resolver las variables. Por ejemplo, dado el siguiente método: selector ^ unaVariable + OtraVariable entendemos que unaVariable y OtraVariable van a ser referencias a objetos. La primera, unaVariable, parecería ser una variable de instancia dado que no es una variable temporal. Sin embargo, la segunda (OtraVariable) podría ser una variable de clase o una clase! Para resolver correctamente las variables vamos a enviarle al compilador un objeto que sepa decirle por cada nombre en el código (unaVariable/OtraVariable), qué tipo de variable es. En Ozono las instancias de OBCompilationBinder se encargan de eso. El compilador se encarga primero de resolver las variables de instancia, preguntándole #allInstVarNames al compilation binder. El resto de los nombres son luego resueltas mandándole el mensaje #bindingOf: a la clase, que deberá devolver un binding (una association). Nota 1: En Pharo, #bindingOf: resuelve de la siguiente manera: Nota 2: El workspace de Pharo usa este mismo mecanismo para poder tener variables persistentes. Tiene un diccionario con cada variable que usamos. Luego, en el #bindingOf: resuelve (luego de la resolución normal) el binding con su diccionario. El OBCompilationBinder implementa como más importantes los siguientes métodos: OBCompilationBinder >> allInstVarNames ^ class allInstVarNames OBCompilationBinder >> bindingOf: aName ^ lesson bindingOf: aName luego, la lección implementa OBLesson >> bindingOf: aName ^(self includesLiteralNamed: aName) ifTrue: [ aName -> (self literalNamed: aName) ] ifFalse: [ nil ] Nótese que la compilación en Ozono no incluye la resolución de variables globales. Luego, si intentamos usar una clase o variable global, el compilador va a interpretarlo como una variable que no conoce. Corolario: no pueden usarse clases del sistema en Ozono. |