Mathematica:OptionValue是如何实现的?

时间:2011-03-17 07:03:57

标签: wolfram-mathematica

内置OptionValue的实现包含一些魔法,以便

  

OptionValue[name]相当于   OptionValue[f, name],其中f是。{1}}   左侧的头部   转型规则   OptionValue[name]出现。

是否有人知道如何为Options实现类似的东西,即实现一个autoOptions[],它将解析为转换规则左侧的符号定义的选项autoOptions[]出现了吗? 为清楚起见,我正在寻找的是一种制作方法

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

输出{bar->1}

最终目标是在this question中执行类似于{{3}}中所请求的操作,而不必更改除定义的RHS之外的任何内容。

1 个答案:

答案 0 :(得分:6)

这是一个简单的非常原理图:

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}

请注意,当传递显式选项时,这不起作用 - 考虑它们是一些更多的工作,这通常不是一个很好的做法,因为我超载了SetDelayed - 但你要求它,你得到它它。