■
a = 6 b = 7 main = print $ a * b
これが
main::Expr [(String,Expr)] main = Let (Bind [("a",Lit 6) , ("b",Lit 7)]) (App (Var "print") (App (App (*) (Var "a")) (Var "b") ) )
こうなればいいんだから、
var _ = window; /*処理定義*/ _['App'] = function(f){ return f()}; _['Bind'] = function(id, val){return _[id] = function(){ return val}}; /*関数定義*/ _['*'] = function(v1){return function(v2){ return function(){ return v1 * v2 }}}; _['print'] = function(v1){return function(){ alert(v1)}};
こうして
_['Bind']('a',2); _['Bind']('b',3); _['App']( _['print']( _['App'](_['*'] (_['App'](_['a'])) (_['App'](_['b'])) ) ) );
これで一部OK?
ほんとうはここにmainの処理もバインドしたいんだけど・・・
ということは
_['Bind']('+', '\(x,y) -> x + y');
こういうのを
_['+'] = function(x){return function(y){ return function(){ return _['App'](x) + _['App'](y)}}};
こう変換できれば、OK?