Input Mathematica中整数的未赋值输入

Input Mathematica中整数的未赋值输入,input,wolfram-mathematica,integer,Input,Wolfram Mathematica,Integer,我对mathematica有一个非常简单但棘手的问题: 我需要/想要使用前导零输入符号 \[alpha]^0123 甚至更简单 mysymbol[0123] 然后我将其转换为我的内部表示 (使用符号包和整数数字[]或字符[]) 对于没有前导0的输入,一切正常 但无论我尝试什么(未赋值[]或保持[]),mathematica(它的总体求值器?)都会转换整数 0123 => 123 因此,我的列表中将缺少0 当然,我可以通过在输入中使用引号或逗号来避免这个问题,但这太不恰当了 有什么想法

我对mathematica有一个非常简单但棘手的问题:

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

\[alpha]^0123
甚至更简单

mysymbol[0123]
然后我将其转换为我的内部表示

(使用符号包和整数数字[]或字符[])

对于没有前导0的输入,一切正常

但无论我尝试什么(未赋值[]或保持[]),mathematica(它的总体求值器?)都会转换整数

0123 => 123
因此,我的列表中将缺少0

当然,我可以通过在输入中使用引号或逗号来避免这个问题,但这太不恰当了


有什么想法吗

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

这仍然有点危险,因为一旦定义了
$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]

NoEscape,我给你的答案是错的。有一种方法可以满足你的愿望。请看我重写的答案。哇,谢谢。我威胁要投否决票,这似乎效果不错;o) 胡萝卜通常比大棒更管用。我最初的回答并没有忽略你在问题中所说的,它只是试图解释我(错误地)认为系统的局限性。(继续删除评论,因为它们不再有意义。)这只是风格的问题。我使用了更受限制的域函数,因为这是我预期的输入(实际上是使用
DigitCharacter..
过滤)
FromDigits
在这个应用程序中也比
ToExpression
快。如果我正在构建一个包,那么设置$PreRead的最佳实践是什么?可能它是由另一个包设置的?第一行中的FromDigits/@有效,但有误导性。看起来我们试图从数字中再次得到一个整数,但我们没有。为什么不使用ToExpression/@Characters@s@NoEscape正如我所说,“
$PreRead
仍然有点危险”--您完全正确,它可能已经在使用中,如果您试图在包中包含类似的内容,这会导致问题。我建议您将
$PreRead
(如果已定义)的现有值保存到另一个全局变量,例如
$oldPreRead
,然后应用它。示例:
$oldPreRead=If[ValueQ@$PreRead,$PreRead,Identity]$预读=(#/.{(*replacements*)})/$oldPreRead)和
mysymbol[0123]
myrep[{0, 1, 2, 3}]