Drill 8 Solutions

  1. Consider the following Lisp program:

(let ((x (add1 4))) (+ y x))

Which variables are free in the above expression?

* [ ] `x`
* [X] `y`
* [ ] `z`
  1. The next several questions will be about this program, compiled using the compiler we ended up with after class on Wednesday.

    (define (and x y)
    (if x y false))
    
    (define (between-detector x y)
    (lambda (z) (and (< x z) (< z y))))
    
    (let ((f (between-detector 3 8)))
    (print (and (f 4) (and (f 6) ((between-detector 2 5) 7)))))
    

    a. Which variables appear free in the lambda expression in between-detector?

    • x
    • y
    • z
    • f
    • and

    b. When the program is executed, how many closures will be created pointing at that lambda expression?

    • 2

    c. How many 8-byte heap cells are taken up by each of those closures?

    • 3

    d. Consider the call (f 4). For that call, what is the position of the return address, relative to that function's starting rsp?

    • (X) rsp - 0
    • ( ) rsp - 8
    • ( ) rsp - 16

    e. Consider the call (f 4). For that call, what is the position of a tagged pointer to a closure on the heap, relative to that function's starting rsp?

    • ( ) rsp - 0
    • ( ) rsp - 8
    • (X) rsp - 16

    f. Consider the call (f 4). For that call, what is the position of 16 (the runtime representation of 4), relative to that function's starting rsp?

    • ( ) rsp - 0
    • (X) rsp - 8
    • ( ) rsp - 16