Условное создание кода синтаксическим анализатором
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
%ifcondition1
thencasetrue1
elifcondition2
thencasetrue2
elifcondition3
thencasetrue3
... elsecasefalse
end_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
- оператор является частью процесса парсинга.