(MathLink) 正确处理从属内核生成的消息

2023-12-08

当工作通过MathLink对于从属内核,我在正确解析时遇到问题TextPackets。特别是当这样的数据包对应于Message由从属内核生成我根本不明白如何正确处理它。我需要这样的Messages打印在评估笔记本中,就好像它们是由主内核生成的一样(但有一些标记以表明它来自从属内核)。而我需要分开TextPackets 对应于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]]

The Message默认情况下通过MathLink形式为:

TextPacket[                                 1
Power::infy: Infinite expression - encountered.
                                 0]

看起来很丑。我发现让它变得更好的唯一方法是在从属内核中进行评估

$MessagePrePrint = InputForm;

但我认为应该有更直接的解决方案。特别是当我以这种方式处理时TextPackets with HoldForm里面:

TextPacket[Power::infy: Infinite expression HoldForm[0^(-1)] encountered.]

我不知道如何将这样的字符串转换为适合打印的形式Message.

附:这个问题来自that问题。


我想分享 Todd Gayley(Wolfram Research)针对给定问题提出的一个很好的技巧。也许对某人有用,对我也有用。这个技巧以相当优雅的方式解决了所讨论的问题。

一种技术是离开 OutputForm 的 FormatType 为 计算,但覆盖 暂时处理消息 切换到 StandardForm,以便仅 消息输出返回 标准格式:

LinkWrite[link,
        Unevaluated[EnterExpressionPacket[
            Unprotect[Message];
            Message[args___]:=
               Block[{$inMsg = True, result},
                  SetOptions[$Output, FormatType->StandardForm];
                  result = Message[args];
                  SetOptions[$Output, FormatType->OutputForm];
                  result
               ] /; !TrueQ[$inMsg]
           ]
        ]]

您将得到一个包含 a 内容的 ExpressionPacket 信息。要将其打印为消息单元格中的 笔记本:

cell = Cell[<the ExpressionPacket>, "Message", "MSG"]
CellPrint[cell]

高级方法:所有内容都以 StandardForm 形式打印

为了让除了输出之外的所有内容都返回StandardForm我们可以重新定义变量$Pre and $Post以特殊方式在从属内核中(应在从属内核中评估以下代码):

SetOptions[$Output, {PageWidth -> 72, FormatType -> StandardForm}];
(*$inPost is needed for tracing mode compatibility 
(could be switched on by evaluating On[] in the slave kernel) 
in which Messages are printed during evaluation of $Post.*)
$inPost = False; Protect[$inPost];
$Pre := Function[inputexpr, 
  SetOptions[$Output, FormatType -> StandardForm]; 
  Unevaluated[inputexpr], HoldAllComplete];
$Post := Function[outputexpr, 
  Block[{$inPost = True}, 
   SetOptions[$Output, FormatType -> OutputForm]; 
   Unevaluated[outputexpr]], HoldAllComplete];
Protect[$Pre]; Protect[$Post];
$inMsg = False; Protect[$inMsg];
Unprotect[Message];
Message[args___] /; $inPost := Block[{$inMsg = True},
    SetOptions[$Output, FormatType -> StandardForm];
    Message[args];
    SetOptions[$Output, FormatType -> OutputForm]] /; ! $inMsg;
Protect[Message];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(MathLink) 正确处理从属内核生成的消息 的相关文章

