Mathematica: условная «компиляция» - PullRequest
0 голосов
/ 22 января 2012

Я пытаюсь создать условное выражение, которое бы инициализировало некоторые функции, переменные и т. Д. Что-то похожее на это в C:

#if option==1
  int foo(int x){/*some code here*/}
  int q=10;
#else
  char foo(int x){/*some other code*/}
  double q=3.141592;
#endif
use_q(q);
f(some_var);

В Mathematica я пробовал использовать If, напримерthis:

If[option==1,
foo[x_]=some_expression1;
q=10;
,
foo[x_]=some_expression2;
q=3.141592;
]
use_q[q];
f[some_var];

Но в результате аргументы функций окрашиваются в красный цвет, и внутри If ничего не инициализируется и не вычисляется.Итак, как мне вместо этого получить условную «компиляцию»?

Ответы [ 2 ]

7 голосов
/ 22 января 2012

Несколько вещей:

  1. Не не использовать пробелы (подчеркивания) в именах переменных - в Mathematica это зарезервированные символы, представляющие шаблоны.*

  2. Если ваше состояние не оценивается как True или False, If также не оценивает.

Таким образом:

In[12]:= If[option==1,Print["1"],Print["Not 1"]]
Out[12]= If[option==1,Print[1],Print[Not 1]]

Таким образом, ваш результат.Аргументы красного цвета не являются проблемой в данном конкретном случае.Вы должны либо использовать === вместо ==, либо TrueQ[option==1], чтобы получить то, что вы хотите.Посмотрите здесь , для получения дополнительной информации.

3 голосов
/ 23 января 2012

Это звучит как что-то, что было бы лучше сделать как функцию с опцией, например

Options[myfunction,{Compiled->False}]

myfunction[x_,opts:OptionsPattern[]]:=
   With[{comp= TrueQ[OptionValue[Compiled]]},
    If[comp, compiledFunction[x], notcompiledFunction[x] ]]

(Локальная константа comp в операторе With не является строго необходимой для этого примера, но будет полезна, если ваш код вообще сложен, и вы используете это условие более одного раза.)

Я не рекомендую определять различные случаи функции внутри оператора If[]. Вам было бы лучше использовать встроенные способности сопоставления с образцом в Mathematica. (См. Документацию здесь и особенно здесь .)

Некоторую полезную документацию по опциям в функциях можно найти здесь , здесь и здесь .

...