I went through the lecture slides and jotted down some notes on anything that I was still confused about. Please feel free to comment on, answer the questions in, or added on to this list of questions:

The tree generated by the BFH will have 10 nodes.
The optimal tree has 8 nodes.

Is this due to the prescence of variables in the bool position?

Lecture 4:
slide 26: Could “fn f => (f(13), f(true))” work if we could promise that the f passed in will always be over type variables, not concrete types? Is this the kind of power that explicit type variable systems (which he refers to on slide 9) have?

slide 36:
Question posed: “What about lists?”
Answer (?): A box just a pointer, so we would just make a pointer to the list, similar to how we box other non-word-sized data structures

“While CPS’ed programs make control-flow explicit, the resulting output is inefficient, and still far removed from the format necessary to enable efficient code generation. For this project, you will simplify CPS programs. While there are many optimizations possible, we will concentrate on particularly important one:
Continuations that are not exported via a Non-Tail call, and which are instantiated
at most once via a Goto, can be inlined at the point of call.”

Anyone else done with Project 3? If not and you want to meet, give me a call: (214) 404-8096. Until then I’ll post some thoughts on the project.
Allthe work is in cps.sml’s cps function. Basically, you’re just connecting work you recursively did with the current computation (whether it’s a binop, apply, tuple, etc)

The cps function has 3 args: ce, ko, and kl. Now you may be wondering “Well when the heck do I use ko and kl??” That’s easy:

ko : this will be NONE when there is nothing left to do after computing ce

kl : this is ALWAYS appended to, and NEVER removed from. You will have to append every continuation created to it

Suggested ordering for implementing the body of cps:

LetRec : Simple let fun ... without applications.

App : Get Tail and NonTail working. This should be the first time you’ll create a continuation. So you’ll need: Label, Id, RetVal, Ret. make sure you prepend the cont you created before returning!

BinOp, UnOp : The tough part’s done (assuming you tested app thoroughly) so these should two should be a breeze. Notes: Take advantage of buildSimpleCont. You can’t test if you are evaluating binops correctly until you have ref‘s done

Fn

Tuple : Here, I used List.foldr 3 times Notes: Take advantage of buildSimpleCont. You can’t test if you are evaluating tuples in the right order until you can create side-effects

Ith, SetIth : These are needed for refs

Retest Binops and Tuples. Create a test and run it in SML/NJ and compare. Note: Assignments in MiniML don’t return unit.

If

Constructor

Error

Once you decide to try out test-map.mml I’d suggest unsetting the noisy flag (cps-interp.sml line 382). Otherwise you’ll be sitting around for hours waiting for the compiler to print.