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.
我有两个问题:
console.log,ghcjs中必须定义的其他主机依赖关系是什么?