При работе с 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. Этот вопрос исходит из вопроса.