MathLinkスレーブカーネルで作業しているとき、正しい解析に問題がありますTextPacket。特に、そのようなパケットMessageがスレーブカーネルによって生成されたものに対応している場合、私はそれを正しく処理する方法をまったく理解していません。マスターカーネルによって生成されたかのように評価ノートに印刷する必要がありMessagesます(ただし、スレーブからのものであることを明確にするためにいくつかのマークが付いています)。TextPacketそして、 sに対応するMessagesをコマンドだけから分離する必要がありPrint[]ます。後者も正しく解析する必要があり、スレーブカーネルからのものであることを示す小さなマークを付けて評価ノートに印刷します。
何が起こるかの例を次に示します。
link = LinkLaunch[First[$CommandLine] <> " -mathlink"]
Print@LinkRead[link]
LinkWrite[link,
Unevaluated[EnterExpressionPacket[Print[a]; 1/0; Print[b]]]]
While[Not@MatchQ[packet = LinkRead[link], InputNamePacket[_]],
Print[packet]]
MessageデフォルトではMathLink、次の形式で提供されます。
TextPacket[ 1
Power::infy: Infinite expression - encountered.
0]
醜く見えます。私が見つけたそれをより良くする唯一の方法は、スレーブカーネルで評価することです
$MessagePrePrint = InputForm;
しかし、もっと簡単な解決策があるはずだと思います。特にこのように扱うとき、私はTextPacketsをHoldForm中に入れます:
TextPacket[Power::infy: Infinite expression HoldForm[0^(-1)] encountered.]
そのような文字列を。として印刷するのに適した形式に変換する方法がわかりませんMessage。
PSこの質問はその質問から来ています。