{-# LANGUAGE MagicHash #-} module Main (main) where import LHC.Prim putStrLn :: List Char -> IO Unit putStrLn msg = putStr msg `thenIO` putStr (unpackString# "\n"#) main :: IO Unit main = putStrLn (unpackString# "Hello World!"#) entrypoint :: Unit entrypoint = unsafePerformIO main
Notice the 'List' and 'Unit' types, and the 'thenIO' and 'unpackString#' functions. There's no syntactic sugar in LHC yet. You can get everything sugar-free these days, even Haskell compilers.
Running the code through the LLVM dynamic compiler gives us the expected output:
# lli Hello.ll Hello World!
Neato, we have a complete Haskell application as a single LLVM file. Now we can compile it to JavaScript without having to worry about the garbage collector or the RTS; Everything has been packed away in this self-contained file.
$ emcc -O2 Hello.ll -o Hello.js # Compile to JavaScript using # emscripten. $ node Hello.js # Run our code with NodeJS. Hello World! $ ls -lh Hello.js # JavaScript isn't known to be # terse but we're still smaller # than HelloWorld compiled with GHC. -rw-r--r-- 1 lemmih staff 177K Dec 4 23:33 Hello.js
Neato!
ReplyDelete