En/Je/On 2016-10-14 13:19, javier gil [email protected] [forth-es] escribió / skribis / wrote :
> Uso "palabra" y "operador" como sinónimo. Precisamente, porque quiero > que TODO sean palabras del diccionario, y puesto que escribo un > intérperte, éste encontraría la palabra '+' y podría actuar > inmediatamente. Pero quiero que todo esté en el diccionario, No entiendo bien a qué te refieres con que todo esté en el diccionario. Todas las palabras tienen que estar en el diccionario para que el intérprete las encuentre, independientemente de que estén definidas en Forth o sean primitivas (escritas en el lenguaje que corresponda). > así que el intérprete buscará la definición '+', y en el código > correspondiente encontrará el bytecode de la operación suma. Ese > bytecode indexará un array de punteros a función, así que se llamará a > la función del intérprete encargada de la suma. Si no te entiendo mal, es lo que se llama código enhebrado por signos (token threaded code): Lo que guardarías en la definición de una palabra en el diccionario sería una lista de signos (octetos, en tu caso), que servirían de índices para encontrar la función correspondiente (en el lenguaje en el que escribirás el intérprete) mediante una matriz. > Fíjate en Gforth: si escribes : >r >r ; obtendrás un error. Pero si > escribes : + + ; no habrá error. Es claro que '+' y '>r' reciben un > tratamiento diferente. Yo quiero completa uniformidad. No entiendo a qué te refieres. `>r` y `+` no reciben un tratamiento diferente por parte del sistema. Son dos palabras como cualquier otra. Si redefines `>r` como dices, al ejecutar la versión redefinida obtendrás un error porque lo que hay en la pila de retorno cuando se ejecuta el `>r` contenido en la versión redefinida es la dirección de retorno de esta versión redefinida, no la anterior en el enhebrado, que es la que supuestamente quieres mover con `>r`. Este pantallazo de Gforth sirve de ejemplo: ---- Gforth 0.7.3, Copyright (C) 1995-2008 Free Software Foundation, Inc. Gforth comes with ABSOLUTELY NO WARRANTY; for details type `license' Type `bye' to exit : zx 2 >r r> ; ok zx ok : >r >r ; redefined >r ok : zx2 2 >r r> ; ok zx2 :5: Invalid memory address >>>zx2<<< Backtrace: $76A22F40 ;s $76A22F68 >r zx ok ----- Pero eso es solo un efecto lógico del uso de la pila de retorno para el enhebrado. Gforth da un error porque es un sistema muy complejo que controla el espacio de memoria visible por el sistema. Pero si haces lo mismo en un Forth clásico, cuelgas el sistema o reseteas la máquina, igual que pasaría si alteraras el puntero de la pila de retornos en ensamblador. -- Marcos Cruz http://programandala.net
