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!
上記のコードでは、Nashorn はデフォルトのグローバルオブジェクトを提供しておらず、Haskell のものは何も出力していないように見えるため、console.logを使用して定義する必要があります。java.lang.System.printconsoleputStrLn
sysexitもう 1 つは、JVM を で実装された FFI 関数で終了する必要があることjava.lang.System.exitです。
2 つの質問があります。
- と同様に
console.log、定義する必要がある ghcjs で想定される他のホスト依存関係は? - ghcjs がバックグラウンドでイベント ループを作成しているなどの理由で、JVM が正常にシャットダウンしていませんか? それを回避してプログラムを正常に終了させる方法はありますか?