Este documento está en desarrollo.
Estamos trabajando arduamente para mejorarlo.
Si desea colaborar, puede editarlo aquí: edit here (md).

El objeto raíz

sections in this chapter:
manejo-de-mensajes-desconocidos
mensajes-enviados-mediante-programacin

El objeto llamado Objeto es el objeto raíz de todos los objetos en XOScript. Este objeto raíz responde a mensajes como: hacer, hecho, en-caso-de:hacer: , en:hacer: , mensaje:argumentos: , responder:y: … , aprender:significa: , y recursivo. Todos los demás objetos se derivan de este objeto, incluido el objeto Nulo. El mensaje que se envía con más frecuencia es en:hacer: , que amplía las funcionalidades de un objeto. Este mensaje es recibido por el objeto raíz, que en consecuencia vincula la tarea especificada al mensaje y, al hacerlo, expande el objeto derivado. Este método ya se mencionó en el capítulo 2, sin embargo, para completar, observe otro ejemplo. En la siguiente ilustración, se define un objeto circular con la intención de calcular su área en función de su radio:

>> circulo := Objeto nuevo.
circulo en: ['radio:'] hacer: { :r
mi radio := r.
}.
círculo en: ['área'] hacer: {
<- mi radio * 2 * 3,14.
}.

Se añaden dos mensajes: radio:, que se utiliza para establecer el radio del círculo, y area, que se utiliza para calcular su area. Este objeto se puede utilizar de la siguiente manera:

circulo radio: 4, área.

El resultado será 25,12 (tenga en cuenta que se utiliza una aproximación muy aproximada de Pi, es decir, 3,14, por lo tanto, el resultado no es muy preciso). Este objeto también puede basarse en otro objeto, lo que significa que un objeto definido previamente se expande enviando mensajes en:hacer:. De esta manera, por ejemplo, un objeto Usuario puede basarse en un objeto Persona al que se le puede agregar un nombre de inicio de sesión:

>> Usuario := Persona nuevo.
Usuario en: ['login:'] hacer: { :nombre
mi login := nombre.
}.

Además, los objetos del sistema pueden expandirse, como el objeto Texto con un cifrado ROT-13. Esta es una manera fácil de cifrar textos, basada en la técnica de cifrado Cifrado César (que es muy débil para propósitos más serios). El principio detrás de ROT-13 es bastante simple. Cada carácter se desplaza 13 posiciones en el alfabeto. En caso de que un carácter pase el carácter z, el conteo continúa desde a en adelante. Por lo tanto, a se convierte en n, b se convierte en o y x se convierte en k. Por ejemplo, cuando el texto Londres se cifra con ROT-13, mostrará Lbaqba. Si se necesita agregar una funcionalidad de este tipo a cada texto, la manera más fácil de hacerlo es expandir el objeto Texto en sí (ya que cada texto deriva de este mismo objeto) utilizando el mensaje en:hacer:

Texto en: ['rot13'] hacer: {
>> alfabeto :=
['abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'].
>> código := [''].
yo caracteres cada: { :i :carácter
>> índice := alfabeto encontrar: carácter.
>> rot13 := índice + 13.
>> codificado := alfabeto carácter: rot13.
código añadir: codificado.
}.
<- código.
}.

A partir de ahora, cada texto se puede cifrar de la siguiente manera:

Salida escribir: ['hola'] rot13, detener.

Un detalle curioso de ROT-13 es que cuando se implementa el cifrado por segunda vez, el texto original vuelve a aparecer. De esta manera, el texto cifrado vuelve a ser descifrado:

Salida escribir: ['hello'] rot13 rot13, detener.

Esto demuestra que el mensaje en:hacer: es uno de los principios más fundamentales del lenguaje de programación XOScript. Nótese que sin este mensaje, que es parte del objeto raíz Objeto , no sería posible ampliar las funcionalidades de los objetos. Un segundo mensaje esencial es es-igual-a:, que devuelve Verdadero en el caso de dos variables que apuntan hacia el mismo objeto, como:

>> x := 1.
>> y := x.
Salida escribir : (x es-igual-a: y), detener.

Observe la sutil diferencia entre = y es-igual-a: . El primero mencionado compara el valor del contenido de dos objetos, mientras que el segundo mencionado examina la memoria de la computadora para ver si son, de hecho, el mismo objeto. El mensaje en-caso-de:hacer: permite ejecutar una tarea condicional, al igual que los mensajes verdadero: y falso: . La diferencia es que puede adjuntar una tarea por valor. El siguiente ejemplo, por ejemplo, muestra el valor en la variable x. Si el valor de x es igual a 1, se ejecuta el primer bloque de código. Si x=2, se ejecutará la segunda tarea, y así sucesivamente. De esta manera, selecciona el código correcto para el valor x:

>> x := 2.
x
en-caso-de: 1 hacer: {
Salida escribir: ['Status: denegado'].
},
en-caso-de: 2 hacer: {
Salida escribir: ['Status: pendiente'].
},
en-caso-de: 3 hacer: {
Salida escribir: ['Status: aprovado'].
}.
Salida detener.

Manejo de mensajes desconocidos

Si desea crear un objeto que muestre automáticamente en la pantalla todas las palabras que le envíe (que tengan varios caracteres) en líneas individuales, podría escribir algo como esto:

Salida Humpty Dumpty se sentó en la pared.

Puede lograr esto utilizando los llamados mensajes genéricos. Esta técnica le ayuda a conectar una tarea a mensajes indefinidos:

Salida en: ['responder:'] hacer: { :texto
Salida escribir: texto, detener.
}.

La tarea que está conectada a responder: se ejecuta en cada mensaje desconocido. Dado que el mensaje Humpty es desconocido, XOScript ejecutará internamente el siguiente mensaje:

Salida responder: ['Humpty'].

Existen varias aplicaciones concebibles para los mensajes generales. Una de sus principales aplicaciones es en combinación con el principio de uniformidad; es decir, la traducción del software de XOScript a otros lenguajes técnicos.

Mensajes enviados mediante programación

En lugar de enviar un mensaje directamente a un objeto, también se puede enviar a través de una variable. Para ello, se utiliza el mensaje mensaje:argumentos: Por ejemplo, en el siguiente ejemplo, el resultado muestra 14 (de una manera muy elaborada):

>> a := (Serie ← 7).
>> b := ['añadir:'].
>> x := 7 mensaje: b argumentos: a.
Salida escribir: x, detener.

Especifica el mensaje deseado como objeto de texto y los argumentos como serie. Un mensaje que contiene dos parámetros (por ejemplo, entre: 0 y: 10), se especifica como entre: y:, por lo tanto, se combinan los componentes del mensaje:

>> a := (Serie ← 1 ; 10).
>> b := ['entre:y:'].
Salida escribir: ( Número mensaje: b argumentos: a ), detener.