Najczystszy sposób przedstawiania sekwencji oceny Mathematica

WReach przedstawił tutaj ładny sposób na przedstawienie Mathematica 's sekwencji oceny za pomocą OpenerView. Jest to znacznie więcej niż użycie standardowych poleceń Trace lub TracePrint. Ale można to jeszcze poprawić.

Potrzebuję prostego sposobu na przedstawienie rzeczywistej sekwencji (sub)ocen wewnątrz głównej pętli Mathematica dla początkujących. W szczególności powinno być oczywiste, gdy nowa ocena zaczyna się i od którego wyrażenia (lepiej mieć każdy wyraz dokładnie w jednym Opener). Sekwencja oceny (pod)powinna być zidentyfikowana tak łatwo, jak to możliwe za pomocą standardowej sekwencji oceny . Chodzi mi o to, że czytelnik powinien być w stanie odwzorować rzeczywisty etap oceny na taki opisany w dokumentacji standardowej sekwencji oceny.

Czy to możliwe?
Author: Community, 2011-03-28

3 answers

Cytowany OpenerView zastosowane rozwiązanieTrace / TraceOriginal aby wygenerować jego zawartość. Pozwoliło to na zwięzłe zdefiniowanie show w tej odpowiedzi, ale miało tę wadę, że odrzucało część informacji śladowych. TraceScan dostarcza więcej informacji, ponieważ wywołuje funkcję określoną przez użytkownika na początku i końcu każdej oceny.

Dwie funkcje są zdefiniowane poniżej, które próbują sformatować TraceScan informacje w (nieco) czytelnej formie.

traceView2 pokazy każde wyrażenie, które jest oceniane, wraz z podewaluacjami ("krokami"), które prowadzą do wyniku tej oceny. "Drill-down" jest dostarczany przez OpenerView. Funkcja generuje wyjście, które wygląda tak:

traceView2[(a + 1) + 2]

zrzut ekranu traceView2

Gdy ktoś wierci głębiej w Widok, szybko indeksuje się z prawej strony strony. traceView4 zapewnia alternatywny pogląd, który nie wykazuje zachowań pełzających kosztem pokazania znacznie mniej kontekstu dla danego ocena:

traceView4 zrzut ekranu

Wybierz swoją truciznę;)

Poniżej znajdują się definicje funkcji...

TraceView2

ClearAll@traceView2
traceView2[expr_] :=
  Module[{steps = {}, stack = {}, pre, post, show, dynamic},
    pre[e_] := (stack = {steps, stack}; steps = {})
  ; post[e_, r_] :=
      ( steps = First@stack ~Join~ {show[e, HoldForm[r], steps]}
      ; stack = stack[[2]]
      )
  ; SetAttributes[post, HoldAllComplete]
  ; show[e_, r_, steps_] :=
      Grid[
        steps /. {
          {} -> {{"Expr  ", Row[{e, " ", Style["inert", {Italic, Small}]}]}}
        , _ -> { {"Expr  ", e}
               , {"Steps", steps /.
                   { {} -> Style["no definitions apply", Italic]
                   , _ :> OpenerView[{Length@steps, dynamic@Column[steps]}]}
                 }
               , {"Result", r}
               }
        }
      , Alignment -> Left
      , Frame -> All
      , Background -> {{LightCyan}, None}
      ]
  ; TraceScan[pre, expr, ___, post]
  ; Deploy @ Pane[steps[[1]] /. dynamic -> Dynamic, ImageSize -> 10000]
  ]
SetAttributes[traceView2, {HoldAllComplete}]

TraceView4

