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.
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. |
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 |
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 |
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.
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.
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 |
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 |
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 |
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 |
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
|
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 |
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) |
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