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:

(las abreviaturas serán traducidas en una próxima revisión)
  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
^aSalta al principio de la linea
^eSalta al final de la linea
^cTermina curto (salvo que un bloque modificado se encuentre abierto en el editor)
^dBorra siguiente caracter
^kCorta hasta el final de la linea o región marcada (y escribe a archivo ".snarf")
^uCorta hasta el inicio de la linea o región marcada (y escribe a archivo ".snarf")
^xCopia linea o región marcada a archivo ".snarf"
^v, ^yPega contenidos del archivo ".snarf"
^fSalta a siguiente ocurrencia de palabra bajo el cursor
^sGuarda cambios en el bloque en edición
^lLimpia la pantalla (salvo en editor)
^gLee dígitos y salta al bloque indicado al pulsar ENTER (aborta con ESC)
^rLee dígitos y copia bloque actual a nuevo al pulsar ENTER
^mLee dígitos y mueve el bloque actual a nuevo al pulsar ENTER (borra bloque de origen)
^ENTERAlterna marcador de región
Sh-ArribaRecupera la última línea entrada o salta a bloque anterior
Sh-AbajoSalta al bloque siguiente
Sh-Izquierda/DerechaSalta 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 (consulta) y tiene efecto cuando la linea actual ha sido procesada por completo. Esto implica que las palabras de carga no pueden ser invocadas recursivamente.

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.

Sistema

Consola

Controlador

Raton

Pantalla

Audio

Archivos

Fecha y hora

Tick

Tomando el control

Guardar una ROM