Условное создание кода синтаксическим анализатором
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
%ifcondition1thencasetrue1elifcondition2thencasetrue2elifcondition3thencasetrue3... elsecasefalseend_if
%if управляет созданием кода синтаксическим анализатором в зависимости от условия.
Этот оператор является одной из более тайных функций MuPAD®. Это не выполняется во время выполнения интерпретатором MuPAD. Это управляет созданием кода для интерпретатора синтаксическим анализатором.
%if может использоваться, чтобы создать различные версии библиотеки, которые совместно используют общее основание кода, или ввести отладку кода, который не должен появляться в версии выпуска.
Первое условие выполняется синтаксическим анализатором в булевом контексте и должно привести к одному из булевых значений TRUE или FALSE:
Если условие приводит к TRUE, последовательности оператора, casetrue является кодом, который создается синтаксическим анализатором для %if - оператор. Остальная часть оператора проигнорирована синтаксическим анализатором, никакой код не создается для него.
Если условие приводит к FALSE, то условие следующего elif - часть, если оценено и синтаксический анализатор продолжается как прежде.
Если все условия оценивают к FALSE и больше elif - части существуют, синтаксический анализатор вводит код последовательности оператора casefalse как код для %if - оператор. Если никакой casefalse не существует, NIL производится.
Целая последовательность оператора читается синтаксическим анализатором и должна быть синтаксически правильной. Также части, которые не приводят к коду, должны быть синтаксически правильными.
Обратите внимание на то, что вместо end_if, можно также просто использовать ключевое слово end.
В случае последовательности пустого оператора синтаксический анализатор создает NIL как код.
Условия анализируются в лексическом контексте, где они происходят, но оценены синтаксическим анализатором в контексте, где синтаксический анализатор выполняется. Дело обстоит так, потому что среда, где условия exically связаны просто, не существует во время парсинга. Таким образом нужно гарантировать, что имена в условиях не конфликтуют с именами локальных переменных или аргументов в окружающем лексическом контексте. Синтаксический анализатор не проверяет это!
Никакая функция не существует в интерпретаторе, который может выполнить %if - оператор. Причина состоит в том, что оператор реализован синтаксическим анализатором, не интерпретатором.
В следующем примере мы создаем отладку кода в процедуре в зависимости от значения глобального идентификатора DEBUG.
Обратите внимание на то, что этот пример является несколько академическим, когда функциональный prog::trace является намного более изящным способом проследить процедуру во время отладки.
DEBUG := TRUE:
p := proc(x) begin
%if DEBUG = TRUE then
print("entering p")
end;
x^2
end_proc:
p(2)![]()
![]()
Когда мы смотрим на p, мы видим, что только команда print была вставлена синтаксическим анализатором:
expose(p)
proc(x)
name p;
begin
print("entering p");
x^2
end_proc
Теперь мы устанавливаем DEBUG на FALSE и анализируем процедуру снова, чтобы создать версию выпуска. Никакая отладка вывод не распечатана:
DEBUG := FALSE:
p := proc(x) begin
%if DEBUG = TRUE then
print("entering p")
end;
x^2
end_proc:
p(2)![]()
Если мы смотрим на процедуру, мы видим, что NIL был вставлен для %if - оператор:
expose(p)
proc(x) name p; begin NIL; x^2 end_proc
|
Булево выражение |
|
Последовательность оператора |
|
Последовательность оператора |
Этот оператор может напомнить программистам C об условной компиляции. В C это реализовано препроцессором, который запущен перед синтаксическим анализатором. В MuPAD не существует такой препроцессор. %if - оператор является частью процесса парсинга.