Условное создание кода синтаксическим анализатором
Блокноты 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- оператор является частью процесса парсинга.