Simutrans-Squirrel-API  r12240
Actualización del runtime de Squirrel 3.2

Table of Contents

English | Español (traducción)

Note
Esta es la traducción al español de la documentación de Squirrel 3.2. La documentación en inglés es la referencia técnica canónica.

Resumen

Simutrans integra el lenguaje Squirrel para ejecutar escenarios y jugadores de AI escritos como guiones. El runtime de Squirrel integrado se ha actualizado a la versión v3.2 del proyecto original.

Se trata de una actualización del runtime del lenguaje. No es un rediseño de la Script API de Simutrans. No hace falta reescribir los guiones debido a esta actualización.

Qué ha cambiado

Qué no ha cambiado

Procedencia del runtime

Las fuentes de Squirrel que acompañan a Simutrans son una copia incorporada del proyecto original alojado en albertodemichelis/squirrel.

Base incorporada anterior23a0620658714b996d20da3d4dd1a0dcf9b0bd98 una instantánea de la línea de desarrollo 3.1.x, con fecha 2021-09-16
Base nuevaf92bc298784ceea459b12e2de33bdff672bfeb83 etiqueta de publicación v3.2 del proyecto original, con fecha 2022-02-10

La instantánea anterior se tomó de la línea de desarrollo posterior a la publicación de la 3.1, así que no era ni una 3.1 exacta ni una 3.2. Describir la actualización simplemente como «de la 3.1 a la 3.2» sería, por tanto, inexacto.

Compatibilidad

Los dos jugadores de AI que acompañan a Simutrans, sqai y sqai_rail, se han ejecutado con el runtime nuevo y siguen siendo compatibles. En la campaña de pruebas conservaron el estado lógico de sus conexiones, continuaron progresando de forma válida y no produjeron errores de guion ni de runtime. Algunas decisiones de planificación y búsqueda de rutas pueden variar debido al orden de iteración de las tablas, como se explica más adelante. También se ha comprobado que se carga correctamente una partida guardada con el runtime anterior.

Esto es una afirmación sobre los guiones y las rutas que cubrió esa campaña de pruebas. No es una garantía de que cualquier guion posible quede inalterado. Un guion que dependa del orden de iteración de las tablas puede comportarse de otra manera: véase la sección siguiente.

Orden de iteración de las tablas

Warning
No se debe depender del orden de iteración de las tablas de Squirrel, salvo que la API lo documente explícitamente.

Squirrel 3.2 cambia la función hash que se aplica a las claves de tipo cadena. Las tablas son contenedores hash, de modo que esto cambia el orden en que foreach recorre sus entradas.

La consecuencia para un guion es indirecta, pero real. Si un guion recorre una tabla para elegir la siguiente tarea, el orden nuevo puede cambiar:

Esto no es corrupción ni es aleatoriedad. Con la misma entrada, el runtime se comporta igual siempre, el guion conserva su estado lógico completo y la ejecución sigue siendo válida. Lo que cambia es un desempate basado en un orden que nunca estuvo garantizado.

Si un guion necesita un orden definido, tiene que imponerlo él mismo (por ejemplo, recogiendo las claves en un array y ordenándolo) en lugar de confiar en el orden que una tabla produzca por casualidad.

Los arrays no se ven afectados: son contenedores ordenados y su orden forma parte de su contrato.

Compatibilidad de las partidas guardadas

Las partidas guardadas con el runtime anterior se cargan correctamente con Squirrel 3.2. Esto se ha comprobado con los jugadores de AI que acompañan a Simutrans. La misma partida del runtime anterior se cargó varias veces para confirmar la reproducibilidad. Un estado cargado con 3.2 también se volvió a guardar y se recargó correctamente. Los guiones se reanudaron con su estado persistente completo.

El sentido contrario (cargar una partida guardada por Squirrel 3.2 en una versión anterior de Simutrans) no formó parte de este trabajo y no se afirma.

Cuando el estado persistente de un guion se vuelve a escribir, las entradas de una tabla guardada pueden aparecer en un orden distinto al anterior. El estado guardado en sí no se ve afectado: se restaura por nombre, no por posición.

bindenv

Vincular un entorno a una función es una característica del lenguaje Squirrel, no una clase ni un registro de la API de Simutrans.

El método que ya existía no ha cambiado y sigue funcionando:

local env = { factor = 2 }
local scale = function(x) { return x * factor }
local bound = scale.bindenv(env) // 'this' inside scale is now env
bound(21) // 42

Squirrel 3.2 añade una forma en línea. El entorno se escribe entre corchetes, entre el nombre de la función y la lista de parámetros:

local env = { factor = 2 }
local scale = function [env] (x) { return x * factor }
scale(21) // 42

La misma forma con corchetes se admite en funciones con nombre, en funciones locales y en miembros de clases y tablas, incluido constructor.

Las dos formas producen una clausura cuyo entorno es el objeto indicado, ya sea una tabla, una clase o una instancia. La forma en línea es una comodidad; no da acceso a nada que la forma con método no permitiera ya. Los guiones existentes no necesitan ningún cambio.

table.map

Squirrel 3.2 añade un método map a las tablas en la biblioteca estándar. Los arrays ya lo tenían.

El callback se llama una vez por entrada y recibe la clave y el valor, con this vinculado a la tabla:

local prices = { coal = 10, oil = 25 }
local labels = prices.map(function(key, value) {
return key + "=" + value
})

Conviene conocer dos propiedades:

Notas para autores de AI y escenarios

Límites conocidos del alcance

Referencias adicionales