Используйте единственное RESUME для всех INTERCAL-72-стилей, если они работают
Если вам нужно написать эквивалент оператора «if», нормальный метод, использующий код INTERCAL-72, - NEXT
дважды, а затем выполнить вычисление RESUME
. (В современном коде часто вычисляемый COME FROM
будет лучше, но этот совет предполагает, что ваш код предпочитает NEXT
.) Почти наверняка вам придется платить за первые байты NEXT
, поскольку они переходят из одной ветви «если» в другую. Разделение второго NEXT
также нетривиально, если у вас нет большого количества утверждений «если», которые попадают в одно и то же место при просмотре #1
. Однако, это RESUME
может быть где угодно в программе (потому что управление собирается оставить его немедленно где угодно).
Есть два способа справиться с этим. Если у вас много утверждений «если», то, RESUME
вероятно, требуется однозначный номер строки, так что ваше второе NEXT
утверждение может быть максимально коротким. Если возможно, постарайтесь сделать его вычисляемым RESUME
, который естественным образом встречается в вашем коде (по общему признанию, это сложно, так как редко они появляются в «нормальном потоке» кода, а не в NEXT
редактировании); тогда единственной стоимостью является номер строки. Вы должны будете использовать единственную логическую переменную для всех этих NEXT
s; универсальный консенсус здесь должен использоваться .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
, вероятно, будет работать лучше в этом случае, если ваши требования не очень странные).