出発点として Famo.us の例を使用します。
var Engine = require("famous/core/Engine"); // or just var Engine = famous.core.Engine;
var Surface = require("famous/core/Surface");
var ctx = Engine.createContext();
ctx.add(new Surface({...}));
今、私はこれらの GHCJS FFI バインディングを持っています:
foreign import javascript unsafe "$r = famous.core.Engine;"
engine :: Engine
foreign import javascript safe "$r = ($1).createContext();"
fms_Engine_createContext0 :: Engine -> IO Context
foreign import javascript safe "$r = new famous.core.Surface($1);"
fms_Surface_new :: JSRef Surface -> IO (JSRef Surface)
foreign import javascript safe "$r = $2.add($1)"
fms_Context_add :: JSRef a -> Context -> IO RenderNode
— ご覧のとおり、インライン JavaScript コードでは、通常famous.core.FOO
のように完全修飾名を使用するのではなく、完全修飾名を使用するなどのことを常に参照する必要があります。FOO
これらの FFI バインディングを使用した同等の Haskell スニペットを次に示します (わかりやすくするために、高レベルのラッパーの背後に隠されています)。
main = do
-- calls fms_Engine_createContext0 under the hood
ctx <- createContext engine
-- calls fms_Surface_new under the hood
sf <- surface [ SfSize $ XY 200 200
, SfContent $ content
, SfProperties $ fromList [ ("backgroundColor", "rgb(240, 238, 233)")
, ("textAlign" , "center") ] ]
-- calls fms_Context_add under the hood
sf `addToContext` ctx
ここで質問があります: GHCJSに依存する FFI バインディングが使用されるたびに、GHCJS を自動生成し、出力された JavaScriptvar Engine = famous.core.Engine
をインポートすることは可能ですか? var Surface = famous.core.Surface
または、インラインJSで常に完全修飾名を使用するか、FFIバインディングごとに常に手動で名前をインポートする唯一のオプションですか?