{-# LANGUAGE JavaScriptFFI #-}
{-# LANGUAGE OverloadedStrings #-}
import qualified GHCJS.Types as T
import qualified GHCJS.Foreign
foreign import javascript unsafe "alert($1)" alert :: T.JSString -> IO ()
main = alert "hello world"
wget https://www.haskell.org/ghc/dist/7.8.1/ghc-7.8.1-src.tar.bz2 tar -xf ghc-7.8.1-src.tar.bz2 cd ghc-7.8.1 perl boot ./configure make make install
この Gist も見てね
git clone git@github.com:ghcjs/cabal.git git clone git@github.com:ghcjs/ghcjs.git cd cabal git checkout ghcjs cabal install ./Cabal ./cabal-install cd .. cabal install ./ghcjs ghcjs-boot --init
例示は理解の試金石です。 alert で hello world してみましょう!
{-# LANGUAGE JavaScriptFFI #-}
{-# LANGUAGE OverloadedStrings #-}
import qualified GHCJS.Types as T
import qualified GHCJS.Foreign
foreign import javascript unsafe "alert($1)" alert :: T.JSString -> IO ()
main = alert "hello world"
実際の表示 はこうなります。 生成される JavaScript には Dart も真っ青です。
ghc-base にいろいろあります。 コードが読みやすいので読むとよろし。
fromJSRef
とか toJSRef
でいろいろできます。
fromJSString
とか toJSString
も使えます。。
Haskell の関数はそのままでは渡せません。
onload などに渡す関数は JSFun a
型でないといけません。
そして JSFun a
型の値は syncCallback
, syncCallback1
, syncCallback2
,
asyncCallback
, asyncCallback1
, asyncCallback2
などの
関数でつくることができます。 1
とか 2
は引数の数です。
{-# LANGUAGE JavaScriptFFI #-}
{-# LANGUAGE OverloadedStrings #-}
import qualified GHCJS.Types as T
import qualified GHCJS.Foreign as F
foreign import javascript unsafe "window.onload = $1" onload :: T.JSFun a -> IO ()
foreign import javascript unsafe "alert($1)" alert :: T.JSString -> IO ()
main = do
callback <- F.syncCallback F.AlwaysRetain True $ do
alert "hello world"
onload callback
$1
,$2
,$r
など)おそらく察しはついていると思いますが $1
とか $2
という
変数に引数が与えられます。ただ特殊な変数がひとつあります。
もし文から値を返したいときは $r
という変数に代入します。
例。
{-# LANGUAGE JavaScriptFFI #-}
{-# LANGUAGE OverloadedStrings #-}
import qualified GHCJS.Types as T
import qualified GHCJS.Foreign
foreign import javascript unsafe "alert($1)" alert :: T.JSString -> IO ()
foreign import javascript unsafe "try { $r = $1.length } catch (nigiritubusu) { $r = null }" js_unsafeLength :: T.JSRef a -> T.JSNumber
foreign import javascript unsafe "\"\"+$1" js_toString :: T.JSRef a -> T.JSString
js_is_shigo_sabaki_ni_au :: T.JSRef a -> IO ()
js_is_shigo_sabaki_ni_au = alert . js_toString . js_unsafeLength
main = do
js_is_shigo_sabaki_ni_au ("answer to life the universe and everything" :: T.JSString)
js_is_shigo_sabaki_ni_au T.nullRef