自定义表示法问题

时间:2010-11-16 03:02:07

标签: wolfram-mathematica

我经常需要提取以将值列表限制为子列表,即如果vals给出vars={x1,x2,x3,x4}的值,并且我需要值svars={x2,x4}我会restrict[list,vars,svars]其中< / p>

restrict[vars_, svars_, vals_] := 
 Extract[vals, Flatten[Position[vars, #] & /@ svars, 1]]

我希望通过为restrict[vars,svars,vals]定义以下自定义表示法来提高代码可读性

http://yaroslavvb.com/upload/custom-notation.png

我的问题是

  1. 实现这个的好方法是什么?
  2. 这是一个好主意吗?

2 个答案:

答案 0 :(得分:4)

好的符号可能非常有用 - 但我不确定是否需要这个特殊的符号...

也就是说,Notation包让这很容易。由于使用表示法调色板时有许多隐藏框,我将使用屏幕截图:alt text

您可以使用NotationMake*选项查看基础Action -> PrintNotationRules下行值构造。在[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]}]]

答案 1 :(得分:3)

关于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挖掘它们):