Пользовательский вопрос - PullRequest
2 голосов
/ 16 ноября 2010

Мне часто нужно извлекать, чтобы ограничить списки значений подсписками, т. Е. Если 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

Мои вопросы

  1. Что такое хорошийспособ реализовать это?
  2. Это вообще хорошая идея?

Ответы [ 2 ]

4 голосов
/ 16 ноября 2010

Хорошие записи могут быть очень полезны - но я не уверен, что этот конкретный нужен ...

Тем не менее, пакет Notation делает это довольно легко.Поскольку при использовании палитры Нотации есть много скрытых полей, я буду использовать снимок экрана: alt text

Вы можете увидеть базовую конструкцию NotationMake* downvalues ​​с помощью опции 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]}]]
3 голосов
/ 16 ноября 2010

Что касается 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 (спасибоСаймону за то, что они их выкопали):

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...