Есть, например в Maple 10 и Maple 12, недокументированная функция goto(<label>).
Код:
> minimum:= proc(x, y)
if x < y then goto(L1) else goto(L2); end;
L1: return(x);
L2: return(y);
end proc:
> minimum(3, 2);
2
Аладьев пишет, что метки являются глобальными идентификаторами. Это может приводить к проблемам. Банальный пример, использующий описанную выше функцию
Код:
# Выше по тексту программы определена minimum
> L1:= 10:
> minimum(2, 3);
Error, (in minimum) goto to an undefined or unreachable label
Использование
unassign('L1', 'L2') в начале процедуры, очевидно, приводит к проблеме потери значения переменной, если она была определена в вызывающей программе. Попробуйте посмотреть библиотеку Аладьева (
старая ссылка, не проверял). Возможно, в ней найдёте для себя что-то интересное. Нароете — пишите в теме.
Мне трудно представить случай, когда использование goto в Maple было бы полезно. В Maple есть достаточно навороченные циклы и выражения
break и
next (для выхода из цикла и перехода к следующей итерации), а также достаточно навороченный
if. Как правило, необходимость в goto пропадает после незначительного изменения алгоритма. При этом увеличивается читаемость и модифицируемость кода. В общем, я бы не стал использовать недокументированные возможности без особой необходимости.
Будем надеяться, знатоки Maple дополнят или поправят меня.