Re: problem writing debugging utility function
- To: mathgroup at smc.vnet.net
- Subject: [mg100308] Re: problem writing debugging utility function
- From: "dabrowsa at indiana.edu" <dabrowsa at indiana.edu>
- Date: Sun, 31 May 2009 06:37:36 -0400 (EDT)
- References: <gvq09k$mqv$1@smc.vnet.net>
Thanks a lot to Leonid, Szabolcs, and Ken for their solutions. I
liked Leonid's the best, being both much simpler and more general than
mine.
SetAttributes[ShowIt, HoldAll];
ShowIt[code_] :=
Module[{y},
Print[ToString[Unevaluated[code]], " = ", y = code];
y];
My own solution was the hideous
$PreRead=ReplaceAll[#,{{"dbgv","[",var_,"]"}:>{"Print","[",RowBox
[{"\""<>var<>" = "<>"\"",",",var}],"]"}}]&;
which makes dbgv work like a macro. The grotesqueness is because what
$PreRead sees is a very raw input form, with expressions broken down
into RowBox's. In a sense this is the most direct analog to Lisp's
macros, but ... yechh.
The Unevaluated[] function had slipped off my radar, probably because
I never fully grokked the distinction between it and Hold[]. In fact
I'm still a bit confused about it. At first I thought it might like
the evaluation inhibitor ` in Lisp, but some examples disabused me of
that.
In[2]:= f@Unevaluated[5 + 6 + 7 + 8]
Out[2]= f[Unevaluated[5 + 6 + 7 + 8]]
In[11]:= ToString@Unevaluated[5 + 6 + 7 + 8]
Out[11]= "5 + 6 + 7 + 8"
I might have expected Out[11]= "Unevaluated[5 + 6 + 7 + 8]"
In[13]:= sqr[x_] := x^2
In[14]:= sqr@Unevaluated[5 + 6 + 7 + 8]
Out[14]= 676
I might have expected Out[14]= sqr[5 + 6 + 7 + 8] since sqr does not
know what to do with the pattern _+_+_+_ or _+_ for that matter.
Could anyone elucidate this for me?