mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-15 00:37:35 +02:00
WIP
This commit is contained in:
parent
a2aa1fe9a3
commit
c4829df732
1 changed files with 53 additions and 0 deletions
|
@ -28,6 +28,8 @@
|
|||
;; A list of all macros defined by the program/library being compiled
|
||||
(define *macro:defined-macros* '())
|
||||
|
||||
(define *macro:renamed-variables* (env:extend-environment '() '() '()))
|
||||
|
||||
(define (macro:add! name body)
|
||||
(set! *macro:defined-macros*
|
||||
(cons (cons name body) *macro:defined-macros*))
|
||||
|
@ -85,8 +87,59 @@
|
|||
; (newline)
|
||||
; (display (list result))
|
||||
; (display "*/ ")
|
||||
(macro:add-renamed-vars! use-env)
|
||||
result))
|
||||
|
||||
(define (macro:add-renamed-vars! env)
|
||||
;; TODO: change this to use a hash table
|
||||
(set! *macro:renamed-variables*
|
||||
(env:extend-environment
|
||||
(env:all-variables env)
|
||||
(env:all-values env)
|
||||
*macro:renamed-variables*)))
|
||||
|
||||
#;(define (macro:cleanup expr)
|
||||
(define (clean expr bv) ;; Bound variables
|
||||
(cond
|
||||
((const? expr) expr)
|
||||
((prim? expr) expr)
|
||||
((quote? expr) expr)
|
||||
((define-c? expr) expr)
|
||||
((ref? expr)
|
||||
;; TODO: if symbol has been renamed and is not a bound variable,
|
||||
;; undo the rename
|
||||
expr)
|
||||
((if? expr)
|
||||
`(if ,(clean (if->condition expr) bv)
|
||||
,(clean (if->then expr) bv)
|
||||
,(if (if-else? expr)
|
||||
(clean (if->else expr) bv)
|
||||
#f)))
|
||||
((lambda? expr)
|
||||
`(lambda ,(lambda->formals expr)
|
||||
,@(map (lambda (e)
|
||||
(clean e (cons (lambda-formals->list expr)
|
||||
bv)))
|
||||
(lambda->exp))))
|
||||
;; At this point defines cannot be in lambda form.
|
||||
;; EG: (define (f x) ...)
|
||||
((define? expr)
|
||||
(let ((bv* (cons (define->var expr) bv)))
|
||||
`(define ,(define->var expr)
|
||||
,@(map
|
||||
(lambda (e) (clean e bv*))
|
||||
(define->exp expr)))))
|
||||
;; For now, assume set is not introducing a new binding
|
||||
((set!? expr)
|
||||
`(set! ,(clean (set!->var expr) bv)
|
||||
,(clean (set!->exp expr) bv)))
|
||||
((app? expr)
|
||||
(map (lambda (e) (clean e bv))
|
||||
expr))
|
||||
(else
|
||||
(error "macro cleanup unexpected expression: " expr)))
|
||||
(clean expr '())))
|
||||
|
||||
; TODO: get macro name, transformer
|
||||
; TODO: let-syntax forms
|
||||
))
|
||||
|
|
Loading…
Add table
Reference in a new issue