On 2008-07-29 06:11:06 -0400, Valeri Astanoff <astanoff at gmail.com> said:
> On 29 juil, 07:47, Stoney Ballard <ston... at gmail.com> wrote:
>> Is there a straight-forward way to write a function that takes a list
>> of symbols that are bound in the calling environment and produce a
>> list such as is produced by Solve, like {var1->val1, var2->val2,...}?
>>
>> Currently, I'm using an expression (not a function) like {Hold[var1]-> var=
> 1, Hold[var2]->var2}, which produces the right result, but it
>>
>> looks bad to duplicate the symbols. I want something that looks clean,
>> like bindings[var1, var2,...].
>>
>> I know this isn't lisp, and there's no binding environment as such,
>> but it would expect this to be doable.
>>
>> TIA for any suggestions.
>>
>> - Stoney
>
> Good day,
>
> This is a solution inspired from Roman Maeder's
> "Programming in Mathematica":
>
> In[1]:= SetAttributes[myRules,HoldAll];
> myRules[vars_List]:=
> With[{vv=Map[Hold,MapAt[Hold,Hold[vars],{1,0}],{2}][[1]]},
> List@@(# -> ReleaseHold[#]& /@ vv)
> ];
>
> In[2]:= var1=3; var2=5;
> myRules[{var1,var2}]
>
> Out[4]= {Hold[var1]->3,Hold[var2]->5}
>
>
> V.Astanoff
It's too bad the quoted-printable conversion made your code difficult
to read in the newsgroup. Once I realized that "With" ignored "Hold",
your solution worked fine. While investigating it, I came up with this
simplified form, which seems to produce the same result:
myRules[vars_List] := Thread[Rule[Map[Hold, Hold[vars], {2}][[1]], vars]]
Thanks for your help.
- Stoney