Java 8 有一个名为 Nashorn 的内置 JavaScript 引擎,因此实际上可以在 JVM 上运行编译为 JavaScript 的 Haskell。
以下程序有效:
{-# LANGUAGE JavaScriptFFI #-}
module Main where
foreign import javascript unsafe "console={log: function(s) { java.lang.System.out.print(s); }}"
setupConsole :: IO ()
foreign import javascript unsafe "java.lang.System.exit($1)"
sysexit :: Int -> IO ()
main = do
setupConsole
putStrLn "Hello from Haskell!"
sysexit 0
我们可以通过以下方式运行它:(旁注:可以将其作为普通 Java 程序运行。jjs
这只是在 JVM 上运行纯 JavaScript 代码的一种便捷方式)
$ ghcjs -o Main Main.hs
[1 of 1] Compiling Main ( Main.hs, Main.js_o )
Linking Main.jsexe (Main)
$ which jjs
~/bin/jdk/bin/jjs
$ jjs Main.jsexe/all.js
Hello from Haskell!
在上面的代码中,console.log
需要定义java.lang.System.print
为 Nashorn 不提供默认的全局console
对象,而 HaskellputStrLn
似乎没有打印任何东西。
另一件事是 JVM 需要sysexit
使用java.lang.System.exit
.
我有两个问题:
- 类似于
console.log
,在 ghcjs 中假设了哪些其他必须定义的主机依赖项? - JVM没有正常关闭是因为ghcjs在后台创建了事件循环还是其他原因?有什么办法可以避免这种情况并使程序正常退出?