wolfram-mathematica - Mathematica: 函数的实现方式如何?

  显示原文与译文双语对照的内容

内置的 OptionValue 插件的实现包含了一些魔术,因此

OptionValue[name] 等效于 OptionValue[f, name],它的中 f 是出现 OptionValue[name]的转换规则左侧的头。

有关如何实现类似 Options的知识,换句话说,实现了一个 autoOptions[],它可以解决出现在 autoOptions[] 中的变换规则的选项。 我想知道的是,我要做的是


Options[foo]={bar->1};


foo[OptionsPattern[]]:=autoOptions[]


foo[]



输出 {bar->1}

最终的目标是在中执行这类问题,而不必改变任何一个定义。

时间: 原作者:

下面是一个简单的原理图版本:


Module[{tried},


 Unprotect[SetDelayed]; 


 SetDelayed[f_[args___, optpt : OptionsPattern[]], rhs_]/; 


!FreeQ[Unevaluated[rhs], autoOptions[]] :=


 Block[{tried = True},


 f[args, optpt] := 


 Block[{autoOptions}, autoOptions[] = Options[f]; rhs]]/;! TrueQ[tried];


 Protect[SetDelayed];]



你的用法:


In[8]:= Options[foo] = {bar -> 1};


foo[OptionsPattern[]] := autoOptions[]


foo[]



Out[10]= {bar -> 1}



,explicit的选项也是无效的,因为 accounting accounting accounting work generally generally generally generally generally generally SetDelayed

...