¿De qué sirve la operación de bucle NERFIN en LOLCODE?


Lo que dice la especificación sobre el tema:

Los bucles de iteración tienen la forma:

IM IN YR <label> <operation> YR <variable> [TIL|WILE <expression>]  
  <code block>
IM OUTTA YR <label>

Donde puede estar UPPIN (incremento en uno), NERFIN (decremento por uno), o cualquier función unaria. Que operación/función se aplica a la , que es temporal, y local al bucle. El TIL evalúa la expresión como TROOF: si se evalúa como FAIL, el bucle continúa una vez más, si no, luego bucle se detiene la ejecución, y continúa después de la coincidencia IM OUTTA YR . La de WILE es lo contrario: si la expresión es GANAR, la ejecución continúa, de lo contrario el bucle sale.

Pregunta

Mi queja con la especificación es la combinación de:

  • la falta de un inicializador de variables de bucle
  • el hecho de que es temporal y local para el bucle

Según lo entiendo, esto significa que tiene para comenzar 0.

Si bien eso está bien para la mayoría de los usos de UPPIN, está totalmente desactivado para la mayoría de (mis) usos previstos de NERFIN. Mis usos más comunes de una variable de bucle decreciente en otros lenguajes son" repeat n times (n not re-used) " y operaciones de cadena, lo que no sería una buena idea en LOLCODE de todos modos.

¿Es posible usar NERFIN para obtener un decremento de bucle de n a 1 o 0 de una manera menos detallada que los equivalentes con UPPIN o el ¿formas de bucle sin funcionamiento?

Comparación de alternativas

Impresión 5 4 3 2 1 con la variante UPPIN:

IM IN YR LOOPZ UPPIN YR COWNTR TIL BOTH SAEM COWNTR AN 5
  VISIBLE DIFF OF 5 AN COWNTR
IM OUTTA YR LOOPZ

Pros: concise.
Contras: la variable de bucle real no es accesible directamente.

Con la variante sin funcionamiento:

I HAS A COWNTR ITZ 5
IM IN YR LOOPZ
  VISIBLE COWNTR
  COWNTR R DIFF OF COWNTR AN 1
  BOTH SAEM COWNTR AN 0, O RLY?
  YA RLY, GTFO, OIC
IM OUTTA YR LOOPZ

Pros: la variable de bucle está directamente disponible.
Contras: longer.

Lo mejor que puedo conseguir con NERFIN:

IM IN YR LOOPZ NERFIN YR COWNTR TIL BOTH SAEM COWNTR AN -5
  VISIBLE SUM OF 5 AN COWNTR
IM OUTTA YR LOOPZ

Pros: err... usa NERFIN?
Contras: la variable de bucle no es directamente accesible; menos legible (¡ja!) que la variante UPPIN; no hay ganancia de verbosidad.

Pregunta de TLDR, repetida

¿Es posible usar NERFIN para obtener un decremento de bucle de n a 1 o 0 de una manera que sea menos detallada que los equivalentes con UPPIN o las formas sin funcionamiento de bucle?

Estoy usando el intérprete de lci en el nivel de especificación del lenguaje 1.2.

Author: JB., 2011-05-25

1 answers

Hubo una discusión de diseño desde 2007 sobre este tema exacto. El consenso en ese momento parecía sugerir la adición de un FROM como solución que el grupo de trabajo quería que se acelerara en 1.2:

Http://forum.lolcode.com/viewtopic.php?pid=2484

El problema fue presentado y no llegó a la especificación 1.2. Sin embargo, aparentemente está en la especificación 1.3:

Http://lolcode.com/proposals/1.3/loop2

Todavía en las obras, sin embargo. Lo comprobé y aún no está en la rama "futuro" del repositorio. Podemos ver esto mirando en el código del intérprete de bucle. A partir del 24/8/2011 (en la revisión 72c983d0667d4d650657e1b7c5f4c7054096b0dd) todavía siempre asigna inicialmente la variable de bucle a NUMBR de 0:

Https://github.com/justinmeza/lci/blob/72c983d0667d4d650657e1b7c5f4c7054096b0dd/interpreter.c#L3434

Sin embargo, incluso con la especificación antigua, teóricamente debería ser posible usar un TROOF en combinación con una prueba contra -1 para permitir una forma relativamente limpia de cuenta regresiva de 5 a 0:

BTW countdown-test.lol
CAN HAS STDIO?
HAI 1.2

HOW DUZ I COUNTDOWN YR BOWNDZ
    I HAS A FIRSTIES
    FIRSTIES R WIN
    IM IN YR LOOPZ NERFIN YR COWNTR TIL BOTH SAEM COWNTR AN -1
        FIRSTIES
        O RLY?
            YA RLY
                COWNTR R BOWNDZ
                FIRSTIES R FAIL
        OIC

        VISIBLE COWNTR

    IM OUTTA YR LOOPZ
IF U SAY SO

COUNTDOWN 5

KTHXBYE

Desafortunadamente, hay un "truco de eficiencia" que evita que el código dentro de un bucle modifique la variable de bucle usando R:

Https://github.com/justinmeza/lci/blob/a6ef5811e8eb98935a16600b799bccbe4adffdde/interpreter.c#L3408

Sin Embargo, esto parece ser un error en el código, en contraposición a una omisión en la especificación, es más probable que se arregle antes de la versión 1.3. Parchear interpreter.c para decir if (0 && stmt->update->type == ET_OP) hace que el código para countdown-test.lol se ejecute como se espera. Puede ser una solución provisional adecuada para implementaciones 1.2 LOLCODE existentes si no tiene que compartir código con instalaciones sin parches.

 13
Author: HostileFork,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-25 22:54:37