-
- (let* ([stack-offsets (map (lambda (name x) ; assoc map of binding name to offset
- (cons name (- si (* x wordsize))))
- (map car bindings)
- (range 0 (length bindings)))]
- [inner-si (- si (* (length bindings) wordsize))]
+ ; assoc map of binding name to size
+ (define stack-sizes
+ (map (lambda (binding) (cons (car binding) (expr-size (cadr binding))))
+ bindings))
+
+ ; assoc map of binding name to offset
+ (define stack-offsets
+ ; 2 4 2 8 6
+ (let* ([totals ; 2 6 8 16 22
+ (reverse (fold-left (lambda (acc x)
+ (if (null? acc)
+ (list x)
+ (cons (+ x (car acc)) acc)))
+ '()
+ (map cdr stack-sizes)))]
+ ; 0 2 6 8 16
+ [relative-offsets (map - totals (map cdr stack-sizes))]
+ [absolute-offsets (map (lambda (x) (- si x)) b)])
+ (map cons (map car stack-sizes) absolute-offsets)))
+
+ (let* (
+ ; the stack index used when codegening binding body and main body
+ ; -> stack ->
+ ; [stack-offsets | inner-si]
+ [inner-si (- si (fold-left + 0 (map cdr stack-sizes)))]