随机推荐

  • 如何将 Array[Seq[String]] 传递给 apache Spark udf? (错误:不适用)

    我在 scala 中有以下 apache Spark udf val myFunc udf userBias Float otherBiases Map Long Float userFactors Seq Float context Se
  • 当我尝试访问从数据库获取的对象的字段时出现 NoMethodError

    假设我有一个名为 Tweet 的模型 其中包含以下字段 1 id 2 内容 3 创建时间 4 用户id 5 original tweet id 现在假设我使用以下查询 tweet Tweet where id 64 查询此模型 并且此查询返
  • 如何一一连续加载URL

    我想一个接一个地加载URL 我使用字符串数组来存储URL 我的要求是 如果webview加载第一个url 它应该在页面启动时打印消息 页面开始 当页面完成时它应该显示 页面完成 第一个 URL 加载完成后 它应该加载第二个 URL 并继续相
  • 欧拉计划 8 - Haskell

    通过欧拉项目 我将我的解决方案与其他解决方案进行比较here 对于问题 8 我的代码生成了正确答案 通过网站上的校验和确认 23514624000 module Main where import Data List main do pri
  • 带有自签名证书的 VBA ServerXMLHTTP https 请求

    我正在使用 ServerXMLHTTP 对象对 excel 2007 vba 脚本发出一些 http 请求 但我需要连接到使用自签名 SSL 证书的 https 服务器 因此默认情况下我收到消息 证书颁发机构无效或不正确 有没有办法配置 S
  • 使用 C# 将 CSV 文件读入数组

    我正在尝试编写代码来引入 读取和分离 csv 文件 它有四列 没有标题 我已经在网上搜索了几个小时 但似乎没有人真正找到答案 所以我希望这里有人可以 读入后 我需要能够非常具体地拉出它 因为它是设计的一部分 提前致谢 你的问题有点模糊 但我
  • 重定向 Ascx 页面

    是否可以使用重定向 ascx 页面 Response Redirect 我的代码是 HttpContext Current Response Redirect postauthenticated employeereprintw2reque
  • 有什么好的 Winforms 向导库吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在寻找一个好的 Winforms 向导 库 所见即所得编辑器是首选 但不是必须的 你几乎必须扮演自己的角色 这并不难 我在 30 分钟内写了一篇
  • 在 React 构造函数中调用 super() 会做什么?

    学习Reactdocs并遇到了这个例子 class Square extends React Component constructor super this state value null 根据Mozilla super 允许您使用th
  • 从 IE 下载“签名已损坏或无效”

    我获得了 Certum 证书来签署我的 C 应用程序 一切似乎都正常 我可以执行该应用程序 并且还可以看到其上的有效证书 但是 如果我将其上传到我的网页 使用 Visual Studio 发布或同时上传 EXE 我无法在 Windows7
  • 如何恢复多个 Git 提交?

    我有一个 Git 存储库 如下所示 A lt B lt C lt D lt HEAD 我希望分支的头指向 A 即我希望 B C D 和 HEAD 消失 并且我希望 head 与 A 同义 听起来我可以尝试重新设置基准 不适用 因为我已经在两
  • 通过 MultipartEntity 发送 Unicode 字符

    我有一种使用 MultipartEntity 内容类型将图像和文本作为 HttpPost 发送的方法 对于英文符号 一切都很好 但对于 unicode 符号 例如 Cyrliics 它仅发送 所以 我想知道如何正确设置 MultipartE
  • AVAssetReader 到 AudioQueueBuffer

    目前 我正在做一个小测试项目 看看是否可以从 AVAssetReader 获取样本 以便在 iOS 上使用 AudioQueue 进行播放 我读过这个 使用 AudioQueue 播放原始未压缩声音 没有声音 和这个 如何使用 AVAsse
  • NodeJS:在迭代之间等待的异步循环

    我试图在将对象数组 objects 保存到数据库 使用 mongoose 的 mongoDB 之前进行一些检查 这些对象已经按日期排序 因此objects 0 date 低于objects 1 date 每个对象应检查最后一个相关保存的对象
  • 方法名称应为 c#

    我有一个事件处理程序 我想将一些参数传递给事件 像这样 该行触发错误 需要方法名称 p Click new System EventHandler P Click sender new MyEventArgs design reader1
  • 使用链式方法和参数模拟调用

    我正在学习如何使用模拟来运行一些单元测试 但我不知道如何模拟我的数据库类 它由单独的方法组成 这些方法可以像这两个示例一样链接起来 db gt select someTblName fieldName gt where fieldName
  • 在 NativeScript 中检测应用程序不活动/空闲超时

    我需要检测用户在 NativeScript 应用程序中的不活动时间 我尝试了一些插件 例如 ng idle 但它们与 NativeScript 不兼容 我还尝试发出应用程序级别事件 在页面路由器出口中 但它也不起作用 任何帮助将不胜感激 在
  • Kivy 属性错误 - 对象没有属性 - 尝试用 kv 语言连接小部件

    我在尝试连接 Kivy 中的小部件时似乎遇到了不间断的问题 我读了这个有用的指南但我的情况没有直接涵盖 I have 2 different choosers side by side like this 每个选择器都是它自己的类 由 Ke
  • MVVM 可编辑组合框绑定

    这是我的问题 我有一个服务器列表 每个服务器都有一个 ID 和 ServerName 我希望能够从 ComboBox 中选择一个服务器并就地编辑它 然后使其 ID 可供稍后通过 SQL 更新 假设这是数据 ID 1 Name Server1
  • (MathLink) 正确处理从属内核生成的消息

    当工作通过MathLink对于从属内核 我在正确解析时遇到问题TextPackets 特别是当这样的数据包对应于Message由从属内核生成我根本不明白如何正确处理它 我需要这样的Messages打印在评估笔记本中 就好像它们是由主内核生成