11

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 つの質問があります。

  1. と同様にconsole.log、定義する必要がある ghcjs で想定される他のホスト依存関係は?
  2. ghcjs がバックグラウンドでイベント ループを作成しているなどの理由で、JVM が正常にシャットダウンしていませんか? それを回避してプログラムを正常に終了させる方法はありますか?
4

2 に答える 2