Re: Is it possible to dynamically construct arguments to With[]?
- To: mathgroup at smc.vnet.net
- Subject: [mg105782] Re: Is it possible to dynamically construct arguments to With[]?
- From: dr DanW <dmaxwarren at gmail.com>
- Date: Fri, 18 Dec 2009 06:24:54 -0500 (EST)
- References: <hgd7ts$bn3$1@smc.vnet.net>
This is a good one. Often when I am working with equations I like to
keep everything symbolic until I am ready to get a numerical result,
then I substitute from a list of parameters of the form {a->2 b, b-
>3.0, "This Parameter"-> Pi, d:>6, ...}. This can get ungainly when I
have a Block[] with several expressions that I need to substitute. I
also found one case where ReplaceAll does not work, and this is
important enough to highlight:
ReplaceAll does not work with SparseArray's.
I have written the series of functions below to help me work with
ParameterList's. The function ParameterBlock[plist, expr] does what
you are asking for, and the substitution also works within
SparseArray's.
By the way, I used this package to experiment with Workbench and have
it fully implemented as a paclet, complete with Mathematica 7
compatible Doc Center files with a Tutorial and a Guide. Let me know
if you would like the complete paclet.
---- snip -----
ParameterListQ[
pl : {(Rule[(_String | _Symbol), _] |
RuleDelayed[(_String | _Symbol), _]) ...}] :=
Max[ Tally[ pl[[All, 1]] ][[All, 2]] ] == 1
ParameterListQ[___] :=
False;
ParameterList[rules___?OptionQ] :=
DeleteDuplicates[Flatten[{rules}], SameQ[First[#1], First[#2]] &]
ParameterBlock[pl_?ParameterListQ, expr_] :=
Block[ Evaluate[FilterRules[pl, _Symbol][[All, 1]]],
Replace[FilterRules[pl, _Symbol], {Rule -> Set,
RuleDelayed -> SetDelayed}, {2}, Heads -> True];
expr //. FilterRules[pl, _String]
]
ResolveParameters[rules___?OptionQ] :=
Module[ {pl},
pl = ParameterList[rules];
pl[[All, 2]] = ParameterBlock[pl, pl[[All, 1]] ];
pl
]
---- end ---
Daniel