From bf9591c4514d4f47f427ebc4ad9533a5f7e4ee09 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Thu, 18 Jan 2018 13:26:48 -0500 Subject: [PATCH] Basic way to preserve local env within macro --- scheme/eval.sld | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/scheme/eval.sld b/scheme/eval.sld index 6744835b..f352140f 100644 --- a/scheme/eval.sld +++ b/scheme/eval.sld @@ -746,10 +746,16 @@ ;; Macro section (define (macro:macro? exp defined-macros) (assoc (car exp) defined-macros)) - (define (macro:expand exp macro mac-env rename-env local-renamed) + (define (macro:get-local-renames macro current-rename-lis) + (if (eq? 3 (length macro)) + (caddr macro) + current-rename-lis)) + + (define (macro:expand exp macro mac-env rename-env local-renamed-lis) (let* ((use-env (env:extend-environment '() '() '())) (compiled-macro? (or (Cyc-macro? (Cyc-get-cvar (cadr macro))) (procedure? (cadr macro)))) + (local-renamed (macro:get-local-renames macro local-renamed-lis)) (result #f)) ;(newline) ;(display "/* ") @@ -1004,7 +1010,10 @@ (if (macro:syntax-rules? (env:lookup (car binding) env #f)) ;; TODO: is this ok? (cadr (_expand binding env rename-env local-env local-renamed)) - binding-body))))) + binding-body) + ;; Preserve local renames at macro definition time + local-renamed + )))) bindings)) (new-local-macro-env (append bindings-as-macros local-env)) )