Escritura en memoria
Los catorce stores: las únicas palabras que cambian la memoria del bot, y por lo tanto la única forma de que haga algo.
Costo: Store dividido por el divisor de cada uno, solo si escribe
| Operador | Qué hace |
|---|---|
store | Guarda un número en una dirección de memoria: así se dan todas las órdenes, como 20 .up store para avanzar. |
inc | Le suma 1 a una celda de memoria: el contador más barato del ADN. |
dec | Le resta 1 a una celda de memoria: la forma barata de llevar una cuenta regresiva. |
addstore | Le suma un número a lo que ya hay en una celda, sin tener que leerla antes. |
substore | Le resta un número a lo que ya hay en una celda: la celda menos el valor. |
multstore | Multiplica lo que hay en una celda por un número y guarda el resultado ahí mismo. |
divstore | Divide lo que hay en una celda por un número, redondeando al entero más cercano; dividir por 0 deja la celda en 0. |
ceilstore | Le pone un techo a una celda: si lo que tiene es mayor que el número, lo baja a ese número. |
floorstore | Le pone un piso a una celda: si lo que tiene es menor que el número, lo sube a ese número. |
rndstore | Cambia lo que hay en una celda por un número al azar entre 0 y ese valor, con su mismo signo. |
sgnstore | Cambia lo que hay en una celda por su signo: −1 si es negativo, 0 si es cero, 1 si es positivo. |
absstore | Le saca el signo a lo que hay en una celda: un negativo pasa a positivo. |
sqrstore | Cambia lo que hay en una celda por su raíz cuadrada redondeada; si no es positivo, la deja en 0. |
negstore | Le cambia el signo a lo que hay en una celda: 20 pasa a −20 y −20 a 20. |
Todo lo que un bot hace pasa por estas palabras. Moverse, girar, disparar o reproducirse es poner un número en una sysvar, y lo único que escribe en la memoria son los stores. Todos comparten lo mismo:
- La dirección sale del tope de la pila entera; los de dos operandos sacan además un valor de debajo. Por eso se escribe
valor dirección store. - Solo corren dentro del cuerpo de un gen (después de
startoelse) y solo si el tope de la pila booleana es verdadero o está vacía. Un store salteado no saca nada de la pila (ver Condiciones en línea). - La dirección 0 no escribe ni cobra. Fuera de 1 a 1000 se ajusta al rango, y el valor guardado se recorta a ±32000.
store es, de lejos, el más usado: con él se dan todas las órdenes. inc y dec son los contadores baratos (un décimo del costo). El resto modifica lo que ya hay en la celda sin tener que leerla antes: addstore, substore, multstore y divstore hacen cuentas, ceilstore y floorstore ponen un techo o un piso, y rndstore, sgnstore, absstore, sqrstore y negstore transforman el número que está guardado.
Se combinan bien sobre la misma celda. Este gen acelera de a poco y se frena en un tope:
' pide 2 más por ciclo, hasta 40
cond
start
2 50 addstore
40 50 ceilstore
*50 .up store
stopLa celda 50 sube 2, 4, 6… hasta 40 y se queda ahí, y .up recibe ese valor cada ciclo. Con *50 2 add 40 ceil 50 store también se puede, pero lleva más palabras.
La explicación completa, con la tabla de la familia, qué direcciones se pueden escribir y cuándo actúa el motor sobre lo escrito, está en Escribir en la memoria.