On Thu, Sep 20, 2007 at 06:13:38AM +0400, Victor Nazarov wrote: > 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?
The StgSyn type *declaration* allows this stuff. In actual use, it's always kept in, and expected to be in, A-normal form. The Simons have said that much of GHC is sadly written as though it was written in a dynamically typed language and then shoddily ported to Haskell; types do NOT describe ghc's data, to borrow one of Conor's catchphrases. (I can't find the original) Stefan
signature.asc
Description: Digital signature
_______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users