Respuestas:
Forth tiene dos construcciones de bucle, x y do
... loop
, y menos conocidas [begin]
... [until] x y
dónde x
y y
son valores para límite e índice, o condiciones a tener en cuenta, respectivamente.
Estos son muy lentos, muy prolíficos (jaja) y en general bastante hinchados, así que solo úselos si es necesario.
En cambio, como un lenguaje funcional adecuado (que es Forth, en realidad), uno debería preferir la recursividad sobre los bucles explícitos porque tiende a ser más corto y hace un mejor uso del lenguaje.
No se requiere que los programas sean aptos para apilar.
En cambio, pueden dejar basura adicional en la pila si te ahorra bytes. En Forth, el "valor de retorno" está dejando algo encima de la pila. Probablemente no importa qué basura tenga debajo de eso en la pila, a menos que esté usando la recursividad y la profundidad de la pila.
Forth tiene muchas palabras geniales, muchas de las cuales son útiles para elaborar los tipos de algoritmos encontrados en PPCG.
Un mal ejemplo ilustrativo de esto son las palabras para incremento (1+
) y decremento ( 1-
). Ahorran un byte sobre la escritura 1 +
para incrementar la parte superior de la pila.
Además, aquí hay una lista útil de muchas (probablemente no todas) palabras encontradas en distribuciones modernas como gforth
.
Al escribir su código, preste atención a lo que sucede en la pila en cada comando. Por lo general, lo dibujo a medida que avanzo, así:
6 6
7 7 6
* DUP 42 42
A medida que avanza de esta manera, puede que le resulte más fácil reconocer cuando se puede hacer uso de operaciones de la pila como ROT
, -ROT
, 2DUP
, 2OVER
, etc ...
Esto incluye palabras de aritmética de doble celda , bit a bit , comparación de números y manipulación de pila . Los literales enteros de doble celda también cuentan.
1.
. Ej. ) Da un literal de doble celda. Para números pequeños, significa empujar un cero adicional a costa de un solo byte.m+
= 0 d+
~ = under+
(no exactamente, ya que puede ocurrir un desbordamiento).d2*
y d2/
podría usarse para extraer / empujar un bit de una palabra.a b c d d=
= a c = b d = and
a b c d d<>
= a c <> b d <> or
2dup
, 2over
, 2tuck
tienen una buena oportunidad de ganar más variables locales.gforth tiene una pila separada para números de punto flotante. Incluso si solo se trata de enteros, descargar algo de trabajo y almacenamiento en la pila FP puede resultar en un código más corto en general, ya sea evitando la manipulación explícita de la pila o usando operaciones específicas de FP que no están disponibles en la pila principal. Volver a la pila FP también es una opción perfectamente válida (excepto cuando la tarea es devolver un valor booleano).
f
prefijo, como enf+
, fdup
etc.). Los literales de número de FP también cuestan un byte más (postfix e
, como en 1e
), pero algunos números pueden vincular o incluso guardar un byte (por ejemplo, en 1e3
lugar de1000
).1+
y el más doloroso 1-
.f**
(potencia), falog
(potencia de 10) fsqrt
, y varias exp, log, trigonometría relacionadas.s>f
(simple a flotante), f>s
(flotante a simple), d>f
(doble a flotante), f>d
(flotante a doble). A veces, las variaciones "dobles" se pueden usar para producir o consumir un cero adicional.