Что хорошего в цикле NERFIN в LOLCODE? - PullRequest
25 голосов
/ 25 мая 2011

Что спецификация говорит по этому вопросу:

Итерационные циклы имеют вид:

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

Где может быть UPPIN (увеличение на единицу), NERFIN (уменьшение на единицу) или любая унарная функция.Эта операция / функция применяется к , который является временным и локальным для цикла.TIL оценивает выражение как TROOF: если оно оценивается как FAIL, цикл продолжается еще раз, если нет, то выполнение цикла останавливается и продолжается после соответствующего IM OUTTA YR

Question

Моя схватка со спецификацией - это сочетание:

  • отсутствие инициализатора переменной цикла
  • тот факт, что он является временным и локальным для цикла

Насколько я понимаю, это означает, что это имеет , чтобы начинаться с 0.

Хотя это в основном нормально для большинства применений UPPIN, для большинства (моих) предполагаемых применений NERFIN он полностью отключен.Мое наиболее распространенное использование переменной цикла с уменьшением в других языках - это идиома и строковые операции "repeat n times ( n не повторное использование)", которые не были бы хорошимиидея в LOLCODE в любом случае.

Можно ли использовать NERFIN, чтобы получить декремент цикла от n до 1 или 0 таким способом, который менее многословен, чем эквиваленты с UPPIN илибезоперационные формы зацикливания?

Сравнение альтернатив

Печать 5 4 3 2 1 с вариантом UPPIN:

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

Плюсы: краткий
Минусы: фактическая переменная цикла недоступна напрямую.

С безоперационным вариантом:

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

Плюсы: переменная цикла являетсяпрямо доступны.
Минусы: больше.

Лучшее, что я могу получить с NERFIN:

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

Плюсы: err ... используетNERFIN?
Минусы: переменная цикла не доступна напрямую;менее читабельный (хах!), чем вариант UPPIN;нет усиления многословия.

вопрос TLDR, повторяется

Можно ли использовать NERFIN, чтобы получить уменьшение цикла от n до 1 или 0 таким образом, чтобыменее многословно, чем эквиваленты с UPPIN или безоперационными формами зацикливания?

Я использую интерпретатор lci на уровне спецификации языка 1.2.

1 Ответ

13 голосов
/ 24 августа 2011

На эту тему обсуждалась тема дизайна в 2007 году. Консенсус в то время, казалось, предлагал добавить FROM в качестве решения, которое рабочая группа хотела бы быстро перейти к 1.2:

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

Проблема была поставлена ​​и не соответствовала спецификации 1.2. Тем не менее, это, очевидно, в спецификации 1.3:

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

Все еще в работе, хотя. Я проверил, и это еще не в "будущей" ветке хранилища. Мы можем увидеть это, заглянув в код интерпретатора цикла. По состоянию на 24.08.2011 (в редакции 72c983d0667d4d650657e1b7c5f4c7054096b0dd) он по-прежнему всегда изначально присваивает переменной цикла значение a NUMBR, равное 0:

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

Однако, даже со старой спецификацией теоретически должно быть возможно использовать TROOF в сочетании с тестом против -1, чтобы обеспечить относительно чистую форму отсчета от 5 до 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

К сожалению, существует «взлом эффективности», который не позволяет коду внутри цикла изменять переменную цикла с помощью R:

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

Тем не менее, поскольку это кажется ошибкой в ​​коде, а не упущением в спецификации, более вероятно, что она будет исправлена ​​до выпуска 1.3. Исправление interpreter.c, чтобы сказать if (0 && stmt->update->type == ET_OP), заставляет код для countdown-test.lol работать как ожидалось. Это может быть подходящим временным решением для существующих развертываний 1.2 LOLCODE, если вам не нужно делиться кодом с неустановленными установками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...