Diccionario

  1. Mantenimiento del diccionario
  2. Palabras de compilación y ejecución
  3. Palabras "definidoras"
  4. Estructuras de control
  5. Operaciones de pila y memoria
  6. Operaciones de manipulación lógica y de bit
  7. Operaciones aritméticas y relacionales
  8. Funciones de punto flotante
  9. Conversión numérica
  10. Entrada y salida
  11. Acceso a fichero
  12. Interfaz al sistema operativo
  13. Miscelánea
Notación del diagrama de la pila:
 
Tipo de Dato Celdas de la pila
a dirección de memoria 1
n entero simple con signo 1
u entero simple sin signo 1
d entero de doble longitud con signo 2
ud entero de doble longitud sin signo 2
b  bandera booleana: verdadero o falso (-1 ó 0)  1
f valor de punto flotante de doble precisión 2
^str dirección de cadena delimitada 1

 

Las palabras escritas en NEGRITA no pertenecen al estándar ANS de Forth.
 


Mantenimiento del diccionario

FORGET --  quita la siguiente palabra del canal de entrada y las posteriores del diccionario.
COLD --  elimina todas las palabras no intrínsecas (las añadidas con INCLUDE) del diccionario, borra el contenido de las pilas, y reposiciona el entorno de kForth en el modo intérprete.
WORDS --  lista las palabras definidas en el diccionario.
FIND ^str -- a flag busca en el diccionario la palabra especificada (^str); devuelve su dirección de memoria si la encuentra, así como una bandera -1 (TRUE, o verdadero); si no la encuentra, la bandera será 0 (FALSE, o falso), y no devolverá dirección alguna.


Palabras de compilación y ejecución

IMMEDIATE --  establece la precedencia durante la compilación de la palabra definida más reciente.
NONDEFERRED --  fija la precedencia durante la interpretación de la palabra definida más reciente.
POSTPONE --  adjunta la semántica de tiempo de ejecución de la siguiente palabra en la actual definición.
LITERAL n | a --  compila un número o dirección en la pila dentro de la actual definición.
' -- a devuelve la dirección del campo de código (CFA) de la siguiente palabra del canal de entrada.
['] --  versión inmediata de ' para su uso dentro de una definición
>BODY a1 -- a2 convierte el CFA de una palabra a su dirección del campo de parámetros (PFA).
COMPILE, a --  compila la semántica de ejecución de la CFA de una palabra en la actual definición.
EXECUTE a --  ejecuta la palabra cuya CFA se encuentra en la pila.
EVALUATE a u --  interpreta y ejecuta el código fuente contenido en una cadena.
: --  crea una nueva definición de palabra y entra en modo de compilación.
; --  finaliza la definición de la nueva palabra y entra en modo intérprete.
[ --  entra en el modo de interpretación.
] --  entra en el modo de compilación.
STATE -- b devuelve TRUE (-1) si está en modo de compilación; o FALSE (0) si no es así.

Las palabras ' (TICK), y ['] se utilizan para buscar una palabra específica en el diccionario. Estas palabras cumplen con la norma ANS Forth, y devuelven a la pila la correspondiente dirección de ejecución. La palabra EXECUTE se usa para ejecutar una palabra cuya dirección de ejecución se encuentra en la pila. La palabra NONDEFERRED no es estándar, y se usa para establecer la precedencia de una palabra en kForth.

Las siguientes palabras de compilación estándar se proveen en los ficheros ans-words.4th y strings.4th:
 

2LITERAL d --  compila un número de doble precisión en la pila. ans-words.4th
SLITERAL a u --  compila una cadena de longitud u situada en la dirección de memoria a strings.4th
TO --  determina la dirección del cuerpo de la siguiente palabra y añade la semántica de tiempo de ejecución para almacenar un valor en esa dirección. ans-words.4th


Palabras "definidoras" 

 

 

Además de la forma habitual para definir una palabra nueva

: NOMBRE ... ;

también se proveen las siguientes palabras:
 

CREATE nombre
VARIABLE nombre
n CONSTANT nombre
FVARIABLE nombre
f FCONSTANT nombre

CREATE se puede usar dentro de la definición de una palabra para crear nuestras propias palabras "definidoras". La palabra DOES>, como parte de una expresión CREATE ... DOES>, nos permite especificar el comportamiento en tiempo de ejecución de las palabras creadas mediante una palabra "definidora".

Las siguientes palabras comunes Forth tienen su definición de código en el fichero ans-words.4th:
 

