1

我对数学有一个非常简单但令人讨厌的问题:

我需要/想要使用前导零输入符号

\[alpha]^0123

甚至更简单

mysymbol[0123]

然后我将其转换为我的内部表示

(使用 Notation 包和 IntegerDigits[] 或 Characters[])

==> myrep[{0,1,2,3}]

没有前导 0 的输入一切正常。

但无论我尝试什么(未评估 [] 或保持 []),mathematica(它是首要评估器?)都会转换整数

0123 => 123

所以我的列表中将缺少 0

当然,我可以通过要求输入引号或逗号来避免这个问题,但这很不漂亮!

有任何想法吗?

4

1 回答 1

3

我用肯定的语气回答了这个问题,但我错了。0123正如我错误地回忆的那样,在解析过程中不会转换诸如16^^8b和之类的表达式。出于这个原因,我们不需要回退到繁重且笨拙的CellEvaluationFunction,而是可以使用更加用户友好的.1*^6$PreRead

这仍然有点危险,因为一旦定义为$PreRead,它会更改所有输入,甚至尝试更改$PreRead。例如,如果我们要设置$PreRead = Null &,则在重新启动内核之前无法输入其他命令。

据我了解,为了制定您想要的行为,我们可以使用:

mysymbol[s_String] := myrep[FromDigits /@ Characters@s]

$PreRead = # /. {RowBox[{"mysymbol", "[", digits_String, "]"}] | 
                 RowBox[{digits_String, "//", "mysymbol"}] |
                 RowBox[{"mysymbol", "@", digits_String}] /; 
                 StringMatchQ[digits, DigitCharacter ..] :> 
                 ToBoxes[ mysymbol@digits ]} &;

测试:

mysymbol[0123]
myrep[{0, 1, 2, 3}]
于 2012-09-26T11:20:21.160 回答