Mathematica:OptionValue是如何实现的?

Jan*_*nus 5 wolfram-mathematica

内置的实现OptionValue包含了一些魔术

OptionValue[name]相当于 OptionValue[f, name],其中出现f的转换规则的左侧的头部 在哪里OptionValue[name].

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

Options[foo]={bar->1};
foo[OptionsPattern[]]:=autoOptions[]
foo[]
Run Code Online (Sandbox Code Playgroud)

产量 {bar->1}

最终的目标是在这个问题中做出类似的事情,而不必改变定义的RHS.

Leo*_*rin 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];]
Run Code Online (Sandbox Code Playgroud)

你的用法:

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

Out[10]= {bar -> 1}
Run Code Online (Sandbox Code Playgroud)

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