如何从 Mathematica 调用交互式 D 进程?

How to call an interactive D process from Mathematica?

我正在尝试使用 Mathematica 的 StartProcess 与另一个进程建立交互式会话。它与 this question 中的场景基本相同,只是我调用的是 D 程序而不是 Fortran 程序。

以交互方式从标准输入读取并写入标准输出的最小 D 程序为例(注意无限循环):

// D
void main(string[] argv) {
    while(true) {
        auto name = readln().chomp;
        writefln("Hello %s!", name);
    }
}

当我从命令提示符 运行 这个程序时,它的行为符合预期。如果我想从 Mathematica 运行 它,这应该有效:

(* Mathematica *)
dhello = StartProcess["dhello.exe"];
WriteLine[dhello, "Wulfrick"]; 
ReadLine[dhello]

但事实并非如此。对 ReadLine[] 的调用阻塞,就好像在等待进程完成一样。我最初认为这可能是 Mathematica 中的问题,但我尝试改为调用 C# 程序并且它起作用了!举个例子:

// C#
static void Main(string[] args) {
    while (true) {
        var name = Console.ReadLine();
        Console.WriteLine($"Hello {name}!");
    }
}

现在在 Mathematica 方面,正在做:

(* Mathematica *)
cshello = StartProcess["cshello.exe"];
WriteLine[cshello, "Wulfrick"]; 
ReadLine[cshello]

按预期工作,我一调用 ReadLine[] 就打印输出并保持交互性。所以看起来问题确实出在 D 方。这也是为什么我决定在这里 post 而不是 mathematica.stackexchange.

我真的很想用 D 程序使它工作。非常感谢任何输入。

系统:

标准输出可能没有被刷新。

尝试:

import std.stdio : stdout;
stdout.flush();

在你的 while 循环结束时。