[Yhc] What constitutes an 'evaluated node'?
Stefan O'Rear
stefanor at cox.net
Thu Mar 1 10:12:42 EST 2007
On Thu, Mar 01, 2007 at 10:49:14AM +0000, Tom Shackell wrote:
> Hi Stefan,
>
> > Some of the bytecodes, eg INT_SWITCH, require the node they are
> > applied to, to be 'evaluated'. EVAL takes a node and returns an
> > equivalent evaluated node. However in the current implementation
> > (Yhi) EVAL has the side-effect of making any other reference to the
> > original node become evaluated.
>
> This is a definite 'feature', in fact it's entirely integral to the
> correct handling of lazy evaluation. Remember that in Haskell no
> computation is actually performed unless it is needed in order to
> produce an output. Thus for example
>
> const x y = y
>
> f = const (...really expensive...) 3
>
> because const doesn't need the value of x in order to give a result the
> 'really expensive' computation isn't needed and is thus never performed.
>
> Similarly Haskell avoids doing the same computation twice
>
> f = g x x x x
> where
> x = ... some really expensive computation ...
>
> g a b c d = a + b + c + d
>
> Here although x is passed to g 4 times (and g will only evaluate x when
> it needs to), the really expensive computation will only be done once.
I'm sorry, I seem to have horribly mangled my question. in the present
implementation:
ptr1 -----> Some Big
ptr2 -----> Full PAP
after EVAL:
/-----------\
ptr1 -----/ An Ind- \--V
ptr2 -----> irection ---> Value
after POP_1:
An Ind-
ptr1 -----> irection ---> Value
INT_SWITCH examines Value.
In the implementation I'm trying for, INT_SWITCH would examine the
indirection, BUT in my implentation EVAL *does* chase indirections,
so:
g(ptr1,ptr2) = ptr1 `seq` ptr2
ptr1 -----> Some Big
ptr2 -----> Full PAP
after EVAL:
/-----------\
ptr1 -----/ An Ind- \--V
ptr2 -----> irection ---> Value
after POP_1:
An Ind-
ptr1 -----> irection ---> Value
after EVAL: (chases the ind):
An Ind-
ptr1 ---\ irection /-> Value
\------------/
which is returned. (yes I know about RETURN_EVAL)
> Now if EVAL didn't update all the other references to '... some really
> expensive computation ...' then g would end up doing the expensive
> computation 4 times.
> However because when EVAL first evaluates the expensive computation it
> replaces it with an indirection to it's result then it only does the
> expensive computation once.
>
> Doing something 4 times when you could do it once is bad enough. But
> infact it can be a lot more than this, with certain examples not having
> memorization can turn a linear algorithm into an exponential one!
Known, known, known.
> For a more thorough explanation of implementation lazy functional
> programming languages I suggest reading 'Implementing Functional
> Programming Languages: A tutorial' by Simon Peyton Jones and David
> Lester, the full text is available online
>
> http://research.microsoft.com/%7Esimonpj/Papers/pj%2Dlester%2Dbook/
>
> There is also a more in-depth version available called 'The
> implementation of functional programming languages', which is also
> available online:
>
> http://research.microsoft.com/~simonpj/Papers/slpj-book-1987/index.htm
Am doing so since about a week ago :)
Hope this time it makes more sense
Stefan
More information about the Yhc
mailing list