Re: Mathematica daily WTF

*To*: mathgroup at smc.vnet.net*Subject*: [mg114985] Re: Mathematica daily WTF*From*: kj <no.email at please.post>*Date*: Sun, 26 Dec 2010 04:02:12 -0500 (EST)*References*: <if1o3h$p60$1@smc.vnet.net>

In <if1o3h$p60$1 at smc.vnet.net> Bill Rowe <readnews at sbcglobal.net> writes: >Adding more layers of abstraction won't change this behavior. >Additional layers of abstraction simply obscures the fact that >Set doesn't pass on attributes. Our brains, yours and mine, are clearly deformed in very different ways... Mine has been deformed by programming languages other than Mathematica, in which assignment does transfer everything, and where one common way to exploit localization in a dynamic scope involves starting out by copying the global value to the local value (which is subsequently modified, with the knowledge that all these modifications will be effectively rolled back at the end of the dynamic scoping construct). Hence, it is definitely surprising to someone with this experience to learn that one can't do this with Mathematica's so-called "dynamic scoping" construct, namely Block. Why? Well, it's ***logically obvious***, isn't it: Mathematica's "initialization" doesn't transfer most of a symbol's values to the LHS of the "assignment". (Why would anyone be surprised, I wonder...) In fact, this limitation severely reduces the usefulness of dynamic scoping in Mathematica to the case where localization equals "clean slate". The fact that these limitations of Mathematica's so-called "assignment" are true not only of the initialization clause of a Block statement, but actually true *everywhere* in Mathematica is only more WTF-worthy, not less. In fact, I don't know of any simple way to fully copy one variable to another in Mathematica. It can be done, I'm sure, but not succinctly, AFAIK. Here's another hilarious bit: Block[{Sin = Sin}, Print[N[Sin[Pi/4]]]; Print[Messages[Sin]]; ] Sin[0.785398] {HoldPattern[Sin::usage]:>Sin[z] gives the sine of z. } Indeed, as described already, assigning Sin to Sin in the Block's initialization clause gets me nothing useful, the local Sin is dead as a doornail, and yet it still carries around its now totally inaccurate, hence useless, usage message! That's touching. (To be precise, the initialization shown above is not responsible for the persistence of the messages; one would get exactly the same results if the initialization clause had been {Sin} instead of {Sin=Sin}.) The utility of keeping the messages around when everything else about the symbol has been stripped away is beyond me. Bottom-line: the meanings that Mathematica puts on of bread-and-butter programming terms like "="/"assignment", "value", and "dynamic scope" are entirely sui-generis, and therefore the Mathematica documentation should at least show the user the courtesy of making this perfectly clear, rather than let him/her figure all this out through hard knocks (in the form of "things that *should* work but don't"). ~kj