При работе через MathLink
с ведомым ядром у меня проблема с правильным синтаксическим анализом TextPacket
s.В частности, когда такой пакет соответствует Message
, сгенерированному подчиненным ядром, я вообще не понимаю, как с ним правильно обращаться.Мне нужно, чтобы такие Messages
были напечатаны в блокноте оценки, как если бы они были сгенерированы главным ядром (но с некоторой отметкой, чтобы было ясно, что это исходит от ведомого устройства).И мне нужно отделить TextPacket
s, соответствующие Message
s, от просто до 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;
Но я думаю, что должно быть более простое решение.В частности, когда я поступаю таким образом, я получаю TextPacket
s с HoldForm
s внутри:
TextPacket[Power::infy: Infinite expression HoldForm[0^(-1)] encountered.]
Я не знаю, как преобразовать такую строку в форму, подходящую для печати как Message
.
PS Этот вопрос возник из этого вопроса.