Od czasu do czasu lubimy sprawdzać, jak zdefiniowane są niektóre funkcje System`
(gdy są napisane w Mathematica). To pytanie dotyczy najlepszego sposobu na zrobienie tego.Jaki jest najlepszy sposób odczytu kodu z już zdefiniowanej funkcji (szczególnie z kontekstu Systemu)?
Punkty do pamiętać:
couse
ReadProtected
musi najpierw zostać usunięte.Winsins zazwyczaj muszą być użyte przynajmniej raz, zanim zostaną załadowane do jądra. Czy pojedyncze proste wywołanie zwykle wystarcza do tego, gdy mają rozszerzoną funkcjonalność (np. Poprzez opcje)?
Information
(??
) nadaje definicję w trudnym do odczytania formacie (bez wcięcia, a wszystkie prywatne nazwy kontekstowe zostały dodane). Jaki jest najlepszy sposób na pozbycie się nazw kontekstowych i uzyskanie sformatowanego kodu?Jednym z pomysłów na pozbycie się pewnych kontekstów jest
Block[{$ContextPath = Append[$ContextPath, "SomeContext`Private`"], Information[symbol]]
. Kod może być automatycznie formatowany za pomocą Workbencha. Niektóre problemy pozostają, np.Information
nie cytuje ciągów znaków, uniemożliwiając skopiowanie kodu do Workbencha.
Ogólnie, jestem zainteresowany tym, jak ludzie to zrobić, jakich metod używają, aby kod builtins jak łatwe do odczytania, jak to możliwe.
Przypadek użycia: Na przykład niedawno wykopałem kod RunThrough
, gdy dowiedziałem się, że po prostu nie działa on w systemie Windows XP (okazuje się, że nie podaje nazw plików tymczasowych, gdy ścieżka do nich zawiera spacje).
Aktualizacja:It appears że kiedyś funkcja definicje drukowania bez kontekstu poprzedzany, Developer`ContextFreeForm
, ale to nie działa dłużej w nowszych wersjach.
Możesz pozbyć się prywatnych nazw kontekstów, wpisując kontekst przed wywołaniem '?? '. –
cah