在JVM上运行编译为JavaScript的Haskell

Mar*_*amy 11 haskell ghcjs

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
Run Code Online (Sandbox Code Playgroud)

我们可以运行它:( 旁注:可以将它作为普通的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!
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,console.log需要使用java.lang.System.printNashorn 定义不提供默认的全局console对象,putStrLn否则Haskell 似乎不会打印任何内容.

另一件事是JVM需要退出并sysexit实现FFI功能java.lang.System.exit.

我有两个问题:

  1. 类似于console.log,ghcjs中必须定义的其他主机依赖关系是什么?
  2. 由于ghcjs在后台创建事件循环或其他原因,JVM是否正常关闭?有没有办法避免这种情况并使程序正常退出?

scl*_*clv 0

仅供记录,github上也有人问过这个问题

那里的答案指向现有的平台检测代码,以及进程退出功能。这些和相关领域将提供 ghcjs 可以扩展以支持 jvm 作为特定平台的点。