Mathematica:有条件的“编译”

时间:2012-01-22 15:03:54

标签: wolfram-mathematica conditional-compilation

我正在尝试制作一个可以初始化某些函数,变量等的条件表达式。在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,就像这样:

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

但结果是函数的参数被涂成红色,并且在If中没有任何内容被初始化或计算。 那么,我该怎样做才能获得有条件的“汇编”?

2 个答案:

答案 0 :(得分:7)

有几件事:

  1. 在变量名中使用空格(下划线) - 在Mathematica中,这些是保留符号,代表模式。

  2. 如果您的条件未评估为TrueFalse,则If也不评估。

  3. 因此:

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

    因此你的结果。在这种特殊情况下,红色的colred参数不是问题。您应该使用===代替==TrueQ[option==1]来获取您想要的内容。有关详细信息,请查看here

答案 1 :(得分:3)

这听起来像是一个带有选项的功能更好的东西,例如

Options[myfunction,{Compiled->False}]

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

comp语句中的局部常量With对于此示例并非严格必要,但如果您的代码完全复杂并且您多次使用此条件,则会很有用。)

我不建议在If[]语句中定义函数的不同情况。最好使用Mathematica中内置的模式匹配功能。 (请参阅文档here,尤其是here。)

可以找到一些有关函数内选项的有用文档hereherehere