Consejos para jugar al golf en Forth

10

¿Qué consejos generales tienes para jugar al golf en Forth (y sus clones)? Estoy buscando ideas que se puedan aplicar a los problemas de golf de código en general que sean al menos algo específicos de Forth (por ejemplo, "eliminar comentarios" no es una respuesta).

gato
fuente

Respuestas:

3

Evite bucles explícitos a toda costa

Forth tiene dos construcciones de bucle, x y do... loop, y menos conocidas [begin]... [until] x ydónde xy yson 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.

gato
fuente
3

Deja la basura

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.

mbomb007
fuente
2

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.

gato
fuente
1

Mira la pila

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

mbomb007
fuente
1

Intenta usar varias palabras de doble celda

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.

  • Agregar un punto en un literal entero (p 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
  • Las palabras que copian dos números a la vez, por ejemplo 2dup, 2over, 2tucktienen una buena oportunidad de ganar más variables locales.
Bubbler
fuente
0

(específico de gforth) Utilice la pila de punto flotante separada

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

  • Las operaciones relacionadas con FP (aritmética, manipulación de pila) generalmente cuestan un byte más cada una (el fprefijo, como enf+ , fdupetc.). 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 1e3lugar de1000 ).
  • Faltan algunas operaciones en la pila de FP, probablemente el ser 1+y el más doloroso 1-.
  • Las operaciones únicas de la pila FP incluyen f** (potencia), falog(potencia de 10) fsqrt, y varias exp, log, trigonometría relacionadas.
  • Puede mover números entre las pilas principales y FP a través de 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.
Bubbler
fuente