n VALUE nombre
d 2CONSTANT nombre
2VARIABLE nombre
DEFER nombre
xt IS nombre


Estructuras de control

En kForth se proveen las siguientes estructuras de control:
 
DO ... LOOP
DO ... +LOOP
?DO ... LOOP
?DO ... +LOOP
IF ... THEN
IF ... ELSE ... THEN
BEGIN ... AGAIN
BEGIN ... UNTIL
BEGIN ... WHILE ... REPEAT
CASE ... OF ... ENDOF ... ENDCASE

Todas las estructuras de control pueden anidarse (para los bucles DO, el número de niveles de anidamiento está limitado sólo por el espacio disponible en la pila de retorno). También se definen las siguientes palabras de control de ejecución:
 

RECURSE
LEAVE
EXIT
QUIT
ABORT
ABORT"

RECURSE sirve para invocar a una palabra dentro de sí misma (recursión).

LEAVE elimina los parámetros del bucle de la pila de retorno mediante la llamada a UNLOOP, y fuerza la salida inmediata del bucle, saltando a la instrucción que viene a continuación del mismo.

EXIT fuerza la salida inmediata de la palabra en ejecución. Adviértase que el uso de EXIT dentro de un bucle requiere que los parámetros del bucle sean descartados explícitamente de la pila de retorno mediante el uso de UNLOOP.

QUIT limpia la pila de retorno, finaliza la ejecución de la palabra en proceso y retorna al modo intérprete.

ABORT limpia la pila de datos y ejecuta QUIT.

ABORT" examina la bandera en la cima de la pila y, si la bandera es TRUE (-1), imprime el mensaje delimitado por comillas, ejecutando a continuación ABORT.

Las palabras de tratamiento de excepciones CATCH y THROW se definen en el fichero ans-words.4th.


Operaciones de pila y memoria

Las operaciones disponibles para la manipulación de la pila de datos son:
 
DUP n -- n n duplicación de la cima de la pila
?DUP n -- n n | 0 DUP si no es cero
SWAP n1 n2 -- n2 n1 intercambia los dos valores de la parte superior de la pila
OVER n1 n2 -- n1 n2 n1 copia el segundo elemento en la cima de la pila
ROT n1 n2 n3 -- n2 n3 n1 mueve el tercer valor de la pila a la cima
-ROT n1 n2 n3 -- n3 n1 n2 mueve la cima a la tercera posición de la pila
DROP n1 -- elimina el valor de la cima de la pila
NIP n1 n2 -- n2 elimina el valor situado bajo la cima de la pila
TUCK n1 n2 -- n2 n1 n2 copia la cima de la pila bajo el segundo elemento
PICK ... n -- ... m copia el elemento situado en la posición n en la cima de la pila
ROLL ... n -- ... m mueve el elemento situado en la posición n a la cima de la pila
DEPTH ... -- ... n devuelve la profundidad de la pila (el número de elementos)
2DUP n1 n2 -- n1 n2 n1 n2
2SWAP n1 n2 n3 n4 -- n3 n4 n1 n2
2OVER n1 n2 n3 n4 -- n1 n2 n3 n4 n1 n2
2ROT n1 n2 n3 n4 n5 n6 -- n3 n4 n5 n6 n1n2
2DROP n1 n2 --
FDUP f -- f f lo mismo que 2DUP
FSWAP f1 f2 -- f2 f1 lo mismo que 2SWAP
FOVER f1 f2 -- f1 f2 f1 lo mismo que 2OVER
FROT f1 f2 f3 -- f2 f3 f1 lo mismo que 2ROT
FDROP f1 -- lo mismo que 2DROP

Las operaciones para la pila de retorno son:
 

>R n -- mueve el elemento de la cima de la pila de datos a la pila de retorno
R> -- n trae el elemento de la cima de la pila de retorno a la pila de datos
R@ -- n copia el valor de la cima de la pila de retorno a la pila de datos
2>R d -- igual que >R pero con dos celdas
2R> -- d igual que R> pero con dos celdas
2R@ -- d igual que R@ pero con dos celdas
I -- n devuelve una copia del valor del índice del bucle en curso
J -- n devuelve una copia del valor del índice del bucle exterior en un bucle anidado
UNLOOP --  descarta los parámetros del bucle de la pila de retorno

