Mathematica:OptionValue 是如何实现的?

发布于 2024-10-23 00:35:53 字数 723 浏览 1 评论 0原文

内置 OptionValue 的实现包含一些魔法,这样

OptionValue[name] 相当于 OptionValue[f, name],其中 f 是 左侧的头部 变换规则,其中 出现 OptionValue[name]

有谁知道如何实现类似于 Options 的功能,即实现一个 autoOptions[] ,它将解析为左侧符号定义的选项autoOptions[] 出现的转换规则? 的方法

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

为了清楚起见,我正在寻找一种使输出 {bar->1}

,最终目标是执行 这个问题,除了定义的 RHS 之外,无需更改任何内容。

The implementation of the built-in OptionValue contains some piece of magic so that

OptionValue[name] is equivalent to
OptionValue[f, name], where f is the
head of the left-hand side of the
transformation rule in which
OptionValue[name] appears.

Does anybody have an idea for how to achieve something similar for Options, i.e. implement an autoOptions[] that would resolve to the options defined for the symbol on the left hand side of the transformation rule in which autoOptions[] appears?
For clarity, what I am looking for is a way to make

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

output {bar->1}

The eventual goal is to do something like requested in this question without having to change anything but the RHS of a definition.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

‘画卷フ 2024-10-30 00:35:53

这是一个简单、非常示意性的版本:

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< /code> - 但你要求它并且你得到它。

Here is a simple, very schematic version:

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];]

Your usage:

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

Out[10]= {bar -> 1}

Note that this won't work when explicit options are also passed - accounting for them is some more work, and this is not generally a good practice since I overloaded SetDelayed - but you asked for it and you get it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文