MathGroup Archive 2011

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Visibility of value of variable bindings in module

  • To: mathgroup at smc.vnet.net
  • Subject: [mg121239] Re: Visibility of value of variable bindings in module
  • From: Leonid Shifrin <lshifr at gmail.com>
  • Date: Tue, 6 Sep 2011 03:54:51 -0400 (EDT)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • References: <201109042205.SAA21480@smc.vnet.net>

Hi Chris,

As others noted, there is no built-in form that would do that. There were
however
several attempts to define such an operator within Mathematica. Here is
mine:

ClearAll[LetL];
SetAttributes[LetL, HoldAll];
LetL /: Verbatim[SetDelayed][lhs_, rhs : HoldPattern[LetL[{__}, _]]] :=
   Block[{With}, Attributes[With] = {HoldAll};
     lhs := Evaluate[rhs]];
LetL[{}, expr_] := expr;
LetL[{head_}, expr_] := With[{head}, expr];
LetL[{head_, tail__}, expr_] :=
  Block[{With}, Attributes[With] = {HoldAll};
    With[{head}, Evaluate[LetL[{tail}, expr]]]];


What it does is to macro-expand the definition into nested `With` at
definition-time. Here is a simple example:

In[29]:= LetL[{a=2,b=a+3,c=a+b+4},c]
Out[29]= 11

Because the definition is expanded not at run-time but at definition-time,
LetL preserves the semantics of functions defined with patterns having local
variables shared between the body and the condition. In particular, this
will work:

Clear[f];
f[x_,y_]:=LetL[{xl=x,yl=y+xl+1},xl^2+yl^2/;(xl+yl<15)];
f[x_,y_]:=x+y;

?f
Global`f
f[x_,y_]:=With[{xl=x},With[{yl=y+xl+1},xl^2+yl^2/;xl+yl<15]]

f[x_,y_]:=x+y

By nature of the LetL function (macro), it should play well with other
(built-in)
scoping constructs for issues like variable name conflicts in nested scoping
constructs.
There won't alas  be code highlighting for it.

The more extended discussion of this construct lives here:

http://stackoverflow.com/questions/5866016/question-on-condition/5869885#5869885
,

where I also provided a link to the original Mathgroup thread where this
code
was first published.

I did not do it, but one should be able to write a similar macro for Module.

Hope this helps.

Regards,
Leonid




On Mon, Sep 5, 2011 at 2:05 AM, caw <cawright.99 at gmail.com> wrote:

> Hi
>
> Module[{x = Sum[i, {i, Length[{1, 2, 3}]}], y = x + 1}, Print[y];
> Print[x]]
>
> prints out:
>
> 1 + x
> 6
>
> So, in the variable declaration section of the Module statement, the
> binding of x to 6 isn't visible to y.
> (It's a bit like let and let*, but not)
>
> Is there a form which will allow the bindings to be visible within the
> variable declaration section?
>
> thanks very much
>
> chris
>
>



  • Prev by Date: Re: Confusing Result with Series
  • Next by Date: Re: Confusing Result with Series
  • Previous by thread: Re: Visibility of value of variable bindings in module
  • Next by thread: Re: Visibility of value of variable bindings in module