我正在使用Notation包在Mathematica中尝试语法mod。
我对特定字段的数学符号不感兴趣,而是对通用语法修改和扩展感兴趣,特别是减少Mathematica的VeryLongFunctionNames的冗长,清理笨拙的构造或以令人愉快的方式扩展语言的符号。
示例修改是将Fold[f, x]
定义为评估为Fold[f, First@x, Rest@x]
这很好用,非常方便。
另一个是将*{1,2}
定义为评估为Sequence @@ {1,2}
受到Python的启发;这在Mathematica中可能有效,也可能无效。
请提供以下信息或链接:
符号和语法修改的限制
实施提示和技巧
现有的包裹,示例或实验
为什么这是一个好主意或坏主意
答案 0 :(得分:5)
答案 1 :(得分:3)
不是一个完整的答案,只是为了展示我学到的技巧here(与符号重新定义更相关而不是符号,我估计):
Unprotect[Fold];
Fold[f_, x_] :=
Block[{$inMsg = True, result},
result = Fold[f, First@x, Rest@x];
result] /; ! TrueQ[$inMsg];
Protect[Fold];
Fold[f, {a, b, c, d}]
(*
--> f[f[f[a, b], c], d]
*)
修改
感谢@rcollyer以下内容(请参阅下面的评论)。
您可以使用$ inMsg变量来打开或关闭定义:
$inMsg = False;
Fold[f, {a, b, c, d}]
(*
->f[f[f[a,b],c],d]
*)
$inMsg = True;
Fold[f, {a, b, c, d}]
(*
->Fold::argrx: (Fold called with 2 arguments; 3 arguments are expected.
*)
Fold[f, {a, b, c, d}]
这在测试时非常宝贵
答案 2 :(得分:3)
(我的第一个回复/帖子......温柔)
根据我的经验,功能似乎是一个编程的死胡同。定义自定义表示法的能力似乎在很大程度上取决于使用“表示法调色板”来定义和清除每个自定义表示法。 ('一切都是表达'......好吧,除了一些模糊的情况,比如Notations,你必须使用调色板。)Bummer。
Notation包文档明确提到了这一点,所以我不能抱怨太多。
如果您只想在特定笔记本中定义自定义标记,Notations可能对您有用。另一方面,如果您的目标是在YourOwnPackage.m中实现自定义表示法并将其分发给其他人,则可能会遇到问题。 (除非你对Box结构非常流利?)
如果有人可以纠正我对此的无知,你就可以赚到我的月份!! :)
(我希望使用Notations强制MMA将下标变量视为符号。)