--- ac.scm.orig 2009-08-04 21:04:24.000000000 +0200 +++ ac.scm 2009-08-04 21:21:33.000000000 +0200 @@ -27,6 +27,7 @@ ((eq? (xcar s) 'if) (ac-if (cdr s) env)) ((eq? (xcar s) 'fn) (ac-fn (cadr s) (cddr s) env)) ((eq? (xcar s) 'assign) (ac-set (cdr s) env)) + ((eq? (xcar s) 'defined) ac-defined) ; to be called later in 'ac-mac-call ; the next three clauses could be removed without changing semantics ; ... except that they work for macros (so prob should do this for ; every elt of s, not just the car) @@ -254,6 +255,14 @@ ,(ac (cadr args) env) ,(ac-if (cddr args) env))))) +(define (ac-defined x env) ; called only via macro + (if (pair? x) + (and (ac-defined (car x) env) + (ac-defined (cdr x) env)) + (or (literal? x) + (lex? x env) + (bound? x)))) + (define (ac-dbname! name env) (if (symbol? name) (cons (list name) env) @@ -462,8 +471,9 @@ (define (ac-mac-call m args env) (let ((x1 (apply m (map ac-niltree args)))) - (let ((x2 (ac (ac-denil x1) env))) - x2))) + (if (procedure? x1) ; 'defined call + (x1 args env) + (ac (ac-denil x1) env)))) ; returns #f or the macro function