代码之家  ›  专栏  ›  技术社区  ›  Yaroslav Bulatov

自定义符号问题

  •  2
  • Yaroslav Bulatov  · 技术社区  · 15 年前

    我经常需要提取以将值列表限制为子列表(如果 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]


    (来源: yaroslavvb.com )

    我的问题是

    1. 什么是实现这一点的好方法?
    2. 这完全是个好主意吗?
    2 回复  |  直到 6 年前
        1
  •  4
  •   Simon    15 年前

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

    也就是说 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]}]]
    
        2
  •  3
  •   Janus    15 年前

    关于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]]
    

    编辑: 有规则的 构造基于这两个usenet线程(感谢Simon挖掘它们):