Mathematica: как реализовано OptionValue? - PullRequest
5 голосов
/ 17 марта 2011

Реализация встроенного OptionValue содержит некоторую магию, так что

OptionValue[name] эквивалентно OptionValue[f, name], где fзаголовок левой части правила преобразования, в котором появляется OptionValue[name].

У кого-нибудь есть идеи, как добиться чего-то похожего для Options, то есть реализовать autoOptions[]что разрешило бы опции, определенные для символа в левой части правила преобразования, в котором появляется autoOptions[]?Для ясности, то, что я ищу, это способ сделать

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

output {bar->1}

Конечная цель состоит в том, чтобы сделать что-то похожее на запрос в этот вопрос без необходимости что-либо менять, кроме RHS определения.

1 Ответ

6 голосов
/ 17 марта 2011

Вот простая, очень схематичная версия:

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 - но вы просили об этом и получаете его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...