【问题标题】:Unevaluated input of integer in MathematicaMathematica 中未计算的整数输入
【发布时间】:2012-09-17 21:36:03
【问题描述】:

我遇到了一个非常简单但令人讨厌的数学问题:

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

\[alpha]^0123

甚至更简单

mysymbol[0123]

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

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

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

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

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

0123 => 123

所以我的列表中会缺少 0

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

有什么想法吗?

【问题讨论】:

  • NoEscape,我给你的答案是错误的。 一种方法可以做你想做的事。请看我重写的答案。
  • 哇,谢谢。我反对投票的威胁似乎效果很好;o)
  • 胡萝卜通常比大棒更有效。我最初的回答是忽略你在问题中所说的,它只是试图解释我(错误地)认为是系统的限制。 (继续删除 cmets,因为它们不再有意义。)
  • 这只是风格问题。我使用了更受限制的域函数,因为这是我预期的输入(实际上是使用DigitCharacter .. 过滤)。在此应用程序中,FromDigits 也比 ToExpression 快。

标签: input wolfram-mathematica integer


【解决方案1】:

我以肯定的语气回答了这个问题,但我错了。 012316^^8b1*^6 等表达式在解析过程中没有转换,因为我记错了。出于这个原因,我们不需要退回到繁重且笨拙的CellEvaluationFunction,而是可以使用更加用户友好的$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}]

【讨论】:

  • 如果我正在构建一个包,这是设置 $PreRead 的最佳做法 - 也许它已经被另一个包设置了?
  • 第一行中的 FromDigits /@ 有效,但具有误导性。看起来我们正试图从数字中再次创建一个 int,但我们不是。为什么不使用 ToExpression /@ Characters@s
  • @NoEscape 正如我所说,“$PreRead 仍然有点危险”——你说得对,它可能已经在使用,如果你试图包含类似的东西,这会导致问题这个在一个包里。我建议您将$PreRead(如果已定义)的现有值保存到另一个全局变量,例如$oldPreRead,然后应用它。示例:$oldPreRead = If[ValueQ@$PreRead, $PreRead, Identity]; $PreRead = ((# /. { (* replacements *) }) // $oldPreRead) &;
猜你喜欢
  • 1970-01-01
  • 2011-04-17
  • 2017-02-09
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多