Arbitrary stack access. What to do with tail calls?

This commit is contained in:
2025-12-09 16:03:03 -06:00
parent 69b6ccbce0
commit 3ad9159969
4 changed files with 25 additions and 21 deletions

View File

@@ -1,6 +1,9 @@
(define-module (scmvm language scheme)
#:use-module (scmvm assembler)
#:use-module (ice-9 match))
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-26)
#:use-module (ice-9 match)
#:export (compile decompile ir-convert))
;; Scheme compiler
;; Scheme subset we're targeting
@@ -29,7 +32,6 @@
(name (cdr v*)
(lambda (t*)
(k (cons t t*)))))))))
;; Desugaring
;; Transforms to simplify the language
@@ -47,7 +49,7 @@
(define (desugar-prgm prgm)
(map (lambda (top)
(if (eq? (car top) 'define)
(if (and (pair? top) (eq? (car top) 'define))
(desugar-define top)
(desugar-exp top)))
prgm))
@@ -94,14 +96,15 @@
;; <cexp> ::= (<aexp> <aexp> ...)
;; | (if <aexp> <cexp> <cexp>)
;; | (set-then! <var> <aexp> <cexp>)
;; | (define-then! <var> <aexp> <cexp>)
;; <aexp> ::= (lambda (<var> ...) exp)
;; | <num> | <sym> | <var> | #t | #f
;; | <num> | <var> | #t | #f
;;
;; We choose a hybrid transformation based on https://matt.might.net/articles/cps-conversion/
(define undefined-value (make-symbol "undefined"))
(define (cps-convert expr ktail)
(define (cps-convert-prgm prgm ktail)
;; M : expr -> aexp
;; T-k : expr, (aexp -> cexp) -> cexp
;; T-c : expr, aexp -> cexp
@@ -165,17 +168,7 @@
(T*-k e* (lambda ($e*)
`(,$f ,@$e* ,c)))))]))
(define-cps-loop T*-k T-k)
(T-k expr ktail))
(T-c prgm ktail))
(define (cps-convert-prgm prgm)
(if (pair? prgm)
(cons (cps-convert-top (car prgm))
(cps-convert-prgm (cdr prgm)))
'()))
(define (cps-convert-top top)
(match top
[`(define ,v ,e)
(cps-convert e (lambda ($rv) `(define ,v ,$rv)))]
[_
(cps-convert top (lambda _ `(nop)))]))
(define* (ir-convert prgm #:key (ktail 'ktail))
(cps-convert-prgm (desugar-prgm prgm) ktail))