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.
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]
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:
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}]
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]
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]]
]
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