En realidad, el kernel siempre envía la posición del primer error de sintaxis en la cadena de entrada al FrontEnd (si esta cadena de entrada contiene un error). Se puede demostrar con el siguiente código 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]
El número entero en SyntaxPacket
"indica la posición en la que se ha detectado un error de sintaxis en la línea de entrada", de acuerdo a la documentación. Lo que es confuso al principio es que esta posición en el caso de la línea de entrada "2+
" obviamente está más allá del final de la línea de entrada. Pero parece que en realidad esta posición se cuenta para el InputForm
de la línea de entrada que en este caso es: "2+\n\n
".
Podemos comprobar cómo funciona con $SyntaxHandler
define como sigue:
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]:= ]
Uno puede ver una inconsistencia entre las posiciones de un mismo error de sintaxis informado por SyntaxPacket
y por $SyntaxHandler
. Pero parece posible entender cómo cuentan la posición: ambos usan InputForm
de la línea de entrada y la posición antes de la línea de entrada tiene el número 0 para $SyntaxHandler
y el número 1 en el caso de SyntaxPacket
.De esta manera podemos definir $SyntaxHandler
para conseguir representación visual exacta de la posición del error de sintaxis en el interior de la cadena de entrada (la entrada Cell
debe tener "RawInputForm" estilo) de la siguiente manera:
$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];
Subrayaré ¡nuevamente esa celda de entrada DEBE tener el estilo "RawInputForm"! Dicha celda se puede crear creando una celda de entrada vacía común y luego convirtiéndola en la celda "RawInputForm" con el comando apropiado en el menú Cell -> Convert To
.
Veamos como funciona:

La razón por la que debemos utilizar los teléfonos "RawInputForm" es probable que $SyntaxHandler
se aplica ony cuando la entrada se envía al núcleo en forma de un String
, no en la forma de Boxes
como ocurre con las celdas de entrada StandardForm
predeterminadas.
Encontré el error de sintaxis: he elevado una x a la segunda potencia, pero en lugar de escribir x^2 utilicé la notación matemática 2D y escribí x CTRL^2. Parece que esto a veces causa un problema al introducir algún personaje oculto. Cuando lo cambié a x^2, el error desapareció. Esto no sucede todo el tiempo y parece ser aleatorio y raro. Para estar seguro, dejaré de utilizar la notación matemática 2D en el código a partir de ahora, aunque hizo que el código se vea mejor, pero me parece un error. –
No he visto ese tipo de errores desde la versión 2 o 3. Como recuerdo, fue principalmente la edición de citas coincidentes que podrían causar havok. Uso notación 2D todo el tiempo. Tal vez su instalación está corrupta o así? –
Mi instalación está bien. Como dije, este error es raro. También uso matemáticas 2D todo el tiempo y vi este problema una vez. porque usted no vio el error por algún tiempo usted mismo no significa mucho, y eso no significa que el problema se haya solucionado. –