読者です 読者をやめる 読者になる 読者になる

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?