當我們沒有源文件時,最方便的方式來讀取內存中符號的定義是什麼?(竊取工具)


3

注意:我將Simon的實施方式設為on GitHub。歡迎捐款!


當嘗試使用InformationFullDefinition讀取已定義(打包或內置)符號的定義時,最大的不便是,所有符號名稱前都會出現許多分散注意力的私有上下文名稱。

當前,我正在使用一個小功能contextFreeDefinition[]來避免此問題。它將嘗試隱藏定義中最頻繁出現的上下文名稱。contextFreeDefinition[]基於this answer

比較例如ClearAttributes[RunThrough, ReadProtected]; Information[RunThrough]contextFreeDefinition[RunThrough]。後者的混亂程度要小得多,因為在定義中隱藏了System`Dump`上下文。(我通常將此函數的輸出粘貼到Workbench中,並使用Source -> Format上下文菜單項重新縮進以提高可讀性)


不幸的是,contextFreeDefinition[]並不總是能夠成功隱藏上下文,例如,嘗試以下操作:

ImportString["1", "List"]; (* force Stub symbols to be loaded *)

System`Convert`TableDump`ImportList // contextFreeDefinition

,請注意,幾個符號(尤其是模式)仍帶有System`Convert`TableDump`。例如,我在打印的FullDefinition中看到以下內容:

protectRegEx[System`Convert`TableDump`s_String] := 
     StringReplace[System`Convert`TableDump`s, $ProtectedCharacterRules]

即使函數試圖完全隱藏該上下文,符號FullDefinition0仍然具有上下文名稱。

問題:如何修復contextFreeDefinition[]以使其始終隱藏上下文,或者還有哪些其他替代方法可讀取內存符號的定義?


contextFreeDefinition[]的代碼。

Clear[commonestContexts, contextFreeDefinition]

commonestContexts[sym_Symbol, n_: 1] := Quiet[
  Commonest[
   Cases[Level[DownValues[sym], {-1}, HoldComplete], 
    s_Symbol /; FreeQ[$ContextPath, Context[s]] :> Context[s]], n],
  Commonest::dstlms]

contextFreeDefinition::contexts = "Not showing the following contexts: `1`";

contextFreeDefinition[sym_Symbol, contexts_List] := 
 (If[contexts =!= {}, Message[contextFreeDefinition::contexts, contexts]];
  Internal`InheritedBlock[{sym}, ClearAttributes[sym, ReadProtected];
   Block[{$ContextPath = Join[$ContextPath, contexts]}, 
    [email protected][FullDefinition[sym]]]])

contextFreeDefinition[sym_Symbol, context_String] := 
 contextFreeDefinition[sym, {context}]

contextFreeDefinition[sym_Symbol] := 
 contextFreeDefinition[sym, commonestContexts[sym]]

了解並使用該功能:

FullDefinition3將在符號FullDefinition6的定義中找到不在FullDefinition5中的FullDefinition4最常用的上下文。

FullDefinition7將打印FullDefinition6的FullDefinition,隱藏在那裡出現的最普通的上下文。它還會發出一條消息,其中上下文的名稱被隱藏。

contextFreeDefinition[]0將嘗試隱藏一個明確給定的上下文列表。

4

Hold'em Poker means having the 5 best cards available, your hand + board, and her hand + board. You both made a straight, doesn't matter what u have left over.

This setup is a split pot, i guess u mixed something up. She probably had 10 and Ace or Ace Queen or Ace King for a Full House, which beats a straight.