Что хорошего в работе цикла NERFIN в LOLCODE?

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

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

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

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

Вопрос

Моя претензия к спецификации заключается в сочетании:

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

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

Хотя это в основном нормально для большинства применений UPPIN, это совершенно не подходит для большинства (моих) предполагаемых применений NERFIN. Чаще всего я использую уменьшающуюся переменную цикла в других языках, это идиома «повторить n раз (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

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

Вопрос TLDR, повторенный

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

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


person JB.    schedule 25.05.2011    source источник
comment
@Юк Эй! Вопрос вполне закономерен. Серьезность имеет тенденцию немного падать к концу ответа, но вопрос чистый.   -  person JB.    schedule 02.09.2011


Ответы (1)


Именно на эту тему в 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) он по-прежнему всегда изначально присваивает переменной цикла NUMBR из 0:

https://github.com/justinmeza/lci/blob/72c983d0667d4d650657#3dd4d650657#3b7c54f49c70< /а>

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

person HostileFork says dont trust SE    schedule 24.08.2011