wolfram-mathematica - 通过 MathLink 从 v.7.01 session 中执行 v.5.2 内核中的代码

标签 wolfram-mathematica mathlink

我在同一台机器上安装了 Mathematica 7.01 和 Mathematica 5.2。我希望能够在 Mathematica 7.01 session 中评估 v.5.2 内核中的代码。我的意思是,在运行 Mathematica 7.0.1 标准 session 时,我希望有一个类似 kernel5Evaluate 的命令。评估 5.2 内核中的一些代码并将结果返回到 7.01 内核和链接的 7.01 前端笔记本中,这样这些代码将在 7.01 内核中执行。

例如(在标准 Mathematica v.7.01 session 中):

In[1]:= solutionFrom5 = kernel5Evaluate[NDSolve[{(y^\[Prime])[x]==y[x],y[1]==2},y,{x,0,3}]]
Out[1]= {{y -> InterpolatingFunction[{{0., 3.}}, <>]}}

In[2]:= kernel5Evaluate[Plot3D[Sin[x y],{x,-Pi,Pi},{y,-Pi,Pi}]]
During evaluation of In[2]:= GraphicsData["PostScript", "\<\............
Out[2]= -SurfaceGraphics-

在这两种情况下,结果应该就像 v.5.2 内核在 v.7.01 前端中设置为“笔记本内核”一样。当然还有 solutionFrom5变量应设置为 v.5.2 内核返回的真实解。

最佳答案

这是基于 Simon 代码的实现。它仍然需要改进。我不清楚的一件事是如何处理从 (v.5.2) 内核中生成的消息。

这是我的代码:

Clear[linkEvaluate]
SetAttributes[linkEvaluate, HoldRest]
linkEvaluate[link_LinkObject, expr_] := Catch[
   Module[{out = {}, postScript = {}, packet, outputs = {}},
    While[LinkReadyQ[link], 
     Print["From the buffer:\t", LinkRead[link]]];
    LinkWrite[link, Unevaluated[EnterExpressionPacket[expr]]];
    While[Not@MatchQ[packet = LinkRead[link], InputNamePacket[_]],
     Switch[packet,
      DisplayPacket[_], AppendTo[postScript, First@packet],
      DisplayEndPacket[_], AppendTo[postScript, First@packet]; 
      CellPrint@
         Cell[GraphicsData["PostScript", #], "Output", 
          CellLabel -> "Kernel 5.2 PostScript ="] &@
       StringJoin[postScript]; postScript = {},
      TextPacket[_], 
      If[StringMatchQ[First@packet, 
        WordCharacter .. ~~ "::" ~~ WordCharacter .. ~~ ": " ~~ __], 
       CellPrint@
        Cell[BoxData@
          RowBox[{StyleBox["Kernel 5.2 Message = ", 
             FontColor -> Blue], First@packet}], "Message"], 
       CellPrint@
        Cell[First@packet, "Output", CellLabel -> "Kernel 5.2 Print"]],
      OutputNamePacket[_], AppendTo[outputs, First@packet];,
      ReturnExpressionPacket[_], AppendTo[outputs, First@packet];,
      _, AppendTo[out, packet]
      ]
     ];
    If[Length[out] > 0, Print[out]];
    Which[
     (l = Length[outputs]) == 0, Null,
     l == 2, Last@outputs,
     True, multipleOutput[outputs]
     ]
    ]];
Clear[kernel5Evaluate]
SetAttributes[kernel5Evaluate, HoldAll]
kernel5Evaluate[expr_] := 
 If[TrueQ[MemberQ[Links[], $kern5]], linkEvaluate[$kern5, expr], 
  Clear[$kern5]; $kern5 = LinkLaunch[
    "C:\\Program Files\\Wolfram Research\\Mathematica\\5.2\\MathKernel.exe -mathlink"]; 
  LinkRead[$kern5]; 
  LinkWrite[$kern5, 
   Unevaluated[EnterExpressionPacket[$MessagePrePrint = InputForm;]]];
   LinkRead[$kern5]; kernel5Evaluate[expr]]

以下是测试表达式:
plot = kernel5Evaluate[Plot3D[Sin[x y], {x, 0, Pi}, {y, 0, Pi}]]
plot = kernel5Evaluate[Plot[Sin[x], {x, 0, Pi}]; Plot[Sin[x], {x, -Pi, Pi}]] // 
  DeleteCases[#, HoldPattern[DefaultFont :> $DefaultFont], Infinity] &
s = kernel5Evaluate[
  NDSolve[{y'[x] == y[x] Cos[x + y[x]], y[0] == 1}, y, {x, 0, 30}]]
s // InputForm // Short
kernel5Evaluate[1/0; Print["s"];]

它似乎按预期工作。然而,它可能会更好......

关于wolfram-mathematica - 通过 MathLink 从 v.7.01 session 中执行 v.5.2 内核中的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4983301/

相关文章:

graph - 如何使用 Mathematica 8 找到加权二分图的最小边覆盖?

matlab - 你能执行延迟设置吗(:= in Mathematica) in Matlab?

wolfram-mathematica - 了解内核-前端通信——为什么我的前端卡住?

python - 如何在 Python 程序中使用 Mathematica 函数?

wolfram-mathematica - Mathlink 内存使用累积

wolfram-mathematica - 在 Mathematica 8 中区分不同的 "Graph"对象

wolfram-mathematica - 如何部分更改当前 Notebook 的默认样式表

wolfram-mathematica - 清理 Mathematica 中一根长线上的数据

wolfram-mathematica - MathLink 函数中的 CheckAbort?