From ba1d1e87e62b43e45b313ce5518768b26c4972a3 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Mon, 26 Sep 2016 21:02:01 -0400 Subject: [PATCH] Allow ER define-syntax from eval --- scheme/eval.sld | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/scheme/eval.sld b/scheme/eval.sld index 8ede412c..9ba59db8 100644 --- a/scheme/eval.sld +++ b/scheme/eval.sld @@ -357,9 +357,9 @@ ((and (definition? exp) (not (null? (cdr exp)))) (analyze-definition exp env)) - ;((and (syntax? exp) - ; (not (null? (cdr exp)))) - ; (analyze-syntax exp env)) + ((and (syntax? exp) + (not (null? (cdr exp)))) + (analyze-syntax exp env)) ((and (if? exp) (not (null? (cdr exp)))) (analyze-if exp env)) @@ -407,19 +407,22 @@ (let ((var (cadr exp))) (cond ((tagged-list? 'er-macro-transformer (caddr exp)) - (let ((sproc (analyze-syntax-lambda (cadr (caddr exp)) a-env))) + (let ((sproc (make-macro (cadr (caddr exp))))) ;(analyze-syntax-lambda (cadr (caddr exp)) a-env))) (lambda (env) - (env:define-variable! var sproc #;(sproc env) env) + (env:define-variable! var sproc env) 'ok))) (else + ;; TODO: need to support syntax-rules, and other methods of + ;; building a macro. maybe call into something like + ;; analyze-syntax-lambda instead of erroring here (error "macro syntax not supported yet"))))) -(define (analyze-syntax-lambda exp a-env) - (let ((vars (lambda-parameters exp)) - (bproc (analyze-sequence (lambda-body exp) a-env))) - (write `(debug ,(lambda-body exp))) - ;(lambda (env) - (make-macro `(lambda ,vars ,@(lambda-body exp))))) +;(define (analyze-syntax-lambda exp a-env) +; (let ((vars (lambda-parameters exp)) +; (bproc (analyze-sequence (lambda-body exp) a-env))) +; (write `(debug ,(lambda-body exp))) +; ;(lambda (env) +; (make-macro `(lambda ,vars ,@(lambda-body exp))))) (define (analyze-if exp a-env) (let ((pproc (analyze (if-predicate exp) a-env))