自定义符号问题
我经常需要提取限制值列表到子列表,也就是说,如果vals
给出值vars={x1,x2,x3,x4}
,并且我需要svars={x2,x4}
值,我会restrict[list,vars,svars]
在哪里
restrict[vars_, svars_, vals_] :=
Extract[vals, Flatten[Position[vars, #] & /@ svars, 1]]
我想提高代码的可读性,也许可以通过定义以下自定义符号来restrict[vars,svars,vals]
http://yaroslavvb.com/upload/custom-notation.png
我的问题是
好的符号可能非常有用 - 但我不确定这个特殊的符号是否需要......
也就是说, Notation
包使得这非常简单。 由于使用Notation调色板时有许多隐藏的框,我将使用屏幕截图:
您可以使用Action -> PrintNotationRules
选项来查看底层的NotationMake*
downvalues构造。 在[4]的屏幕截图中生成
NotationMakeExpression[
SubscriptBox[vals_, RowBox[{vars_, "|", svars_}]], StandardForm] :=
MakeExpression[
RowBox[{"restrict", "[", RowBox[{vars, ",", svars, ",", vals}],
"]"}], StandardForm]
NotationMakeBoxes[Subscript[vals_, vars_ | svars_], StandardForm] :=
SubscriptBox[MakeBoxes[vals, StandardForm],
RowBox[{Parenthesize[vars, StandardForm, Alternatives], "|",
Parenthesize[svars, StandardForm, Alternatives]}]]
关于2:我会传递规则列表Thread[vars -> vals]
而不是分别跟踪名称和值。
我最喜欢的Mathematica成语之一是将规则列表与WithRules
一起使用,如下定义:此构造函数评估With
块中所有替换符号已被(递归定义)的表达式。 这可以让你做类似的事情
WithRules[{a -> 1, b -> 2 a + 1}, b]
并让你远离命名参数。
SetAttributes[WithRules, HoldRest]
WithRules[rules_, expr_] := Module[{notSet}, Quiet[
With[{args = Reverse[rules /. Rule[a_, b_] -> notSet[a, b]]},
Fold[With[{#2}, #1] &, expr, args]] /. notSet -> Set,
With::lvw]]
编辑: WithRules
结构基于这两个usenet线程(感谢Simon挖掘它们):