Comentarios
\ Este es un comentario ( Este es un comentario también pero solo es usado en definiciones de palabras. ) \s Este comentario ignora hasta el final del bloque
En Forth, y por ende también en Curto, cada definición de diccionario es precedida por un comentario de pila como este:
( ... -- ... )
La parte previa a --
muestra los elementos esperados en la pila de argumentos,
siendo cada uno una palabra de 16 bit, la parte luego de --
muestra los valores
dejados en la pila luego de que la palabra es ejecutada. Las abreviaturas comunes
son:
x una palabra de máquina arbitrarira a una dirección u un entero sin signo n un entero con signo f una bandera c un caracter ASCII o un byte xt un "token de ejecución" (dirección de código)
Toma 2 enteros de la pila y empuja el resultado
: + ( n1 n2 -- n3 )…
Un comentario como ( ... |
significa que la palabra parsea texto que le sigue en el flujo de entrada.
Parsea palabra del flujo de entrada, la busca en el diccionario y empuja su token de ejecución
: ' ( |-- xt )…
La pila
Toda programación en Curto se hace manipulando la pila de parámetros (habitualmente referida como "la pila").
5 2 3 56 76 23 65 \ ok
estos números se añadieron a la pila de izquierda a derecha.
.p \ 5 2 3 56 76 23 65 ok
Aritmética Básica
La aritmética (de hecho casi todas palabras que requieren datos) funciona manipulando datos en el pila.
5 4 + \ ok
.
saca el resultado del tope de la pila:
. \ 9 ok
Mas ejemplos de aritmética:
6 7 * . \ 42 ok 1360 23 - . \ 1337 ok 12 12 / . \ 1 ok 13 2 mod . \ 1 ok 99 negar . \ -99 ok -99 abs . \ 99 ok 52 23 max . \ 52 ok 52 23 min . \ 23 ok
Manipulación de Pila
Naturalmente, cuando trabajaremos con la pila, querremos algunos métodos útiles
3 dup - \ duplica el primer valor (1ra ahora igual a 2da): 3 - 3 2 5 cambiar / \ intercambia primer y segundo valor: 5 / 2 6 4 5 rot .p \ rota los tres primeros valores: 4 5 6 4 0 soltar 2 / \ suelta el primer valor (no imprime a pantalla): 4 / 2 1 2 3 pellizcar .p \ suelta el segundo valor (similar a soltar): 1 3
Manipulación de Pila Avanzada
1 2 3 4 plegar \ duplicar el primer valor debajo del segundo: 1 2 4 3 4 ok 1 2 3 4 encima \ empuja segundo valor de la pila: 1 2 3 4 3 ok 1 2 3 4 2 elegir \ duplica el valor en esta posición al tope de la pila: 1 2 3 4 2 ok
Los índices de la pila son basados en cero.
Creando palabras
La palabra :
hace que Curto entre en modo compilar hasta que se ve la palabra ;
.
: cuadrado ( n -- n ) dup * ; \ ok 5 cuadrado . \ 25 ok
También podemos ver lo que hace una palabra (código uxntal al que fué compilada):
ver cuadrado \ DUP2 MUL2 JMP2r ok
Condicionales
-1 == verdadero, 0 == falso. No obstante, cualquier valor distinto de cero es considerado verdadero:
42 42 = \ -1 ok 12 53 = \ 0 ok
si
es una palabra solo de compilación. si
entonces
: ?>64 ( n -- n ) dup 64 > si ." Mas que 64!" entonces ; \ ok 100 ?>64 \ Mas que 64! ok
sino
:
: ?>64 ( n -- n ) dup 64 > si ." Mas que 64!" sino ." Menos que 64!" entonces ; 100 ?>64 \ Mas que 64! ok 20 ?>64 \ Menos que 64! ok
Bucles
hacer
también es una palabra solo de compilación.
: miloop ( -- ) 5 0 hacer rc ." Hola!" bucle ; \ ok miloop \ Hola! \ Hola! \ Hola! \ Hola! \ Hola! ok
hacer
espera dos números en el pila: el de incicio y el de terminación.
Podemos recibir el valor del indice mientras iteramos con i
:
: uno-a-12 ( -- ) 13 1 hacer i . bucle ; \ ok uno-a-12 \ 0 1 2 3 4 5 6 7 8 9 10 11 12 ok
?hacer
funciona similarmente, pero salta el loop si el último y el primer número son iguales.
: cuadrados ( n -- ) 0 ?hacer i cuadrado . bucle ; \ ok 10 cuadrados \ 0 1 4 9 16 25 36 49 64 81 ok
Cambiar el "paso" con +bucle
:
: treces ( n n -- ) ?hacer i . 3 +bucle ; \ ok 15 0 treces \ 0 3 6 9 12 ok
Los bucles indefinidos comienzan con empezar
hasta
:
: death ( -- ) empezar ." Ya hemos llegado?" 0 hasta ; \ ok
Constantes, Variables y Memoria
Declara una constante dedos
igual a 5
5 constante dedos dedos . \ 5 ok
Crea la variable edad
.
variable edad \ ok
Ahora escribimos 21
a edad
con la palabra !
.
21 edad ! \ ok
Podemos imprimir nuestra variable usando la palabra leer @
, que empuja el valor a la pila, o ?
que lee e imprime en un solo paso.
edad @ . \ 21 ok edad ? \ 21 ok
Arreglos
Crear arreglos es similar a crear variables, pero necesitamos alocar mas memoria para ellos.
Podemos usar 2 celdas alocar
para crear un arreglo que sea de 3 celdas de tamaño:
variable misnumeros 2 celdas alocar \ ok
Inicializar todos los valores a 0
misnumeros 3 celdas borrar \ ok
Alternativamente podemos usar llenar:
misnumeros 3 celdas 0 llenar
o podemos saltearnos todo lo anterior e inicializar con valores específicos:
crear misnumeros 64 , 9001 , 1337 , \ ok (la última `,` es importante!)
Que es equivalente a manualmente escribir valores a cada indice:
64 misnumeros 0 celdas + ! \ ok 9001 misnumeros 1 celdas + ! \ ok 1337 misnumeros 2 celdas + ! \ ok
Leyendo valores de un índice en particular:
0 celdas misnumeros + ? \ 64 ok 1 celdas misnumeros + ? \ 9001 ok
Podemos simplificar un poco creando una palabra que ayuda a manipular arreglos:
: de-arr ( n n -- n ) celdas + ; \ ok misnumeros 2 de-arr ? \ 1337 ok
Que podemos usar cuando escribimos también:
20 misnumeros 1 de-arr ! \ ok misnumeros 1 de-arr ? \ 20 ok
La Pila de Retorno
La pila de retorno se usa para retener punteros a cosas cuando las palabras están ejecutando otras palabras como en los bucles.
Ya hemos visto un uso de esto: i
, que duplica el tope de la pila de retorno. i
es equivalente a r@
.
: mibucle ( -- ) 5 0 hacer r@ . bucle ; \ ok
También podemos agregar y retirar de la pila de retorno:
5 6 4 >r swap r> .p \ 6 5 4 ok
Como Curto usa la pila de retorno para retornar a palabras, >r
debe siempre ser seguido por un r>
.
Tokens de ejecución
Curto permite crear funciones (palabras) de orden superior (como mapear o reducir) que aceptan funciones como entrada o producen funciones como salida.
Para poder pasar palabras en la pila de parámetros se utilizan "tokens de ejecución", que no son otra cosa que punteros al area de código de la palabra, que luego pueden ser utilizados mediante ejecutar
.
Dos palabras son utilizadas para obtener el token de ejecución de una palabra: `
y [`]
.
4 5 ` + ejecutar \ ok . \ 9 ok
crear misnumeros 1 , 2 , 3 , 4 , 5 , : map ( dir n xt -- ) -rot celdas limites hacer i @ encima ejecutar i ! 1 celdas +bucle ; : mostrar dup . ; misnumeros 5 ' mostrar map \ 1 2 3 4 5 ok misnumeros 5 ' 1+ map \ ok misnumeros 5 ' mostrar map \ 2 3 4 5 6 ok
Otra manera de obtener un token de ejecución es crear funciones anónimas mediante :sinnombre
misnumeros 5 :sinnombre 5 * ; map \ ok misnumeros 5 ' mostrar map \ 10 15 20 25 30 ok
Crear y hace>
: arreglo2d crear ( ancho alto | nombre ) encima , * celdas alocar hace> ( x y -- dir ) dup celda+ >r @ * + celdas r> + ; 5 5 arreglo2d prueba \ ok 6 3 2 prueba ! \ ok 3 2 prueba ? \ 6 ok
Palabras inmediatas
Diferir y posponer
Vocabularios
Interface gráfica
En la interface gráfica las siguientes combinaciones de teclas
tienen un significado especial (^
significa tecla Control,
Sh
tecla Shift y Alt
tecla Alt):
Soporte español | |
---|---|
Alt-a | á |
Alt-e | é |
Alt-i | í |
Alt-o | ó |
Alt-u | ú |
Alt-n | ñ |
Alt-? | ¿ |
Alt-! | ¡ |
^Alt-u | ü |
Atajos de teclado | |
---|---|
^a | Salta al principio de la linea |
^e | Salta al final de la linea |
^c | Termina curto (salvo que un bloque modificado se encuentre abierto en el editor) |
^d | Borra siguiente caracter |
^k | Corta hasta el final de la linea o región marcada (y escribe a archivo ".snarf") |
^u | Corta hasta el inicio de la linea o región marcada (y escribe a archivo ".snarf") |
^x | Copia linea o región marcada a archivo ".snarf" |
^v, ^y | Pega contenidos del archivo ".snarf" |
^f | Salta a siguiente ocurrencia de palabra bajo el cursor |
^s | Guarda cambios en el bloque en edición |
^l | Limpia la pantalla (salvo en editor) |
^g | Lee dígitos y salta al bloque indicado al pulsar ENTER (aborta con ESC) |
^r | Lee dígitos y copia bloque actual a nuevo al pulsar ENTER |
^m | Lee dígitos y mueve el bloque actual a nuevo al pulsar ENTER (borra bloque de origen) |
^ENTER | Alterna marcador de región |
Sh-Arriba | Recupera la última línea entrada o salta a bloque anterior |
Sh-Abajo | Salta al bloque siguiente |
Sh-Izquierda/Derecha | Salta entre bloque de código y documentación |
Las teclas de flecha mantienen el significado habitual.
Presionar ENTER
ejecuta la linea actual (marcada por el
cursor). Presionar ^ENTER
alterna el modo de selección
(marca), todas las lineas entre el principio de la marca y la
linea actual son copiadas y escreitas a un archivo llamado
.snarf
en el directorio actual una vez que se presiona ENTER
o ^x
.
Presionar el primer botón del ratón reposiciona el cursor. Presionar el tercer botón ejecutará la palabra debajo del puntero. Mover la rueda de desplazamiento salta a bloque anterior o risuiente, cuando editando un bloque sin modificar.
Editor de bloques
Acceso al sistema de archivos es provisto por archivos de "bloque", cada bloque es nombrado por un número natural y contiene 2496 bytes (39 lineas de 64 columnas). Para editar un bloque entrar:
número-de-bloque editar
La tecla ESC alterna entre modo de edición y prompt (salvo que
el bloque actual contenga modificaciones sin guardar). La
última linea contiene contadores indicando fila, columna,
número de bloque actuales, largo de último texto copiaro, la
cantidad de espacio restante en diccionario y un marcador
indicando si el bloque actual contiene modificaciones sin
guardar. Los bloques pueden ser cargados usando cargar
y
atraves
. Nótese que la carga de bloques es realizada
cambiando temporalmente la palabra para leer entrada de usuario
(
También es posible editar un bloque haciendo click con el
tercer botón del ratón sobre una cadena de la forma #nnnn
dónde nnnn
es un entero decimal.