diff --git a/scmvm/language/scheme.scm b/scmvm/language/scheme.scm index 5999e7a..f8e0d9b 100644 --- a/scmvm/language/scheme.scm +++ b/scmvm/language/scheme.scm @@ -139,7 +139,7 @@ ;; | (set-then! ) ;; | (letrec (( )) ) ;; ::= (lambda ( ...) exp) -;; | | | #t | #f +;; | | | #t | #f | (quote ) ;; ;; We choose a hybrid transformation based on https://matt.might.net/articles/cps-conversion/ ;; Admittedly this is a little black magic to me, but it's useful @@ -170,6 +170,7 @@ ;; T-c takes a symbolic continuation, and uses it to construct CPS ;; (expr * aexp) -> cexp (match expr + [ ('quote e) `(,c ,expr)] [`(lambda . ,_) `(,c ,(M expr))] [ (? atomic?) `(,c ,(M expr))] [ ('letrec ([v e]) body) @@ -202,6 +203,7 @@ ;; As an invariant, T-k cannot nest a T-c call directly ;; (expr * (aexp -> cexp) -> cexp) (match expr + [ ('quote e) (k expr)] [`(lambda . ,_) (k (M expr))] [(? atomic?) (k (M expr))] [('letrec ([v e]) body) @@ -252,6 +254,14 @@ (match-lambda* [(args ... k) (k (apply x args))]) x)) + +(define (ir-interpreter) + (display "> ") + (let ([prgm (read)]) + (display "$$ = ") + (primitive-eval `(display (call/cc (lambda (ktail) ,(ir-convert prgm))))) + (newline)) + (ir-interpreter)) ;; Compilation (define (meaning e r)