我正在尝试制作一个可以初始化某些函数,变量等的条件表达式。在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中没有任何内容被初始化或计算。 那么,我该怎样做才能获得有条件的“汇编”?
答案 0 :(得分:7)
有几件事:
不在变量名中使用空格(下划线) - 在Mathematica中,这些是保留符号,代表模式。
如果您的条件未评估为True
或False
,则If
也不评估。
因此:
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。)