I often need to extract to restrict value lists to sublists, ie if vals
gives values of vars={x1,x2,x3,x4}
, and I need values of svars={x2,x4}
I do restrict[list,vars,svars]
where
restrict[vars_, svars_, vals_] :=
Extract[vals, Flatten[Position[vars, #] & /@ svars, 1]]
I'd like to improve code readability, perhaps by defining following custom notation for restrict[vars,svars,vals]
http://yaroslavvb.com/upload/custom-notation.png
My questions are
- What is a good way to implement this?
- Is this a good idea altogether?
Good notations can be very useful - but I'm not sure that this particular one is needed...
That said, the
Notation
package makes this pretty easy. As there are many hidden boxes when you use the Notation palette, I'll use a screenshot:You can see the underlying
NotationMake*
downvalues construct by using theAction -> PrintNotationRules
option. In[4] in the screenshot generatesWith regard to 2: I would pass the rule list
Thread[vars -> vals]
instead of keeping track of names and values separately.One of my favorite Mathematica idioms is to use rule lists together with
WithRules
as defined below: This construct evaluates an expression in aWith
block where all the replacement symbols have been (recursively defined). This allow you to do stuff likeand gets you quite far towards named arguments.
Edit: The
WithRules
construct is based on these two usenet threads (thanks to Simon for digging them up):