Wolfram mathematica 如何查找语法错误

Wolfram mathematica 如何查找语法错误,wolfram-mathematica,Wolfram Mathematica,当我在一个单元格中计算一个函数时,Mathematica说 ToExpression::notstrbox: {At Line = 6, the input was:,$Failed,InString[6]} is not a string or a box. ToExpression can only interpret strings or boxes as Mathematica input. >> ToExpression::notstrbox:{At Line=6,输入为:,$Fa

当我在一个单元格中计算一个函数时,Mathematica说

ToExpression::notstrbox: {At Line = 6, the input was:,$Failed,InString[6]} is not a string or a box. ToExpression can only interpret strings or boxes as Mathematica input. >> ToExpression::notstrbox:{At Line=6,输入为:,$Failed,InString[6]} 不是字符串或框。ToExpression只能解释字符串或框 作为输入。>> 单元格右边缘变为红色


如何找到错误位置?

您是否正在调用
以在字符串上表达自己?当应用于字符串时,该函数将为您提供第一个语法错误的字符偏移量,例如:

In[26]:= SyntaxLength["2+"]
Out[26]= 4

In[27]:= SyntaxLength["x[1]+x[2]]"]
Out[27]= 9
请注意,如文档中所示,当
SyntaxLength
返回输入字符串末尾以外的位置时,这意味着该表达式到目前为止在语法上是正确的,但不完整。否则,
SyntaxLength
将有效地返回第一个语法错误的位置


如果您没有显式地调用
来表示某个内容,那么查看相关单元格可能会有所帮助。

语法错误(如不平衡的函数括号)通常通过字符着色、不匹配的括号变为粉红色等方式表示。在这种情况下,出现了输入类型错误。显然,您使用另一个失败函数的结果调用(或使用的函数)来表示。第一步是找到这个ToExpression并找出提供其输入的函数返回$Failed

Mathematica有一个基本的调试器,可以在“求值”菜单中找到。更好的调试器可以在Matica Workbench中找到,如果您拥有卓越服务许可证,它是免费的


如果你的代码不是太大,我建议把它作为你问题的一部分。不过,我们不是代码审查站点。

实际上,内核总是将输入字符串中第一个语法错误的位置发送到前端(如果该输入字符串包含错误)。可以使用以下MathLink代码进行演示:

In[32]:= link = LinkLaunch[First[$CommandLine] <> " -mathlink"];
LinkRead[link];
LinkWrite[link, EnterTextPacket["2+"]]
LinkRead[link]
LinkRead[link]
LinkRead[link]

Out[35]= MessagePacket[Syntax, "sntxi"]    
Out[36]= TextPacket["Syntax::sntxi: Incomplete expression; more input is needed.
 "]    
Out[37]= SyntaxPacket[5]
可以看到
SyntaxPacket
$SyntaxHandler
报告的相同语法错误的位置不一致。但似乎可以理解它们是如何计算位置的:两者都使用输入行的
InputForm
,并且输入行之前的位置对于
$SyntaxHandler
有数字0,对于
SyntaxPacket
有数字1。通过这种方式,我们可以定义
$SyntaxHandler
,以获得输入字符串中语法错误位置的精确视觉表示(输入
单元格
必须具有“RawInputForm”样式),如下所示:

In[41]:= link = LinkLaunch[First[$CommandLine] <> " -mathlink"];
LinkRead[link]
LinkWrite[link, 
 EnterTextPacket[
  "$SyntaxHandler=
      Function[{str,pos},
               Print["Input string: ",ToString[str,InputForm]];
               Print["Position of syntax error: ",pos];
               $Failed
      ];
  "]]
LinkRead[link]
LinkWrite[link, EnterTextPacket["2+"]]
While[Head[packet = LinkRead[link]] =!= InputNamePacket, 
 Print[packet]]; Print[packet]

Out[42]= InputNamePacket["In[1]:= "]    
Out[44]= InputNamePacket["In[2]:= "]    
During evaluation of In[41]:= MessagePacket[Syntax,sntxi]    
During evaluation of In[41]:= TextPacket[Syntax::sntxi: Incomplete expression; more input is needed.
]    
During evaluation of In[41]:= TextPacket[Input string: "2+\n\n"
]    
During evaluation of In[41]:= TextPacket[Position of syntax error: 6
]    
During evaluation of In[41]:= SyntaxPacket[5]    
During evaluation of In[41]:= InputNamePacket[In[2]:= ]
$SyntaxHandler = 
  Function[{str, pos}, 
   Print["Input string: ", ToString[str, InputForm], "\n", 
    "Position of syntax error: ", pos, "\n", 
    StringInsert[ToString[str, InputForm], 
     ToString[Style["\[DownArrowBar]", Red, Background -> Yellow], 
      StandardForm], pos + 2]]; $Failed];
我将再次强调,输入单元格必须具有“RawInputForm”样式!可通过创建普通空输入单元格,然后通过
cell->Convert to
菜单中的相应命令将其转换为“RawInputForm”单元格来创建此类单元格

让我们看看它是如何工作的:


我们必须使用“RawInputForm”单元格的原因可能是,
$SyntaxHandler
只在输入以
字符串
的形式发送到内核时应用,而不是像默认的
标准格式
输入单元格那样以
框的形式应用。

我不是调用expression。我不知道那到底是干什么用的。我在问是否有一种工具或方法可以在笔记本中找到语法错误的实际位置。显然,必须有一种自动化的方法来告诉Mathematica报告此类信息,而不是生成一条消息说某个地方确实发生了语法错误。您使用的Mathematica版本是什么?如果您没有直接使用
来表达
,那么这可能是您正在使用的其他内容中的错误。有趣的是,当我尝试
表达[{“aaaa”,$Failed,InString[6]}]
时,我一点也没有得到任何错误。我会支持将导致错误的笔记本部分张贴出来的建议。正如Sjoerd在另一个回答中所说,许多语法错误都应该用彩色语法突出显示内联标记。有关示例和调整,请参见
首选项>外观>语法着色>错误和警告。如果你的单元格中没有明显的跳出,那可能是Brett指出的一个内部错误,我们很想看到它。我发现了语法错误:我将x提高到了二次方,但我没有写x^2,而是使用了2D数学符号并键入了x CTRL^2。这似乎有时会引入一些隐藏的字符,从而导致问题。当我把它改回x^2时,错误消失了。这种情况并非总是发生,而且似乎是随机和罕见的。为了安全起见,从现在起,我将不再在代码中使用2D数学符号,尽管它确实使代码看起来更好,但对我来说似乎有问题。自从版本2或3以来,我从未见过这种错误。据我回忆,这主要是编辑匹配的引语,可能造成浩劫。我一直使用2D符号。也许你的安装已经损坏了?我的安装还可以。正如我所说,这种错误是罕见的。我也一直在用二维数学,现在也见过这个问题。因为有时候你自己没有看到错误并不意味着什么,也不意味着问题已经解决了。