Adviértase que 2>R no es equivalente a la sentencia >R >R. El orden de los dos elementos de longitud simple en la parte superior de la pila de retorno es diferente en ambos casos. 2>R situa dos items en la parte superior de la pila de retorno en el mismo orden en que se encontraban en la parte superior de la pila de datos. La secuencia 2>R 2R>, sin embargo, es idéntica a la secuencia >R >R R> R>.
 

Están implementadas las siguientes palabras de acceso a la memoria:
 

@ a -- n extrae el valor simple almacenado en la dirección de memoria dada
! n a -- almacena el valor simple n en la dirección de memoria a
2@ a -- d igual que @ pero para números de doble precisión
2! d a -- igual que ! pero para números de doble precisión
A@ a1 -- a2 extrae la dirección de memoria almacenada en la dirección a1
C@ a -- n igual que @ pero para valores de un byte
C! n a -- igual que ! pero para valores de un byte
W@ a -- n igual que @ pero para valores de longitud de una palabra con signo
W! n a -- igual que ! pero para valores de longitud de una palabra con signo
SF@ a -- f igual que @ pero para números flotantes de simple precisión
SF! f a -- igual que ! pero para números flotantes de simple precisión
DF@ a -- f igual que @ pero para números flotantes de doble precisión
DF! f a -- igual que ! pero para números flotantes de doble precisión
F@ a -- f igual que DF@
F! f a -- igual que DF!
SP@ -- a extrae el valor del puntero a la pila de datos
RP@ -- a extrae el valor del puntero a la pila de retorno
SP! a --  establece el valor del puntero a la pila de datos
RP! a --  establece el valor del puntero a la pila de retorno
? a --  extrae e imprime un valor simple; equivalente a @ .
ALLOT u -- reserva u bytes en el diccionario
?ALLOT u -- a igual que ALLOT, pero devolviendo la dirección de inicio de la zona de almacenamiento
ALLOCATE u -- a n reserva u bytes de memoria del sistema y devuelve la dirección de comienzo de la región reservada y un código de error
FREE a -- n libera memoria previamente reservada con ALLOCATE, y devuelve un código de error (0 = éxito)
C" -- ^str compila una cadena "medida" (es decir, de la que se sabe su longitud) en la tabla de cadenas; la cadena se toma del canal de entrada y debe terminar con comillas
S" -- a u compila una cadena y devuelve su dirección y su longitud
COUNT ^str -- a u convierte una dirección de cadena "medida" en su dirección y longitud
CMOVE a1 a2 u -- mueve u bytes desde la dirección de memoria a1 a la a2
CMOVE> a1 a2 u -- mueve u bytes desde a1 hasta a2 en orden descendente
FILL a n1 n2 -- rellena n1 bytes con el valor n2 a partir de la dirección a
ERASE a n --  rellena n bytes con cero a partir de la dirección a
SEARCH a1 u1 a2 u2 -- a3 u3 b busca la cadena a2 u2 dentro de la cadena a1 u1; devuleve TRUE si la encuentra y la subcadena a3 u3
COMPARE a1 u1 a2 u2 -- n compara las cadenas a1 u1 y a2 u2. Devuelve cero si son iguales.

Se provee el código de las siguientes palabras estándar de manejo de la memoria en los ficheros ans-words.4th, strings.4th y dump.4th:
 

PAD -- a devuelve la dirección de memoria de un area de uso temporal ans-words.4th
MOVE a1 a2 u --  mueve u bytes desde a1 a a2; controla la posible superposición ans-words.4th
BLANK a u --  rellena u bytes con caracteres de espacio en blanco empezando por la dirección a strings.4th
DUMP a u --  muestra en pantalla el volcado hexadecimal de u bytes empezando por la dirección a dump.4th

Puesto que kForth usa la pila de datos para las operaciones de punto flotante, las palabras DF@ y F@ son equivalentes a 2@, y DF! y F! son equivalentes a 2!.

La palabra A@ (no estándar según la norma ANS) es necesaria dado que kForth realiza chequeo de tipo a los operandos implicados en el acceso a memoria. Es esencialmente igual a @ excepto por el campo de tipo que se aplica para que sea una dirección de memoria el valor que se devuelva. Las direcciones se almacenan en variables ordinarias usando !; sin embargo deben ser recuperadas mediante A@.

