From 3fc60627eba85729d61335f94d6008e83d0c7764 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Tue, 7 Apr 2015 22:55:14 -0400 Subject: [PATCH] Experimenting with literal evaluation at compile time --- trans.scm | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/trans.scm b/trans.scm index 1661835a..0ef4d963 100644 --- a/trans.scm +++ b/trans.scm @@ -1554,7 +1554,10 @@ ((app? ast) (let ((fn (app->fun ast))) - (if (lambda? fn) + (cond + ;((literal-app? ast) + ; (cps (apply (car ast) (cdr ast)) cont-ast)) + ((lambda? fn) (cps-list (app->args ast) (lambda (vals) (cons (list @@ -1562,12 +1565,13 @@ (lambda->formals fn) (cps-seq (cddr fn) ;(ast-subx fn) cont-ast)) - vals))) + vals)))) + (else (cps-list ast ;(ast-subx ast) (lambda (args) (cons (car args) (cons cont-ast - (cdr args)))))))) + (cdr args))))))))) (else (error "unknown ast" ast)))) @@ -1615,6 +1619,21 @@ (cps ast '%halt)))) ast-cps)) +(define (literal-app? ast) + (and + (pair? ast) + (prim? (car ast)) + (not (equal? 'apply (car ast))) ;; Cannot always exec at compile time + (call/cc + (lambda (return) + (for-each + (lambda (expr) + (if (not (const? expr)) + (return #f))) + (cdr ast)) + #t)))) + + ;; Closure-conversion. ;; ;; Closure conversion eliminates all of the free variables from every