При работе с MathLink
с ведомым ядром у меня проблема с правильным анализом TextPacket
s. В частности, когда такой пакет соответствует Message
, сгенерированному подчиненным ядром, я не понимаю, как правильно его обрабатывать. Мне нужен такой Messages
для печати в оценочном ноутбуке, как если бы они были сгенерированы основным ядром (но с некоторой меткой, чтобы четко указать, что это происходит от подчиненного устройства). И мне нужно отделить TextPacket
от Message
от команды Print[]
. Последнее мне нужно также правильно разобрать, напечатав их в оценочной записной книжке с небольшой отметкой, что она находится от подчиненного ядра.
Вот пример того, что происходит:
link = LinkLaunch[First[$CommandLine] <> " -mathlink"]
[email protected][link]
LinkWrite[link,
Unevaluated[EnterExpressionPacket[Print[a]; 1/0; Print[b]]]]
While[[email protected][packet = LinkRead[link], InputNamePacket[_]],
Print[packet]]
Message
по умолчанию проходит через MathLink
в форме:
TextPacket[ 1
Power::infy: Infinite expression - encountered.
0]
Это выглядит уродливо. Единственный способ сделать это лучше, чем я нашел, - это оценить в подчиненном ядре
$MessagePrePrint = InputForm;
Но я думаю, что должно быть более простое решение. В частности, при этом я получаю TextPacket
с HoldForm
внутри:
TextPacket[Power::infy: Infinite expression HoldForm[0^(-1)] encountered.]
Я не знаю, как преобразовать такую строку в форму, подходящую для печати как Message
.
P.S. Этот вопрос исходит из вопроса.