Используйте единственное RESUME для всех INTERCAL-72-стилей, если они работают
Если вам нужно написать эквивалент оператора «if», нормальный метод, использующий код INTERCAL-72, - NEXTдважды, а затем выполнить вычисление RESUME. (В современном коде часто вычисляемый COME FROMбудет лучше, но этот совет предполагает, что ваш код предпочитает NEXT.) Почти наверняка вам придется платить за первые байты NEXT, поскольку они переходят из одной ветви «если» в другую. Разделение второго NEXTтакже нетривиально, если у вас нет большого количества утверждений «если», которые попадают в одно и то же место при просмотре #1. Однако, это RESUMEможет быть где угодно в программе (потому что управление собирается оставить его немедленно где угодно).
Есть два способа справиться с этим. Если у вас много утверждений «если», то, RESUMEвероятно, требуется однозначный номер строки, так что ваше второе NEXTутверждение может быть максимально коротким. Если возможно, постарайтесь сделать его вычисляемым RESUME, который естественным образом встречается в вашем коде (по общему признанию, это сложно, так как редко они появляются в «нормальном потоке» кода, а не в NEXTредактировании); тогда единственной стоимостью является номер строки. Вы должны будете использовать единственную логическую переменную для всех этих NEXTs; универсальный консенсус здесь должен использоваться .5, главным образом потому, что это переменная, которую стандартная библиотека использует для логических возвращаемых значений.
В качестве альтернативы можно использовать недокументированную (технически недокументированную, потому что я заметил подсказку в документации INTERCAL, когда я заметил) функцию стандартной библиотеки. Поскольку центральное расположение для a RESUMEочень полезно, стандартная библиотека использует его внутри. Номера строк в INTERCAL являются глобальными (с соглашениями о пространствах имен, но которые могут быть разбиты, если вы знаете, что делаете), так что вы можете NEXTперейти прямо к внутренним компонентам стандартной библиотеки, если хотите, и, в частности, NEXTк ее центральному расположению RESUME. , Это достаточно популярно в существующем коде INTERCAL, поэтому в стандартных заменах библиотек, как правило, приходится его реализовывать, чтобы избежать взлома существующих программ.
Рассматриваемая строка (буквально или эффективно, в зависимости от реализации):
(1001) DO RESUME .5
Основная причина не использовать это номер длинной строки; если вам нужно использовать много конструкций в стиле INTERCAL-72, то лучше использовать свой собственный, чтобы присвоить ему более короткое число.
Конечно, вы можете комбинировать приемы, писать что-то вроде
(9)DO(1001)NEXT
который лишь незначительно длиннее, чем
(9)DORESUME.5
и имеет то преимущество, что булевы значения становятся #2и #3(которые труднее читать, но обычно легче генерировать). На самом деле, возможно, стоит даже добавить дополнительный код для обработки, #0и #1если вы собираетесь много чего делать (но вычисление COME FROM, вероятно, будет работать лучше в этом случае, если ваши требования не очень странные).