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