Re: Retrieving pasteable function definition without contexts preprended
- To: mathgroup at smc.vnet.net
- Subject: [mg123945] Re: Retrieving pasteable function definition without contexts preprended
- From: Szabolcs Horvát <szhorvat at gmail.com>
- Date: Sun, 1 Jan 2012 02:28:45 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <jd4fdh$da8$1@smc.vnet.net> <jdh6j4$kmd$1@smc.vnet.net>
On 2011.12.29. 8:58, A Retey wrote: > Hi, > >> I'm essentially asking the same question that E. Martin-Serrano has >> asked this February (message quoted at the end): >> >> http://forums.wolfram.com/mathgroup/archive/2011/Feb/msg00515.html >> >> What is the best way to print the definition of a package symbols >> without contexts, so it's more readable? >> >> To his question (what is a substitute to Developer`ContextFreeForm), we >> can use Block[{$ContextPath = Append[$ContextPath = >> "contextIdontWantPrinted`", FullDefinition[symbol]] >> >> This method still has a problem though. The definition that's printed >> cannot be copied directly because quotation marks are missing. I would >> like to copy it to Workbench for formatting. >> >> Take for example the definition of RunThrough which contains >> WriteString[tmpfile, "\n"]. The "\n" part won't show at all. >> >> Are there any other solutions? Do you have any other suggestion about >> making it easy to read the code of already defined function (when we >> don't have access to the source file)? >> >> Note: I also asked about this here >> <http://stackoverflow.com/questions/8607813> and got an alternative >> answer to pasting to Workbench for formatting. > > I'm not sure whether this is really what you need, but from your > description you are only missing an InputForm in the > stackoverlfow-suggestion. The following gives code that can be copied > and pasted to workbench: > > Unprotect[RunThrough]; > > ClearAttributes[RunThrough, ReadProtected] > > Block[{$ContextPath = Append[$ContextPath, "System`Dump`"]}, > Print[InputForm[FullDefinition[RunThrough]]]] > Thank you, this indeed solves the problem! I am not sure why I thought that InputForm doesn't affect FullDefinition ... It's also important to note that Print[] is essential here. Without it the context names are not removed. Based on this, here's a function to print definitions with the commonest context removed: commonestContext[sym_Symbol] := Commonest[ Cases[ Level[DownValues[sym], {-1}, HoldComplete], s_Symbol /; FreeQ[$ContextPath, Context[s]] :> Context[s] ], 1] contextFreeDefinition[sym_Symbol] := Internal`InheritedBlock[{sym}, ClearAttributes[sym, ReadProtected]; Block[ {$ContextPath = Join[$ContextPath, commonestContext[sym]]}, Print@InputForm[FullDefinition[sym]] ] ] Example use: contextFreeDefinition[RunThrough] -- Szabolcs Horvát Mma QA site proposal: http://area51.stackexchange.com/proposals/37304