El comportamiento de ALLOT no se ajusta exactamente al estándar de la norma ANS. ALLOT proporciona de forma dinámica la cantidad de memoria requerida y establece la dirección del campo de parámetros (parameter field addres, PFA) de la última palabra creada con la dirección de la región de memoria que se ha reservado. Así pues, ALLOT debe estar precedida siempre por CREATE. En kForth, el intento de usar ALLOT sin primero crear una entrada de nombre en el diccionario usando CREATE, resultará en un error de la máquina virtual. Esto limita el uso de ALLOT en kForth, pero el código escrito es portable a otros Forths que sigan la norma ANS.

Se provee la palabra no ANS estándar ?ALLOT porque kForth no puede usar HERE. ?ALLOT debe estar precedida por CREATE como se describe más arriba. Toda la memoria puede ser reservada de forma dinámica, y se libera posteriormente al salir de kForth.


Operaciones de manipulación lógica y de bit

AND n1 n2 -- n3 operación AND de n1 y n2
OR n1 n2 -- n3 operación OR de n1 y n2
XOR n2 n2 -- n3 operación de OR exclusivo de n1 y n2
NOT n1 -- n2 complemento a 1 de n1
INVERT n1 -- n2 igual que NOT
LSHIFT n1 n2 -- n3 n3 es n1 desplazado n2 bits a la izquierda
RSHIFT n1 n2 -- n3 n3 es n1 desplazado n2 bits a la derecha


Operaciones aritméticas y relacionales

Operaciones con números enteros simples y dobles
 
1+ n1 -- n2 incremento (n2 = n1 + 1)
1- n1 -- n2 decremento (n2 = n1 - 1)
2+ n1 -- n2 n2 = n1 + 2
2- n1 -- n2 n2 = n1 - 2
2* n1 -- n2 desplazamiento aritmético a la izquierda (n2 = n1*2)
2/ n1 -- n2 desplazamiento aritmético a la derecha (n2 = n1/2)
CELLS n1 -- n2 n2 es n1 veces el tamaño en bytes de una celda (4)
CELL+ n1 -- n2 n2 es n1 más el tamaño en bytes de una celda
DFLOATS n1 -- n2 n2 es n1 veces el tamaño de un número de punto flotante
DFLOAT+ n1 -- n2 n2 es n1 más el tamaño de un número de punto flotante
SFLOATS n1 -- n2 lo mismo que CELLS
SFLOAT+ n1 -- n2 lo mismo que CELL+
CHAR+ n1 -- n2 lo mismo que 1+
+ n1 n2 -- n3 suma
- n1 n2 -- n3 resta (n3 = n1 - n2)
* n1 n2 -- n3 multiplicación
/ n1 n2 -- n3 división ( n3 = n1/n2)
+! n a -- suma n al valor almacenado en la dirección de memoria a
MOD n1 n2 -- n3 módulo o resto
/MOD n1 n2 -- n3 n4 n3 = resto y n4 = cociente para n1/n2
*/ n1 n2 n3 -- n4 n4 = n1*n2/n3; valor intermedio de 64 bits
*/MOD n1 n2 n3 -- n4 n5 n4 y n5 son el resto y el cociente para n1*n2/n3
M+ d1 n -- d2 suma un entero simple a un entero doble
M* n1 n2 -- d multiplica dos enteros simples y retorna un entero doble sin signo
UM* u1 u2 -- ud multiplica enteros simples sin signo y retorna un entero doble sin signo
UM/MOD ud u1 -- u2 u3 divide un entero doble sin signo entre un entero simple sin signo y devuelve el resto (u2) y el cociente (u3). Devuelve -1 en u2 y u3 en caso de desbordamiento.
FM/MOD d n1 -- n2 n3 divide un entero doble entre un entero simple, obteniendo el cociente n3 y el módulo n2
SM/REM d n1 -- n2 n3 divide un entero doble entre un entero simple, obteniendo el cociente simétrico n3 y el resto n2
D+ d1 d2 -- d3 suma de enteros dobles
D- d1 d2 -- d3 resta de enteros dobles
ABS n1 -- n2 valor absoluto
NEGATE n1 -- n2 n2 = -n1
DABS d1 -- d2 valor absoluto de un entero doble
DNEGATE d1 -- d2 d2 = -d1
MIN n1 n2 -- n1 | n2 el valor mínimo de entre n1 y n2
MAX n1 n2 -- n1 | n2 el valor máximo de entre n1 y n2
= n1 n2 -- b comprueba si n1 es igual a n2
<> n1 n2 -- b comprueba si n1 no es igual a n2
< n1 n2 -- b comprueba si n1 es menor que n2
> n1 n2 -- b comprueba si n1 es mayor que n2
<= n1 n2 -- b comprueba si n1 es menor o igual que n2
>= n1 n2 -- b comprueba si n1 es mayor o igual que n2
U< u1 u2 -- b comprueba si el entero sin signo u1 es menor que u2
U> u1 u2 -- b comprueba si el entero sin signo u1 es mayor que u2
D= d1 d2 -- b comprueba si el entero doble d1 es igual a d2
D< d1 d2 -- b comprueba si el entero doble d1 es menor que d2
0< n -- b comprueba que n es menor que cero
0> n -- b comprueba que n es mayor que cero
0= n -- b comprueba que n es igual a cero
0<> n -- b comprueba que no es igual a cero
D0= d -- b comprueba que el entero doble d es igual a cero

