Re: Thread
- To: mathgroup at smc.vnet.net
- Subject: [mg53249] Re: Thread
- From: Peter Pein <petsie at arcor.de>
- Date: Mon, 3 Jan 2005 04:29:26 -0500 (EST)
- References: <cr8eem$r86$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Carlo Teubner wrote: > I'm trying to write a variant of Thread which takes into account > options. That is, I want > > ThreadOptions[ f[{1,2}, Opt1 -> {a,b}, Opt2 -> {x,y}] ] > > to give > > {f[1, Opt1 -> a, Opt2 -> x], f[2, Opt1 -> b, Opt2 -> y]}. > > A first approximation I've come up with is > > ThreadOptions[f_[args___, opts___?OptionQ]] := > Thread[f[args, Inner[Rule, Sequence@@Thread[{opts}, Rule], List]]] > > Now I get > > {f[1, {Opt1 -> a, Opt2 -> x}], f[2, {Opt1 -> b, Opt2 -> y}]} > > which is close. I need to get rid of the {}. The following works: > > ThreadOptions[f_[args___, opts___?OptionQ]] := > Thread[f[args, Inner[Rule, Sequence@@Thread[{opts}, Rule], seq]]] /. > seq -> Sequence > > However, there is a problem: now f gets evaluated before replacing the > seq with Sequence objects. To get around this, I tried using Unevaluated: > > ThreadOptions[f_[args___, opts___?OptionQ]] := > Unevaluated[Thread[f[args, Inner[Rule, Sequence@@Thread[{opts}, > Rule], seq]]] /. seq -> Sequence > > But it doesn't work; I get: > > Thread::tdlen : Objects of unequal length in f[{1, 2}, {Opt1 -> a, > Opt2 -> x, Opt1 -> b, Opt2 -> y}] cannot be combined. > > f[{1, 2}, {Opt1 -> a, Opt2 -> x, Opt1 -> b, Opt2 -> y}] > > I assume what's happened is that ReplaceAll has been applied to the > Unevaluated expression, which has not been evaluated. > > Is there any way at all of Thread'ing a function, but then not > evaluating it? Are there other ways of creating a ThreadOptions function? > > Thanks for any help. > > Carlo > > Is this: In[1]:= ThreadOptions[f_[args___, opts___?OptionQ]] := Module[{myf}, Thread[myf[args, Inner[Rule, Sequence @@ Thread[{opts}, Rule], seq]]] /. {seq -> Sequence, myf -> f}] In[2]:= ThreadOptions[f[{1, 2}, Opt1 -> {a, b}, Opt2 -> {x, y}]] Out[2]= {f[1, Opt1 -> a, Opt2 -> x], f[2, Opt1 -> b, Opt2 -> y]} what you want? -- Peter Pein Berlin