GHCJS cheatsheet

Installation

GHC 7.8.1

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

GHCJS

この 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

hello world

例示は理解の試金石です。 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 も真っ青です。

JavaScript の値を扱う

ghc-base にいろいろあります。 コードが読みやすいので読むとよろし。

fromJSRef とか toJSRef でいろいろできます。 fromJSString とか toJSString も使えます。。

コールバック関数をつくる(onload,onclick など)

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

FFI の変数 ($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

© Copyright 2014, Pasberth. Created using Paradocs.