kForth provee las constantes predefinidas TRUE (-1) y FALSE (0).

Las siguientes operaciones relacionales y aritméticas estándar se proveen como fuente en ans-words.4th:
 

D2* d1 -- d2 d2 es el desplazamiento aritmético a la izquierda de d1 ans-words.4th
D2/ d1 -- d2 d2 es el desplazamiento aritmético a la derecha de d1 ans-words.4th
DMIN d1 d2 -- d1|d2 el valor mínimo de entre d1 y d2 ans-words.4th
DMAX d1 d2 -- d1|d2 el valor máximo de entre d1 y d2 ans-words.4th
WITHIN n1|u1 n2|u2 n3|u3 -- b devuelve TRUE si n2|u2 <= n1|u1 < n3|u3, dado n2|u2 < n3|u3 ans-words.4th

Operaciones de punto flotante
 

F+ f1 f2 -- f3 suma de números de punto flotante
F- f1 f2 -- f3 resta (f3 = f1 - f2)
F* f1 f2 -- f3 multiplicación
F/ f1 f2 -- f3 división ( f3 = f1/f2)
FABS f1 -- f2 valor absoluto
FNEGATE f1 -- f2 f2 = -f1
FROUND f1 -- f2 redondea al número entero más cercano
FTRUNC f1 -- f2 redondea hacia cero, al número entero más cercano
FLOOR f1 -- f2 trunca hacia el número entero más cercano
FMIN f1 f2 -- f1 | f2 mínimo de entre f1 y f2
FMAX f1 f2 -- f1 | f2 máximo de entre f1 y f2
F0= f -- b comprueba si f es igual a cero
F0< f -- b comprueba si es menor que cero
F= f1 f2 -- b comprueba si f1 es igual a f2
F<> f1 f2 -- b comprueba si f1 no es igual a f2
F< f1 f2 -- b comprueba si f1 es menor que f2
F> f1 f2 -- b comprueba si f1 es mayor que f2
F<= f1 f2 -- b comprueba si f1 es menor o igual que f2
F>= f1 f2 -- b comprueba si f1 es mayor o igual que f2

 

La siguiente palabra estándar se provee como código fuente Forth en ans-words.4th:
 

F~ f1 f2 f3 -- b comprueba que f1 es aproximadamente igual a f2, dentro de un margen de incertidumbre dado por f3; si f3 = 0e, f1 y f2 deberán ser exactamente iguales en su representación binaria ans-words.4th


Funciones de punto flotante

F** f1 f2 -- f3 f3 = f1 elevado a la potencia f2
FSQRT f1 -- f2 raiz cuadrada
FLOG f1 -- f2 f2 = logaritmo en base 10 de f1
FEXP f1 -- f2 f2 = exp(f1)
FLN f1 -- f2 f2 = logaritmo en base e de f1
DEG>RAD f1 -- f2 grados a radianes
RAD>DEG f1 -- f2 radianes a grados
FSIN f1 -- f2 f2 = sin(f1)
FCOS f1 -- f2 f2 = cos(f1)
FSINCOS f1 -- f2 f3 f2 = sin(f1); f3 = cos(f1)
FTAN f1 -- f2 f2 = tan(f1)
FASIN f1 -- f2 arco seno
FACOS f1 -- f2 arco coseno
FATAN f1 -- f2 arco tangente
FATAN2 f1 f2 -- f3 f3 es arco tangente de f1/f2
FSINH f1 -- f2 f2 = sinh(f1)
FCOSH f1 -- f2 f2 = cosh(f1)
FTANH f1 -- f2 f2 = tanh(f1)
FASINH f1 -- f2 inverso del seno hiperbólico
FACOSH f1 -- f2 inverso del coseno hiperbólico
FATANH f1 -- f2 inverso del tangente hiperbólico