ClearAll@traceView4
traceView4[expr_] :=
  Module[{steps = {}, stack = {}, pre, post},
    pre[e_] := (stack = {steps, stack}; steps = {})
  ; post[e_, r_] :=
      ( steps = First@stack ~Join~ {{e, steps, HoldForm[r]}}
      ; stack = stack[[2]]
      )
  ; SetAttributes[post, HoldAllComplete]
  ; TraceScan[pre, expr, ___, post]
  ; DynamicModule[{focus, show, substep, enter, exit}
    , focus = steps
    ; substep[{e_, {}, _}, _] := {Null, e, Style["inert", {Italic, Small}]}
    ; substep[{e_, _, r_}, p_] :=
        { Button[Style["show", Small], enter[p]]
        , e
        , Style[Row[{"-> ", r}], Small]
        }
    ; enter[{p_}] := PrependTo[focus, focus[[1, 2, p]]]
    ; exit[] := focus = Drop[focus, 1]
    ; show[{e_, s_, r_}] :=
       Column[
         { Grid[
             { {"Expression", Column@Reverse@focus[[All, 1]]}
             , { Column[
                   { "Steps"
                   , focus /.
                       { {_} :> Sequence[]
                       , _ :> Button["Back", exit[], ImageSize -> Automatic]
                       }
                   }
                 ]
               , Grid[MapIndexed[substep, s], Alignment -> Left]
               }
             , {"Result", Column@focus[[All, 3]]}
             }
           , Alignment -> Left, Frame -> All, Background -> {{LightCyan}}
           ]
         }
       ]
    ; Dynamic @ show @ focus[[1]]
    ]
  ]
SetAttributes[traceView4, {HoldAllComplete}]
 84
Author: WReach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:35:05

Tylko aktualizacja niezwykle użytecznej funkcji Wreacha traceView: bardziej kompaktowy widok, większe przyciski do otwierania/zwijania hierarchii, zapisywanie Stanów przycisków.

ClearAll[traceViewCompact];
SetAttributes[traceViewCompact, {HoldAllComplete}];
traceViewCompact[expr_] := 
  Module[{steps = {}, stack = {}, pre, post, show, default = False},
   pre[e_] := (stack = {steps, stack}; steps = {});
   post[e_, 
     r_] := (steps = First@stack~Join~{show[e, HoldForm@r, steps]}; 
     stack = stack[[2]]);
   SetAttributes[post, HoldAllComplete]; 
   show[e_, r_, steps_] := Module[{open = False},
     Grid[
      steps /. {{} -> {{"Expr  ", 
           Item[e, Background -> [email protected]]}}, _ -> {{"Expr  ", 
           e}, {Toggler[
            Dynamic@
             open, {True -> 
              Button["Steps", Appearance -> {"DialogBox", "Pressed"}],
              False -> Button@"Steps"}], 
           steps /. {{} -> Style["no definitions apply", Italic], _ :>
               Dynamic@
               If[open, Column@steps, 
                Grid@{{Length@steps, "steps"}}]}}, {"Result", r}}}, 
      Alignment -> {Left, Center}, Frame -> All, 
      Spacings -> Automatic, Background -> {{Hue[.65, .1, 1]}, None}]
     ];
   TraceScan[pre, expr, ___, post];
   Deploy@Column@{
      Opener@Dynamic@default,
      Dynamic@Pane[First@steps, ImageSize -> 10000]
      }];


traceViewCompact[(a + 1) + 2]

Mathematica graphics

 21
Author: István Zachar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-19 23:17:01

Oto moje podejście, również oparte na technice Openerview Wreacha. Jego układ jest znacznie bardziej zwarty, choć mniej wyraźny, niż jego traceView2 i z tego co wiem, jedyną informacją poświęconą jest wyświetlanie liczby kroków ukrytych wewnątrz każdego OpenerView. Wyrażenia, które nie zostały zmienione przez ewaluację, są wskazywane przez wyłączony podgląd OpenerView, chociaż zrzut ekranu, który zrobiłem, nie pokazuje różnicy między wyłączonym a włączonym OpenerView.

SetAttributes[TraceView, HoldFirst]

TraceView[e_, s___, opts : OptionsPattern[Trace]] := 
 Module[{show2},
  show2[{expr_, steps__}] := 
  OpenerView[{expr, Column[show2 /@ {steps}]}]; 
  show2[{HoldForm[x_]}] := Row[{Opener[True, Enabled -> False], HoldForm[x]}]; 
  show2[HoldForm[x_]] := HoldForm[x];
  show2[Trace[Unevaluated[e], s, opts, TraceOriginal -> True]]
 ]

Wyjście TraceView

 12
Author: joebolte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-05 16:37:24