Frage Mathematica: Wie wird OptionValue implementiert?


Die Implementierung des eingebauten OptionValue enthält ein Stück Magie, so dass

OptionValue[name] ist äquivalent zu    OptionValue[f, name], woher f ist der   Kopf der linken Seite des   Transformationsregel, in der    OptionValue[name] erscheint.

Hat jemand eine Idee, wie man etwas Ähnliches erreichen kann? Options, d. h. implementieren ein autoOptions[] das würde zu den Optionen aufgelöst werden, die für das Symbol auf der linken Seite der Transformationsregel definiert sind, in der autoOptions[] erscheint? Um Klarheit zu schaffen, suche ich nach einer Möglichkeit

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

Ausgabe {bar->1}

Das letztendliche Ziel ist es, etwas zu tun, wie es in diese Frage ohne etwas ändern zu müssen, außer dem RHS einer Definition.


5
2018-03-17 07:03


Ursprung


Antworten:


Hier ist eine einfache, sehr schematische 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];]

Ihre Verwendung:

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

Out[10]= {bar -> 1}

Beachten Sie, dass dies nicht funktioniert, wenn auch explizite Optionen übergeben werden. Die Berechnung ist mehr Arbeit, und dies ist im Allgemeinen keine gute Vorgehensweise, da ich überlastet bin SetDelayed - Aber du hast danach gefragt und du kriegst es.


6
2018-03-17 08:51