Conversión numérica

S>D n -- d convierte un entero simple en un entero de doble longitud
D>S d -- n convierte un entero doble con signo a un entero simple con signo
S>F n -- f convierte un entero simple en un número de punto flotante
D>F d -- f convierte un entero de doble longitud a un número de punto flotante
F>S f -- n DESCARTADO (ver más abajo)
FROUND>S f -- n convierte un número de punto flotante en un entero, con redondeo
FTRUNC>S f -- n convierte un número de punto flotante en un entero, con truncamiento
F>D f -- d convierte un número de punto flotante en un entero de doble precisión, con truncamiento
NUMBER? ^str -- d b convierte una cadena en un número de precisión doble con signo; b es TRUE si la operación se realiza con éxito
<# ud -- ud comienza la conversión de un entero doble con signo en una cadena
# ud1 -- ud2 convierte el dígito menos significativo de ud1 a caracter; concatena el caracter para la conversión en una cadena
#S ud1 -- 0 0 convierte todos los dígitos significativos en ud1 en una cadena
SIGN n --  añade el signo menos a la cadena de conversión si n < 0
HOLD n --  añade el caracter de código ASCII n en la cadena de conversión
#> ud -- a u  descarta el entero doble y devuelve la dirección de la cadena y su longitud

 

La siguiente palabra estándar se provee como código fuente Forth en ans-words.4th:
 

>NUMBER ud1 a1 u1 -- ud2 a2 u2 convierte un dígito de la cadena a1 u1 y añade este número a ud1 * base; el resultado es ud2, y a2 u2 apuntan al siguiente caracter en la cadena
ans-words.4th

 

La palabra F>S se ha eliminado de kForth a partir de la versión 1.0.14, dadas las implementaciones inconsistentes en los diversos dialectos Forth existentes. Hay dos requerimientos comunes para convertir un número de punto flotante a entero: redondeo y truncamiento hacia cero. Se han provisto dos palabras distintas para ambas funciones: FROUND>S y FTRUNC>S. En versiones de kForth previas a la 1.0.14, la palabra F>S tenía el mismo significado que FROUND>S.

Actualmente NUMBER? puede usarse sólo para convertir una cadena en un número que se encuentre dentro de los límites de los números de longitud simple. El número de longitud doble retornado puede convertirse en un número de longitud simple con tan solo descartar la mitad superior de dicho número (mediante DROP).

Otras útiles palabras de conversión de número a cadena (y viceversa) se encuentran en código fuente Forth en el fichero strings.4th:
 

U>STRING u -- ^str convierte un entero sin signo a cadena, en base 10 strings.4th
UD>STRING ud -- ^str convierte un entero doble sin signo a cadena, en base 10 strings.4th
D>STRING d -- ^str convierte un entero doble con signo a cadena, en base 10 strings.4th
S>STRING n -- ^str convierte un entero con signo a cadena, en base 10 strings.4th
STRING>S ^str -- n convierte una cadena a entero sin signo; siempre se interpreta en base 10 strings.4th
F>STRING f n -- ^str convierte un número de punto flotante a cadena, representado en formato exponencial con n dígitos strings.4th
STRING>F ^str -- f convierte una cadena a número de punto flotante strings.4th
PARSE_ARGS a u -- f1 ... fn n interpreta una cadena delimitada por espacios en una secuencia de n números en punto flotante strings.4th


Entrada y salida

