自定义符号问题

我经常需要提取限制值列表到子列表,也就是说,如果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挖掘它们):

  • With的一个版本依次绑定变量
  • 将语法高亮添加到自己的命令
  • 链接地址: http://www.djcxy.com/p/35535.html

    上一篇: Custom Notation question

    下一篇: line arguments of Mathematica Kernel and FrontEnd