Parameter Passing II
- Call-by-reference -- see Day 16
- Call-by-name/need -- lazy evaluation
Expressions are passed unevaluated, together with the environment of the caller, and evaluated when used. Implemented by as "thunk-target"s.
Here is a program that, under call-by-name, will sum the values of a an expression, passed as an argument.
Under call-by-value or call-by-reference, the value is 0.letrec sum(e, i, a, b) = if greater(a, b) then 0 else begin set i = a; +(e, (sum e i add1(a) b)) in let i = 0 in sum(+(i, i), i, 1, 10)
But under call-by-name, the value is 385.
Loops -- an "extra"
We will be looking at Scheme.java, a call-by-value interpreter in Java that parses and evaluates list syntax. We'll want to be able to read and understand the code. Try compiling and running it --
- Arrays have been implemented in interp3-7clean.scm. I would be nice to have loop expressions to process arrays.
- Assignment 6 has been augmented to have you implement while-do and do-while loops, and exercise them by writing quicksort.
- How can we interpret
while-do-expexpressions?where -- here is a stab at it --(while-do-exp (test exp) (eval-while-do test exp env))(define eval-while-do (lambda (test exp env) (if (true-value? (eval-expression test env)) (begin (eval-expression exp env) (eval-while-do test exp env)) 1)))- What about
do-while-expexpressions?where -- here is a stab at it --(do-while-exp (exp test) (eval-do-while exp test env))(define eval-do-while (lambda (exp test env) (begin (eval-expression exp env) (if (true-value? (eval-expression test env)) (begin (eval-expression exp env) (eval-while-do test exp env)) 1))))- An example -- probably needs debugging, to test while-do:
let sum = proc(data, a, b) let s = 0 i = a in begin while less?(i, add1(b)) do begin set s = +(s, arrayref(data, i)); set i = add1(i) end; s end in let a = array(3) in begin arrayset(a, 0, 1); arrayset(a, 1, 4); arrayset(a, 2, 9); (sum a 0 2) end
We are scheduled to do continuation passing interpreters next.javac Scheme.java java Scheme