%if

Условное создание кода синтаксическим анализатором

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.

Синтаксис

%if condition1
then casetrue1
   elif condition2 then casetrue2
   elif condition3 then casetrue3
   ...
   else casefalse
 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 - оператор. Причина состоит в том, что оператор реализован синтаксическим анализатором, не интерпретатором.

Примеры

Пример 1

В следующем примере мы создаем отладку кода в процедуре в зависимости от значения глобального идентификатора 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

Параметры

condition

Булево выражение

casetrue

Последовательность оператора

casefalse

Последовательность оператора

Алгоритмы

Этот оператор может напомнить программистам C об условной компиляции. В C это реализовано препроцессором, который запущен перед синтаксическим анализатором. В MuPAD не существует такой препроцессор. %if - оператор является частью процесса парсинга.

Смотрите также

Функции MuPAD