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

Texto

sections in this chapter:
utf-8
copiar
conversin-implcita

Cada vez que se coloca un texto entre bloques y comillas [‘…’], Xoscript crea un nuevo objeto de cadena. Sin embargo, asegúrese de usar las comillas correctas. La comilla al principio del texto es diferente de la del final (esto permite usar la comilla simple sin necesidad de escaparla).

UTF-8

Las cadenas en xoscript suelen contener texto codificado en UTF-8. Si bien técnicamente es posible incluir contenido binario o que no esté codificado en UTF-8 en una cadena, se recomienda usar blobs para ello. Los blobs los proporciona el complemento del servidor (véase el capítulo ffi). En general, los blobs/ffi se proporcionan según el complemento/plataforma, ya que están vinculados a la plataforma y la arquitectura (ffi/blobs). El núcleo del lenguaje de scripting intenta ser lo más independiente posible de la plataforma.

Copiar

Al usar := es posible guardar objetos con un nombre determinado (es decir, asignarlos a una variable). También es posible guardar un objeto con varios nombres. Tenga en cuenta que esta acción es diferente a la de realizar una copia real.

>> oveja := ['Dolly'].
>> clone := oveja.
clone reemplazar: ['l'] con: ['n'].
Salida escribir: oveja, detener.

Aquí, podría haber esperado que la salida fuera Dolly, en lugar de Donny. Sin embargo, este no es el caso, ya que ambos nombres hacen referencia al mismo objeto. Cuando se trabaja con un bucle, ocurre algo similar:

>> puntos := Serie ← 1 ; 2 ; 3.
puntos cada: { :número :cantidad cantidad añadir: 1. }.
Salida escribir: puntos, detener.

De hecho, XOScript siempre usa referencias, por lo que en :cantidad el bucle ilustrado anteriormente también indica la referencia al elemento en la secuencia:

Para copiar un objeto, debes especificar esta acción explícitamente:

>> oveja := ['Dolly'].
>> clone := oveja copiar.
clone reemplazar: ['l'] con: ['n'].
Salida escribir: oveja, detener.

Al enviar el mensaje unario copiar a un objeto Texto, el objeto devuelve una copia de ese mismo objeto Texto. Es posible copiar objetos Número, Booleano, Serie, Lista y Momento de la misma manera. También puede definir su propia implementación de copia, esto es incluso una necesidad si crea sus propios objetos. Creemos una implementación de copia alternativa para series. La implementación predeterminada de copiar para una serie hace una copia superficial, crea una nueva lista con los mismos elementos.

>> a := Serie ← 1 ; 2 ; 3.
>> b := a copiar ; 4.
Salida escribir: a, detener escribir: b, detener.

En este caso, se agrega 4 solo a la copia. Sin embargo, debido a que la copia es superficial, los objetos en ambas series son los mismos:

>> oveja := Serie ← ['Dolly'] ; ['Shaun'].
>> clones := oveja copiar.
clomes cada: { :número :sheep
oveja adjuntar: ['2'].
}.
Salida escribir: oveja, detener.
Salida escribir: clones, detener.

Entonces, si agregamos 2 a cada nombre en la copia, la serie original también se ve afectada. Para solucionar esto, necesitamos hacer una copia profunda. Esta acción de copia para una secuencia podría estar compuesta de la siguiente manera:

Serie en: ['copiar'] hacer: {
>> copiar := Serie nueva.
yo cada: { :number :sección
copiar adjuntar: sección recursivo copiar.
}. <- copiar.
}.

Puedes usarla de esta manera:

>> oveja := Serie ← ['Dolly'] ; ['Shaun'].
>> clones := oveja copiar.
clones cada: { :número :sheep
oveja adjuntar: ['2'].
}.
Salida escribir: oveja, detener.
Salida escribir: clones, detener.

Si elimina la acción de copia, el resultado serían dos impresiones de la segunda serie. A primera vista, parece que la adición simplemente copia la oveja en la serie principal y deja de lado las subseries. Sin embargo, si el código de llamada se ajusta a:

>> oveja := Serie ← ['Dolly'] ; (Serie ← ['Shaun']).

Entonces, a pesar de que Shaun está en una subserie, de hecho se copia correctamente. ¿Cómo funciona esto? Bueno, tiene todo que ver con las convenciones de nombres. Debido a que la acción de copia se ha conectado al mensaje llamado copiar, todos los objetos responderán con su respectivo comportamiento de copia, no importa si el objeto receptor es Texto o una (sub)Serie. Además, tenga en cuenta que el mensaje es recursivo, este mensaje es necesario para enviar antes del mensaje de copia. Más sobre este mensaje en el capítulo 4.4 Es esencial tener en cuenta que, aunque una copia de un objeto a menudo tiene la misma apariencia que el original, de hecho, nunca será el mismo. El objeto raíz define un mensaje es-igual-a: , que puede usarse para comparar la identidad de los objetos. Observa el siguiente ejemplo:

>> a := 1.
>> b := a copiar.
>> c := a.
Salida escribir: a = b, detener.
Salida escribir: a = c, detener.
Salida escribir: ( a es-igual-a: b ),
Salida escribir: ( a es-igual-a: c ),
detener.
detener.

En este caso, a = b, porque a es una copia de b y el mensaje [‘=’] mira el valor del objeto,que en el caso anterior, es el número. Dado que a = 1 y b = 1 y 1 = 1, la respuesta será Verdadero. Lo mismo se aplica a c. Solo cuando se utiliza el mensaje es-igual-a: , que Número hereda de Objeto, se puede notar una diferencia. Mientras que c es igual a a, porque aquí la referencia se asigna utilizando el símbolo :=, a (no es igual a) b. Esto se explica por el hecho de que dentro de la computadora

La copia de la memoria es físicamente un objeto diferente. Por lo tanto, para averiguar si efectivamente la referencia es al mismo objeto físico en la memoria de la computadora, puede aplicar el mensaje es-igual-a:

Conversión implícita

XOScript utiliza la conversión implícita para convertir objetos. Para imprimir una secuencia en la pantalla, XOScript, por ejemplo, enviará el texto del mensaje i nternamente a la secuencia. Esto puede resultar muy útil, en caso de que quiera imprimir una secuencia como una lista separada por comas. El texto del mensaje se puede sobrescribir:

>> suma := Serie ← 1 ; 2 ; 3.
suma en: ['texto'] hacer: {
<- yo unirse: [','].
}.
Salida escribir: suma, detener.

Y de esta manera obtenemos

En las operaciones matemáticas con números, el número del mensaje se envía internamente. De esta manera, es posible crear una secuencia que proporcione automáticamente la suma durante una operación matemática:

>> suma := Serie ← 1 ; 2 ; 3.
suma en: ['número'] hacer: {
>> total := 0.
yo cada: { :número :elemento
total añadir: elemento.
}.
<- total.
}.
Salida escribir: 1 + suma, detener.