Пользовательская запись постфикса, Применить / Функция - PullRequest
10 голосов
/ 15 марта 2011

Я хотел бы настроить следующие пользовательские обозначения в Mathematica 7.

Эта запись не особенно полезна сама по себе, поэтому, пожалуйста, не предлагайте существующие альтернативы и не указывайте, что это экономит только несколько нажатий клавиш.

Я хочу знать, если и как это можно сделать.


В настоящее время можно ввести

f = #2 + #^2 / #3 & @@ # & ;

f[ {a, b, c} ]

Out[]= b + a^2 / c

Где внутренняя функция #^2 / #3 + #2 & равна Apply 'd первому аргументу.


Я хотел бы реализовать синтаксис

f = #2 + #^2 / #3 @@& ;

и пусть он ведет себя точно так же. Таким образом, @@& представляет Function, который автоматически применяется к его первому аргументу.

Он должен иметь такую ​​же привязку, что и символ & .


Предпочтительно, чтобы это было сделано с пакетом Notations, насколько это возможно, а не с ручным MakeBoxes, для простоты настройки аналогичных обозначений, даже если используется Notations труднее общаться с помощью текста.

1 Ответ

9 голосов
/ 15 марта 2011

Вы не можете сделать это с помощью синтаксиса оператора вашего собственного изобретения (например, @@&). Mathematica просто не имеет возможности изменять грамматику языка во время выполнения.

С пакетом Notation вы можете получить хотя бы частично, но вы должны использовать символ, который не имеет смысла в Mathematica, и, возможно, в большинстве случаев с одним из операторов без встроенного значения , но большинство (если они есть) не связываются как постфиксные операторы.

Здесь, например, я буду использовать пакет Notations, чтобы определить символ \[Wolf] как общеизвестный псевдо-постфиксный оператор вместо @@&:

In[1]:= Needs["Notation`"]

In[2]:= Notation[x_ \[Wolf] \[DoubleLongLeftRightArrow] (x_ @@ # &)]

In[3]:=  f=#2+#^2/#3& \[Wolf]
Out[3]= (#2+#1^2/#3&) \[Wolf]

In[4]:= f[{a,b,c}]
Out[4]= b+a^2/c

Я также добавлю скриншот, так как здесь используется нотация:

example operator hackery

Где этот подход может потерпеть неудачу, так это в том, что вы не можете установить приоритет оператора для произвольного символа, такого как \[Wolf]. Вместо этого вы можете использовать один из бессмысленных операторов, на которые я ссылался выше, но они также имеют фиксированный приоритет, который нельзя изменить.

Если вы нашли PrecedenceForm в документации, вы можете получить краткую ложную надежду, но, как говорят в документации, это влияет только на печать, а не на оценку.

НТН!

...