通过Java程序使用Haskell的GHCI

时间:2018-02-23 16:08:08

标签: java shell haskell

我想做的是围绕GHCI包装我的Java程序。 在我看来,它应该像这样工作:

  
      
  1. 启动我的Java程序
  2.   
  3. 记下一些Haskell函数作为Java的输入(即反向[1,2,3,4])
  4.   
  5. 在我的Java控制台上查看相应的Haskell输出
  6.   

因为我不想乱用任何语言桥梁,所以我尝试了笨拙的方法并使用Runtime.exec()方法。

这是我的代码:

public static void main(String[] args) throws Exception {
Runtime r = Runtime.getRuntime();
Process p = r.exec("ghci");
OutputStream output = p.getOutputStream();
output.write("let x = 5\r\n".getBytes());
output.write("x".getBytes());

int tmp;
String result = "";
while ((tmp = p.getInputStream().read()) != -1) {
  result += (char) tmp;
}

System.out.println(result);
p.destroy();  }

我的问题是read()方法总是返回-1而我无法获得输出。我甚至不知道我写的是否创造了任何输出。

帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:2)

很明显Process p = r.exec("ghci");没有成功,read()方法始终返回-1。提供完整路径并进行检查。

Process p = r.exec("/fullpath/ghci  2>&1");
p.waitFor();//You need to use this line of code

首先执行ls命令确认首先

Process p = r.exec("ls 2>&1");

同样修改下面的代码并尝试: -

public static void main(String[] args) throws Exception {
    Runtime r = Runtime.getRuntime();
    Process p = r.exec("ghci");
            p.waitFor();
    OutputStream output = p.getOutputStream();
    ByteArrayOutputStream byte1=new ByteArrayOutputStream();
    output.write(byte1.toByteArray());
    String result=byte1.toString();
    System.out.println(result);
    p.destroy();  
}