Allow (macro:add-renamed-vars!) to mutate env

This commit is contained in:
Justin Ethier 2016-09-22 03:44:29 -04:00
parent 6ca3b7fca7
commit 5f93f3e9cb
2 changed files with 14 additions and 17 deletions

View file

@ -11,7 +11,6 @@
(scheme write) ;; Debug only (scheme write) ;; Debug only
(scheme eval) (scheme eval)
(scheme cyclone util) (scheme cyclone util)
(srfi 69)
) )
(export (export
define-syntax? define-syntax?
@ -53,7 +52,8 @@
(define (macro:macro? exp defined-macros) (assoc (car exp) defined-macros)) (define (macro:macro? exp defined-macros) (assoc (car exp) defined-macros))
(define (macro:expand exp macro mac-env rename-tbl) (define *macro:renamed-variables* (env:extend-environment '() '() '()))
(define (macro:expand exp macro mac-env) ;;rename-tbl
(let* ((use-env (env:extend-environment '() '() '())) (let* ((use-env (env:extend-environment '() '() '()))
(compiled-macro? (or (Cyc-macro? (Cyc-get-cvar (cadr macro))) (compiled-macro? (or (Cyc-macro? (Cyc-get-cvar (cadr macro)))
(procedure? (cadr macro)))) (procedure? (cadr macro))))
@ -72,14 +72,14 @@
((Cyc-get-cvar (cadr macro)) ((Cyc-get-cvar (cadr macro))
exp exp
(Cyc-er-rename use-env mac-env) (Cyc-er-rename use-env mac-env)
(Cyc-er-compare? use-env rename-tbl))) (Cyc-er-compare? use-env *macro:renamed-variables*)))
(else (else
(eval (eval
(list (list
(Cyc-get-cvar (cadr macro)) (Cyc-get-cvar (cadr macro))
(list 'quote exp) (list 'quote exp)
(Cyc-er-rename use-env mac-env) (Cyc-er-rename use-env mac-env)
(Cyc-er-compare? use-env rename-tbl)) (Cyc-er-compare? use-env *macro:renamed-variables*))
mac-env)))) mac-env))))
; (newline) ; (newline)
; (display "/* ") ; (display "/* ")
@ -87,19 +87,18 @@
; (newline) ; (newline)
; (display (list result)) ; (display (list result))
; (display "*/ ") ; (display "*/ ")
(macro:add-renamed-vars! use-env rename-tbl) (macro:add-renamed-vars! use-env *macro:renamed-variables*)
result)) result))
(define (macro:add-renamed-vars! env rename-tbl) (define (macro:add-renamed-vars! env renamed-env)
;; TODO: change this to use a hash table (let ((frame (env:first-frame renamed-env)))
;(set! *macro:renamed-variables* (for-each
; (env:extend-environment (lambda (var val)
; (env:all-variables env) (env:add-binding-to-frame! var val frame))
; (env:all-values env) (env:all-variables env)
; *macro:renamed-variables*)) (env:all-values env))))
)
(define (macro:cleanup expr rename-tbl) (define (macro:cleanup expr)
(define (clean expr bv) ;; Bound variables (define (clean expr bv) ;; Bound variables
;(newline) ;(newline)
;(display "/* macro:cleanup->clean, bv =") ;(display "/* macro:cleanup->clean, bv =")
@ -117,7 +116,6 @@
((ref? expr) ((ref? expr)
;; if symbol has been renamed and is not a bound variable, ;; if symbol has been renamed and is not a bound variable,
;; undo the rename ;; undo the rename
TODO: no good, change to use rename-tbl (a hashtable)
(let ((val (env:lookup expr *macro:renamed-variables* #f))) (let ((val (env:lookup expr *macro:renamed-variables* #f)))
(if (and val (not (member expr bv))) (if (and val (not (member expr bv)))
(clean val bv) (clean val bv)

View file

@ -8,8 +8,7 @@
;;;; ;;;;
(define-library (scheme cyclone util) (define-library (scheme cyclone util)
(import (scheme base) (import (scheme base)
(scheme char) (scheme char))
(srfi 69))
(export (export
;; Code analysis ;; Code analysis
tagged-list? tagged-list?