Re: A version of With that binds variables sequentially
- To: mathgroup at smc.vnet.net
- Subject: [mg94641] Re: A version of With that binds variables sequentially
- From: rych <rychphd at gmail.com>
- Date: Thu, 18 Dec 2008 07:23:20 -0500 (EST)
- References: <gi5jof$prg$1@smc.vnet.net>
On Dec 15, 12:49 pm, "D. Grady" <D.C.Gr... at gmail.com> wrote: > Many times when I'm programming, I write code like this: > > With[{a1 = 5}, > With[{a2 = f[a1]}, > With[{a3 = g[a1, a2]}, > h[a1, a2, a3]]]] > > I wish I could write this instead: > > With[{ > a1 = 5, > a2 = f[a1], > a3 = g[a1, a2]}, > h[a1, a2, a3]] > > Although With doesn't work this way, I didn't see any reason that it > shouldn't, so I wrote a function called WithMany. It works by taking > something in the second form above and holding all of the arguments, > expanding out to the first form, and then releasing the hold. > I've done something similar in the past. Here is my version: Off[With::"lvlist"] Off[Module::"lvlist"] ClearAll[WithWith, WithModule] SetAttributes[{WithWith, WithModule}, HoldAll] WithWith[x__, expr_] := ReleaseHold@ Fold[With[#2, #1] &, Hold[expr], Reverse@Map[Hold, Unevaluated@{x}] /. Hold[h_[y__]] :> Hold[{h[y]}] /; h =!= List] WithModule[x__, expr_] := WithWith[xh = Reverse@Map[Hold, Unevaluated@{x}] /. Hold[h_[y__]] :> Hold[{h[y]}] /; h =!= List, xh1 = First@xh, ReleaseHold@Fold[With[#2, #1] &, Module[xh1, Hold[expr]], Rest@xh] ] I think if I spend some time deciphering it, it's going to look the same. (I must never never never write undocumented "one-liners") Igor