STG to JavaScript translation

Victor Nazarov asviraspossible at
Wed Sep 19 22:13:38 EDT 2007

I still have some questions regarding the GHC internals.
There is a description of STG language in the "Making a Fast Curry:
Push/Enter vs. Eval/Apply for Higher-oder Languages" (2004) by Simon
Marlow and Simon Peyton Jones paper. In this description the
constructor application (CONS closure) can only appear on the right
hand side of the bindings. This is totally reasonable if "let" is the
only construct that allocates objects. But in the GHC's StgSyn.hs any
expression can be constructor application. How does constructor
applications are compiled? Are they implicitly transformed to let?
For example:

f =
  let g = (THUNK h x)
  in (CONS g y)

Is this exactly the same as (right variant following the paper)

f =
  let g = (THUNK h x)
  in let freshvar = (CONS g y)
      in freshvar


And the second question is how does constructor tag is passed to case
when non-vector return is used? In register? In constructor closure?
Are there any cases when closure is not build for constructor
application? What the case binder is bound to if there is no closure
for constructor application?


More information about the Glasgow-haskell-users mailing list