Re: Re: exchanging 2 elements in a list (problem with Block)
- To: mathgroup at smc.vnet.net
- Subject: [mg27783] Re: [mg27631] Re: exchanging 2 elements in a list (problem with Block)
- From: Richard Fateman <fateman at cs.berkeley.edu>
- Date: Sat, 17 Mar 2001 05:41:07 -0500 (EST)
- Organization: computer science division, UC Berkeley
- References: <933FF20B19D8D411A3AB0006295069B0286951@dassne02.darmstadt.dsh.de>
- Sender: owner-wri-mathgroup at wolfram.com
"Wolf, Hartmut" wrote: > > Dear Allan, > > you'r right, a general problem with, not of, Block. Block indeed does exacly > what it is supposed to do. To declare a bug to be a feature is not to eliminate it. Most people who use Block, do so at the risk of exactly the problem pointed out. Module was created (also in a hackish way that can be broken if you use variables like x$$4, I think), to provide a better but still broken version of programming language scope in Mathematica. > > This kind of problems is shared e.g. by all early Lisp dialects having been > discussed extensively, and being the reason for generally converting to > lexical scoping. Early lisps had dynamic scope by default in interpreted code. Dynamic scope is not, in my view, a bug. In fact, the ANSI standard common lisp provides facilities for having dynamic scope (defvar, special variable declarations). This is not the same as the Mathematica Block bug, which so far as I can tell has no use and should be eliminated from the language. If there is a legitimate example in which the semantics of Block (rather than the semantics of Module) make sense, I would be interested in learning it. > That it is present at all in Mathematica presumably has > historical reasons. Um, it was there before Module, certainly. That it is STILL there I don't know. > However it also has certain advantages, and I'm happy to > have it at my disposal. Can you name one? I can defend it only indirectly, in that Module is ALSO done wrong, and you have a choice of the bugs/inefficiency in Module or the gross bug in Block. If Module were done as in lambda-binding, in Lisp then I can't think of a reason. > We have to be wary however, and routinely better use > Module. So a first thought when seeing a Block might be: "will it work with > Module?" Yep. I agree 100% > > A method to make Block work with Swap1 (not seriously meant for this case) > is to restrict evaluation to where it is needed: > > > In[18]:= Clear[s] > In[19]:= lazySwap[m_,i_,j_] := > Evaluate /@ Block[{s = Unevaluated /@ m}, > s[[{i, j}]] = s[[{j, i}]]; > s] > > In[20]:= lazySwap[{a, s},1,2] > Out[20]= {s,a} > > Finally a note I would like to add to Richard's problem (after all has been > said by you and Jens-Peer Kuska, to mention). His pitfall is common to all > having been absent from Mathematica for a while, and extensively programming > in C or a similiar language, then misconstruing a definition in Mathemtica > for a "function procedure". A definition is a term rewrite rule, and there > is no such thing as a "formal parameter" (with the meaning of a storage > location behind). > Pure lambda calculus wouldn't rise the idea, and Mathematica comes closer to > that than to C. Unfortunately, the Mathematica book assists in this "thought crime" of viewing rules as function definitions. > > How to approach call by reference semantics has been shown by Jens-Peer and > David B. Wagner in his Book "Power Programming with Mathematica, the Kernel" > > http://www.amazon.com/exec/obidos/ASIN/007912237X > devotes all of §4.4 "Parameter-Passing Semantics" (of chapter 4 "Procedural > Programming") to the theme. Thanks for the reference. RJF > > With kind regards, yours > Hartmut >