From 6684c39cf92a0fa6c21339c6fec8a6e4cf4f463d Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Wed, 24 Jul 2019 16:20:12 +0100 Subject: [PATCH] Add WIP on passing about closures --- codegen.scm | 15 ++++++++++++++- tests.scm | 3 +++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/codegen.scm b/codegen.scm index 9b3878a..b403939 100644 --- a/codegen.scm +++ b/codegen.scm @@ -105,8 +105,21 @@ (set! cur-lambda (+ 1 cur-lambda)) (format "_lambda~a" (- cur-lambda 1))) +(define (codegen-closure label captured si env) +;; (define (codegen-closure label captured si env) +;; (let* ((stack-offsets (map (lambda (x) (- si (* x wordsize)))) +;; (range 0 (length captured))) +;; (inner-si (- si (* (length captured) wordsize)))) +;; (for-each (lambda (var-name new-offset) +;; (emit "movq ~a(%rbp), ~a(%rbp)" ; todo: do we need to copy this? +;; (cdr (assoc var-name env)) +;; new-offset)) +;; captured +;; stack-offsets) +;; ) ; for now we can only call closures (define (codegen-call closure args si env) +; (codegen-expr closure si env) (when (not (eq? (ast-type closure) 'closure)) (error #f (format "~a is not a closure" closure))) (let* ((captured (caddr closure)) @@ -190,7 +203,7 @@ (define (codegen-expr e si env) (case (ast-type e) ('builtin e) - ('closure e) + ('closure (codegen-closure (cadr e) (caddr e) si env)) ('app (let ((callee (codegen-expr (car e) si env))) (case callee diff --git a/tests.scm b/tests.scm index bfd9124..168cf66 100644 --- a/tests.scm +++ b/tests.scm @@ -48,3 +48,6 @@ (test-prog '((lambda (x y) (+ x y)) 1 2) 3) (test-prog '((lambda (x) (+ ((lambda (y) (+ y 1)) 3) x)) 2) 6) + + ; passing closures about +(test-prog '((lambda (z) ((lambda (x) (x 1)) (lambda (y) (+ z y)))) 2) 3) -- 2.30.2