BASE -- a devuelve la dirección de memoria que contiene la base numérica actual
DECIMAL --  establece la base numérica a 10
BINARY --  establece la base numérica a 2
HEX --  establece la base numérica a 16
KEY -- n espera a que se pulse una tecla y devuelve su código
ACCEPT a n1 -- n2 lee n1 caracteres a la dirección a desde el teclado. n2 es el número de caracteres leidos
BL -- 32 devuelve el código ASCII del caracter de espacio en blanco
WORD n -- ^str interpreta una palabra desde el canal de entrada, delimitado por el caracter de valor ASCII n, y devuelve la dirección de una cadena que contiene dicha palabra
CHAR -- n interpreta la siguiente palabra, delimitada por un espacio en blanco, y devuelve el valor ASCII del primer caracter
[CHAR] -- n versión en tiempo de compilación de CHAR
. n --  muestra y elimina el ítem situado en la cima de la pila, en la base actual
.R n m --  muestra n en la base actual con un campo de anchura m
U. u --  muestra un entero simple sin signo en la base actual
U.R u m --  muestra un entero simple sin signo en la base actual con un campo de anchura m
D. d --  muestra un entero de doble longitud con signo
F. f --  muestra el valor de punto flotante situado en la cima de la pila
.S n1 n2 ... -- n1 n2 ... muestra el contenido de la pila sin borrarla
." --  muestra un mensaje de texto; el mensaje se lee desde el canal de entrada y debe terminar con comillas
.( --  muestra un mensaje de texto desde el canal de entrada; el mensaje debe terminar con ')'. La palabra se ejecuta inmediatamente
CR --  ejecuta un retorno de carro
SPACES n --  muestra n espacios
EMIT n --  muestra el caracter con el valor ASCII n
TYPE a n --  muestra n caracteres desde el buffer en a
SOURCE -- a u devuelve la dirección y la longitud del buffer de entrada
REFILL -- b intenta leer otra línea desde la fuente de entrada y devuelve una bandera
>FILE --  cambia el canal de salida desde la consola a un fichero. El nombre del fichero es la siguiente palabra en el canal de entrada
CONSOLE --  restaura el canal de salida a la consola

Las siguientes palabras de control de terminal para terminales ANSI están recogidas como código fuente Forth en ansi.4th:
 

PAGE --  borra la pantalla y sitúa el cursor en la esquina superior izquierda
ansi.4th
AT-XY n1 n2 --  posiciona el cursor en la columna n1 y la fila n2, siendo el origen (0,0)
ansi.4th
?AT-XY -- n1 n2 devuelve la columna y fila donde se encuentra actualmente el cursor
ansi.4th
GOTOXY n1 n2 --  posiciona el cursor en la columna n1 y la fila n2, siendo el origen (1,1)
ansi.4th
ROWS -- n devuelve el tamaño de las filas de la consola
ansi.4th
COLS -- n devuelve el tamaño de las columnas de la consola ansi.4th
CLRTOEOL --  borra hasta el final de la linea
ansi.4th
CUR_UP n --  mueve el cursor hacia arriba n líneas
ansi.4th
CUR_DOWN n --  mueve el cursor hacia abajo n líneas
ansi.4th
CUR_LEFT n --  mueve el cursor hacia la izquierda n columnas
ansi.4th
CUR_RIGHT n --  mueve el cursor hacia la derecha n columnas
ansi.4th
SAVE_CURSOR --  guarda la actual posición del cursor
ansi.4th
RESTORE_CURSOR --  restaura el cursor a la posición previamente guardada
ansi.4th
FOREGROUND n --  establece el color de tinta a n (en un rango de 0 a 7)
ansi.4th
BACKGROUND n --  establece el color de fondo a n (en un rango de 0 a 7)
ansi.4th
TEXT_NORMAL --  restaura los atributos de texto a los establecidos por defecto
ansi.4th
TEXT_BOLD --  establece el texto a negrita
ansi.4th
TEXT_UNDERLINE --  establece el texto a subrayado
ansi.4th
TEXT_BLINK --  establece el texto a intermitente
ansi.4th
TEXT_REVERSE --  establece el texto a vídeo inverso
ansi.4th


Acceso a fichero

OPEN ^nombre n1 -- n2 abre el fichero especificado en la cadena ^nombre en modo n1, que puede ser alguno de los siguientes:
0 sólo lectura (read-only, R/O)
1 sólo escritura (write-only, W/O)
2 lectura-escritura (read-write, R/W)
n2 es el descriptor de fichero, un entero no negativo si se tiene éxito
LSEEK n1 n2 n3 -- n4 cambia la posición actual en el fichero abierto
n1 es el descriptor del fichero
n2 es el desplazamiento
n3 es el modo, con el siguiente significado:
0 el desplazamiento es relativo al inicio del fichero
1 el desplazamiento es relativo a la posición actual
2 el desplazamiento es relativo al final del fichero
n4 es el desplazamiento resultante desde el inicio del fichero, o -1 si se ha producido un error
READ n1 a n2 -- n3 lee n2 bytes en el buffer de dirección a, desde el fichero cuyo descriptor es n1. n3 es el número de bytes efectivamente leídos
WRITE n1 a n2 -- n3 escribe n2 bytes desde el buffer de dirección a al fichero con descriptor n1. n3 es el número de bytes efectivamente escritos
CLOSE n1 -- n2 cierra el fichero con descriptor n1 y devuelve el estado n2 (0 = éxito, -1 = error)
INCLUDE --  lee y procesa el fichero de fuente Forth especificado

Las siguientes palabras pertenecientes al estándar ANS de acceso a fichero se proveen como código Forth en files.4th (Linux) y filesw.4th (Win95/98/NT/2000/XP):
 

R/O -- n método de acceso a fichero de sólo lectura files.4th y filesw.4th
W/O -- n método de acceso a fichero de sólo escritura files.4th y filesw.4th
R/W -- n método de acceso a fichero de lectura y escritura files.4th y filesw.4th
CREATE-FILE a u n1 -- n2 n3 crea un fichero con nombre especificado en la cadena a de longitud u, y con el método de acceso n1. Devuelve el descriptor de fichero n2 y el código de resultado n3 files.4th y filesw.4th
INCLUDED a u -- ? establece el fichero especificado como canal de entrada del intérprete y lo procesa línea a línea files.4th y filesw.4th
OPEN-FILE a u n1 -- n2 n3 abre un fichero existente y devuelve el descriptor del fichero n2 y el código n3 files.4th y filesw.4th
CLOSE-FILE n1 -- n2 cierra el fichero con el descriptor n1 y devuelve el código de resultado n2 files.4th y filesw.4th
READ-FILE a u1 n1 -- u2 n2 lee u1 bytes al buffer de dirección a desde el fichero con descriptor n1 y retorna el número efectivo de bytes leídos en u2 y el código de retorno en n2 files.4th y filesw.4th
WRITE-FILE a u n1 -- n2 escribe u bytes desde el buffer a al fichero con descriptor n1; devuelve el código de resultado n2 files.4th y filesw.4th
FILE-POSITION n1 -- ud n2 devuelve en ud la actual posición en el fichero n1, y el código n2 files.4th y filesw.4th
REPOSITION-FILE ud n1 -- n2 establece la posición de fichero a ud para el fichero con el descriptor n1, y devuelve el código de resultado n2 files.4th y filesw.4th
FILE-SIZE n1 -- ud n2 devuelve en ud el tamaño del fichero n1, y el código de resultado n2 files.4th y filesw.4th
FILE-EXISTS ^str -- b devuelve TRUE si el fichero especificado existe files.4th y filesw.4th
DELETE-FILE a u -- n borra el fichero especificado en la cadena a u, y retorna el código de resultado n files.4th
READ-LINE a u1 n1 -- u2 b n2 lee una línea de texto, con un máximo de u1 bytes, desde el fichero con descriptor n1, hacia el buffer a; devuelve los bytes efectivamente leídos en u2, una bandera de tarea efectuada, y un código de resultado n2 files.4th y filesw.4th
WRITE-LINE a u n1 -- n2 escribe una línea de texto de u bytes desde el buffer a al fichero cuyo descriptor sea n1, y devuelve el código de resultado n2 files.4th y filesw.4th


Interfaz al sistema operativo

SYSTEM ^str -- n ejecuta otro proceso; ^str es la línea de comando pasada al sistema operativo, y n el código de resultado (dependiente del sistema operativo)
BYE --  cierra el entorno Forth y sale al sistema operativo
CHDIR ^path -- n cambia el directorio actual a uno especificado en la cadena ^path; n es el código de retorno dependiente del sistema operativo
IOCTL n1 n2 a -- n3 envía una petición de control del dispositivo n2 al fichero con el descriptor n1. Se pasan parámetros adicionales a través del buffer de dirección a. n3 es el código de estado (0 si se tiene éxito, -1 si hay un error)
TIME&DAY -- seg min hora día mes año devuelve la hora y la fecha del sistema
MS u --  aguarda durante al menos u milisegundos
MS@ -- u devuelve el número de milisegundos transcurridos desde el arranque de kForth
FORTH-SIGNAL a n -- aold instala una palabra Forth como un manejador de la señal n
RAISE n -- ior lanza la señal n
SET-ITIMER n1 a1 a2 -- n2 coloca señales de timer
GET-ITIMER n a -- n2 obtiene el conteo de la cuenta atrás del timer
USLEEP u --  aguarda durante al menos u microsegundos (para la versión Windows, la resolución es de 1000)


Miscelánea

CALL a --  llama a la subrutina de código máquina ubicada en la dirección a


Copyright © 1998--2005 Creative Consulting for Research and Education