diff --git a/scheme/cyclone/macros.sld b/scheme/cyclone/macros.sld index 5c24b115..1bbde7d6 100644 --- a/scheme/cyclone/macros.sld +++ b/scheme/cyclone/macros.sld @@ -41,34 +41,34 @@ (tagged-list? 'define-syntax exp)) (define (macro:macro? exp defined-macros) (assoc (car exp) defined-macros)) - (define (macro:expand exp defined-macros) - (let* ((macro (assoc (car exp) defined-macros)) - (compiled-macro? (or (macro? (Cyc-get-cvar (cdr macro))) - (procedure? (cdr macro))))) + (define (macro:expand macro-val exp mac-env) + (let* ( ;(macro (assoc (car exp) defined-macros)) + (compiled-macro? (or (macro? (Cyc-get-cvar macro-val)) + (procedure? macro-val)))) ;; Invoke ER macro (cond - ((not macro) + ((not macro-val) (error "macro not found" exp)) (compiled-macro? - ((Cyc-get-cvar (cdr macro)) + ((Cyc-get-cvar macro-val) exp - (Cyc-er-rename 'todo-mac-env) + (Cyc-er-rename mac-env) Cyc-er-compare?)) (else ;; Assume evaluated macro - (let* ((env-vars (map car defined-macros)) - (env-vals (map (lambda (v) - (list 'macro (cdr v))) - defined-macros)) - ;; Pass defined macros so nested macros can be expanded - (env (create-environment env-vars env-vals))) + ;(let* ((env-vars (map car defined-macros)) + ; (env-vals (map (lambda (v) + ; (list 'macro (cdr v))) + ; defined-macros)) + ; ;; Pass defined macros so nested macros can be expanded + ; (env (create-environment env-vars env-vals))) (eval (list - (cdr macro) + macro-val (list 'quote exp) - (Cyc-er-rename 'todo-mac-env) + (Cyc-er-rename mac-env) Cyc-er-compare?) - env)))))) + mac-env)))));) ; TODO: get macro name, transformer ; TODO: let-syntax forms diff --git a/scheme/cyclone/transforms.sld b/scheme/cyclone/transforms.sld index 6759b53b..6646cbaf 100644 --- a/scheme/cyclone/transforms.sld +++ b/scheme/cyclone/transforms.sld @@ -775,7 +775,7 @@ ;; Previous list should eventually go away once macros are ;; moved from that static list to libraries (macro:add! name body) -TODO: add macro to env + (env:define-variable! name (list 'macro body) env) ;; Keep as a 'define' form so available at runtime ;; TODO: may run into issues with expanding now, before some ;; of the macros are defined. may need to make a special pass @@ -788,12 +788,19 @@ TODO: add macro to env ;; `(define ,name ,(expand body env)))) -TODO: need to change below to use the env, and corresponding changes to macros module to set renames - ((macro:macro? exp *defined-macros*) - ;(trace:info (list 'expanding exp)) - (expand ;; Could expand into another macro - (macro:expand exp *defined-macros*) - env)) + ((symbol? (car exp)) + (let ((val (env:lookup (car exp) env #f))) + (if val + (macro:expand val exp env) + (map + (lambda (expr) (expand expr env)) + exp)))) +;((macro:macro? exp *defined-macros*) +; ;(trace:info (list 'expanding exp)) +; (expand ;; Could expand into another macro +; (macro:expand exp *defined-macros*) +; env)) + (else (map (lambda (expr) (expand expr env))