Elurdio escribió:En cuanto a escribir los BLOCKS en un editor externo, hago esto:
- Han de ser ficheros de 1024 bytes de tamaño o mayores (rellenando con espacios vale).
- Se han de llamar n.4TH dónde n es el número de BLOCK
- Se han de colocar en el Working Directory del IS-FORTH
····
Como método alternativo, he probado de crear el fuente en un fichero de texto y cargarlo en el IS-FORTH mediante la palabra
CAPTURE.
Funcionar, funciona. Pero hay una pega. Cuando lo entras así, es como si lo teclearas en el búfer de entrada directamente. Y en el ISF en el búfer de entrada no se pueden entrar palabras a medias. O sea, en el JA puedo entrar la definición:
: TEST DUP + ; <ENTER>
o bien puedo hacer:
: TEST <ENTER>
DUP + ; <ENTER>
y obtengo lo mismo. Pero en el ISF
NO se puede hacer. Si lo hago "partido" como en el ejemplo aparentemente todo ha ido bien pero la palabra no funciona como se espera. Si la palabra contiene estructuras de control (IF/DO/BEGIN) y se parte una de ellas da error directamente.
El problema es que no se puede ejecutar un ENTER en el búfer de entrada hasta que no está completa la definición. Por lo que no puede haber ningún código 13 (el ENTER) en el texto fuente dentro de una definición. Y sucede continuamente, pues en el texto fuente cada vez que salto línea me pone un código de salto de línea y uno retorno de carro (13).
Otra limitación, al menos tal como lo tengo yo (puede que se pueda configurar de alguna manera que aún desconozco), es que ninguna línea de código fuente debe superar los 80 caracteres.
Si el fuente solo fuera una lista de números, por ejemplo, que necesitan entrarse en la pila, no hay problema con los CR.
La "solución" que he encontrado es un poco "basta". Lo que hago es escribir el fuente normalmente y dónde ha de ir un <ENTER> escribo ENTER. Por ejemplo:
: TEST
DUP +
; ENTER
: TEST2
SWAP -
; ENTER
·
·
etc.
Además, me aseguro que ninguna línea llega a 80 caracteres.
Al final del texto fuente hay que colocar esta línea de código:
105 105 CATPURE ENTER
Luego, una vez tengo todo el fuente, lo abro con el HEXEDIT (un editor hexadecimal) y hago un Reemplazar todos los "0D" (código 13) con "20" (espacio). A continuación hago Reemplazar todos los ENTER (en hex: 454E544552) por 0D y ya tengo el fichero listo, con solo Retorno de Carros (13) en dónde tienen que estar (dónde escribí ENTER).
Para cargarlo en el IS-FORTH escribo esto en un BLOCK y lo cargo con LOAD:
dónde <filename> es el nombre del fichero completo (eg." MISDATOS.TXT") Ojo: Ha de haber un espacio (y solo uno) entre las comillas izquierdas y el nombre del fichero.
justo después de pulsar el LOAD empezará la carga/interpretación desde el fichero.
Al terminar hacer:
106 CLOSE
Un caso real:
Este es el fichero fuente para hacer los benchmarks de Forth. Originalmente cada definición era una sola línea. Aquí, cuando ha sido necesario, se han partido algunas para que no pasen de 80 caracteres por línea. Además he añadido la palabra ENTER para terminar cada definición (el ENTER se convertirá en un solo carácter)
Código: Seleccionar todo
: TIMEX_INI 255 TIMER SET ; ENTER
: TIMEX 255 TIMER ASK - ; ENTER
: INCREM TIMEX_INI 10000 0 DO 10 0 DO 9 1+ LOOP SP! LOOP TIMEX ; ENTER
: TEST> TIMEX_INI 10000 0 DO 10 0 DO 9 9 > LOOP SP! LOOP TIMEX ; ENTER
: TEST< TIMEX_INI 10000 0 DO 10 0 DO 9 9 < LOOP SP! LOOP TIMEX ; ENTER
: ARITHMETIC TIMEX_INI 10000 0 DO 9 2 / 3 * 4 + 5 - SP! LOOP TIMEX ; ENTER
: WHILE-LOOP TIMEX_INI 10000 0 DO
1 BEGIN 1+ DUP 11 < WHILE REPEAT SP! LOOP
TIMEX; ENTER
: UNTIL-LOOP TIMEX_INI 10000 0 DO 20 BEGIN 1- DUP 11 < UNTIL SP! LOOP TIMEX ; ENTER
: MAGNIFIER TIMEX_INI
20 0 DO 10000 0 DO SP! LOOP
LOOP TIMEX 2 / ; ENTER
: DO-LOOP TIMEX_INI 10000 0 DO 10 0 DO LOOP SP! LOOP TIMEX ; ENTER
: LITERAL TIMEX_INI 10000 0 DO 10 0 DO 9 LOOP SP! LOOP TIMEX ; ENTER
5 VARIABLE V ENTER
: VARI TIMEX_INI 10000 0 DO 10 0 DO V LOOP SP! LOOP TIMEX ; ENTER
: LITERAL-STORE TIMEX_INI 10000 0 DO 10 0 DO 9 V ! LOOP SP! LOOP TIMEX ; ENTER
: VARI-FETCH TIMEX_INI 10000 0 DO 10 0 DO V @ LOOP SP! LOOP TIMEX ; ENTER
9 CONSTANT K ENTER
: CONST TIMEX_INI 10000 0 DO 10 0 DO K LOOP SP! LOOP TIMEX ; ENTER
: DUPLIX TIMEX_INI 10000 0 DO 10 0 DO 9 DUP LOOP SP! LOOP TIMEX ; ENTER
: INCREM TIMEX_INI 10000 0 DO 10 0 DO 9 1+ LOOP SP! LOOP TIMEX ; ENTER
: TEST> TIMEX_INI 10000 0 DO 10 0 DO 9 9 > LOOP SP! LOOP TIMEX ; ENTER
: TEST< TIMEX_INI 10000 0 DO 10 0 DO 9 9 < LOOP SP! LOOP TIMEX ; ENTER
: ARITHMETIC TIMEX_INI 10000 0 DO 9 2 / 3 * 4 + 5 - SP! LOOP TIMEX ; ENTER
: WHILE-LOOP TIMEX_INI 10000 0 DO 1 BEGIN 1+ DUP 11 < WHILE REPEAT SP! LOOP
TIMEX ; ENTER
: UNTIL-LOOP TIMEX_INI 10000 0 DO 20 BEGIN 1- DUP 11 < UNTIL SP! LOOP TIMEX ; ENTER
: TEN ; ENTER
: NINE TEN ; ENTER
: EIGHT NINE ; ENTER
: SEVEN EIGHT ; ENTER
: SIX SEVEN ; ENTER
: FIVE SIX ; ENTER
: FOUR FIVE ; ENTER
: THREE FOUR ; ENTER
: TWO THREE ; ENTER
: ONE TWO ; ENTER
: DICTIO TIMEX_INI 10000 1 DO ONE SP! LOOP TIMEX ; ENTER
105 105 CAPTURE ENTER
Una vez transformado con el HEXEDIT queda así:
(Cuando se ven varias líneas dentro de una misma definición, si se mira con HEXEDIT se verá que están hechas solo con "line Feed" (ASCII 10). No hay ni un solo ASCII 13 excepto donde había antes un ENTER)
Código: Seleccionar todo
: TIMEX_INI 255 TIMER SET ;
: TIMEX 255 TIMER ASK - ;
: INCREM TIMEX_INI 10000 0 DO 10 0 DO 9 1+ LOOP SP! LOOP TIMEX ;
: TEST> TIMEX_INI 10000 0 DO 10 0 DO 9 9 > LOOP SP! LOOP TIMEX ;
: TEST< TIMEX_INI 10000 0 DO 10 0 DO 9 9 < LOOP SP! LOOP TIMEX ;
: ARITHMETIC TIMEX_INI 10000 0 DO 9 2 / 3 * 4 + 5 - SP! LOOP TIMEX ;
: WHILE-LOOP TIMEX_INI 10000 0 DO
1 BEGIN 1+ DUP 11 < WHILE REPEAT SP! LOOP
TIMEX;
: UNTIL-LOOP TIMEX_INI 10000 0 DO 20 BEGIN 1- DUP 11 < UNTIL SP! LOOP TIMEX ;
: MAGNIFIER TIMEX_INI
20 0 DO 10000 0 DO SP! LOOP
LOOP TIMEX 2 / ;
: DO-LOOP TIMEX_INI 10000 0 DO 10 0 DO LOOP SP! LOOP TIMEX ;
: LITERAL TIMEX_INI 10000 0 DO 10 0 DO 9 LOOP SP! LOOP TIMEX ;
5 VARIABLE V
: VARI TIMEX_INI 10000 0 DO 10 0 DO V LOOP SP! LOOP TIMEX ;
: LITERAL-STORE TIMEX_INI 10000 0 DO 10 0 DO 9 V ! LOOP SP! LOOP TIMEX ;
: VARI-FETCH TIMEX_INI 10000 0 DO 10 0 DO V @ LOOP SP! LOOP TIMEX ;
9 CONSTANT K
: CONST TIMEX_INI 10000 0 DO 10 0 DO K LOOP SP! LOOP TIMEX ;
: DUPLIX TIMEX_INI 10000 0 DO 10 0 DO 9 DUP LOOP SP! LOOP TIMEX ;
: INCREM TIMEX_INI 10000 0 DO 10 0 DO 9 1+ LOOP SP! LOOP TIMEX ;
: TEST> TIMEX_INI 10000 0 DO 10 0 DO 9 9 > LOOP SP! LOOP TIMEX ;
: TEST< TIMEX_INI 10000 0 DO 10 0 DO 9 9 < LOOP SP! LOOP TIMEX ;
: ARITHMETIC TIMEX_INI 10000 0 DO 9 2 / 3 * 4 + 5 - SP! LOOP TIMEX ;
: WHILE-LOOP TIMEX_INI 10000 0 DO 1 BEGIN 1+ DUP 11 < WHILE REPEAT SP! LOOP
TIMEX ;
: UNTIL-LOOP TIMEX_INI 10000 0 DO 20 BEGIN 1- DUP 11 < UNTIL SP! LOOP TIMEX ;
: TEN ;
: NINE TEN ;
: EIGHT NINE ;
: SEVEN EIGHT ;
: SIX SEVEN ;
: FIVE SIX ;
: FOUR FIVE ;
: THREE FOUR ;
: TWO THREE ;
: ONE TWO ;
: DICTIO TIMEX_INI 10000 1 DO ONE SP! LOOP TIMEX ;
105 105 CAPTURE
Afortunadamente el HEXEDIT guarda automáticamente una copia (.BAK) del fichero tal como era antes de la conversión. Así podemos modificarlo si hiciera falta y volverlo a convertir.
La ventaja de este método es que el fichero fuente puede ser tan grande como se quiera.
La pega es que es un auténtico ENGORRO a falta de que encontrar una manera de salvar el problema con los CR en medio de las definiciones que no implique el tratamiento con HEXEDIT.