(copy-tree (mapcar (lambda (b)
(let ((name (car b))
(info (cadr b)))
- (if (member info '(:lexical-var :special-var))
+ (if (eq info :lexical-var)
(cons name
- (if (eq :special-var info)
+ (if (var-special-p name env)
(sb!c::make-global-var
:kind :special
:%source-name name)
(push declaration (caddr (env-lock env))))
(defun note-var-binding (thing env)
- (push (list thing (if (var-special-p thing env)
- :special-var
- :lexical-var))
- (cadddr (env-lock env))))
+ (push (list thing :lexical-var) (cadddr (env-lock env))))
(defun var-lexical-p (var env)
(let ((entry (member var (env-lexical-variables env) :key #'car :test #'eq)))
(defun %var-declaration (declaration var env)
(let ((id (or (var-lexical-p var env) var)))
- (dolist (decl (env-declarations env))
- (when (and (eq (car decl) declaration)
- (eq (cadr decl) id))
- (return decl)))))
+ (if (eq 'special declaration)
+ (dolist (decl (env-declarations env))
+ (when (and (eq (car decl) declaration)
+ (or (member var (cdr decl))
+ (and id (member id (cdr decl)))))
+ (return decl)))
+ (dolist (decl (env-declarations env))
+ (when (and (eq (car decl) declaration)
+ (eq (cadr decl) id))
+ (return decl))))))
(defun var-declaration (declaration var env)
(if (walked-var-declaration-p declaration)
(let* ((let/let* (car form))
(bindings (cadr form))
(body (cddr form))
- (walked-bindings nil)
+ walked-bindings
(walked-body
- (walk-declarations body
- (lambda (form env)
- (setf walked-bindings
- (walk-bindings-1 bindings
- old-env
- new-env
- context
- sequentialp))
- (walk-repeat-eval form env))
- new-env)))
+ (walk-declarations
+ body
+ (lambda (real-body real-env)
+ (setf walked-bindings
+ (walk-bindings-1 bindings
+ old-env
+ new-env
+ context
+ sequentialp))
+ (walk-repeat-eval real-body real-env))
+ new-env)))
(relist*
- form let/let* walked-bindings walked-body))))
+ form let/let* walked-bindings walked-body))))
(defun walk-locally (form context old-env)
(declare (ignore context))
(char= c #\newline)))
s))
(defun string=-modulo-tabspace (x y)
- (string= (string-modulo-tabspace x)
- (string-modulo-tabspace y)))
+ (if (string= (string-modulo-tabspace x)
+ (string-modulo-tabspace y))
+ t
+ (progn
+ (print (list :want y :got x))
+ nil)))
\f
;;;; tests based on stuff at the end of the original CMU CL
;;;; pcl/walk.lisp file
C) Context: EVAL
Form: (FOO A) Context: EVAL
Form: 'GLOBAL-FOO Context: EVAL
-Form: B Context: EVAL; lexically bound
+Form: B Context: EVAL; lexically bound; declared special
Form: C Context: EVAL; lexically bound
(LET (A B C)
(DECLARE (SPECIAL A B))
Form: (FOO A B) Context: EVAL
Form: 'GLOBAL-FOO Context: EVAL
Form: (LIST A B) Context: EVAL
-Form: A Context: EVAL; lexically bound
+Form: A Context: EVAL; lexically bound; declared special
Form: B Context: EVAL; lexically bound
(MULTIPLE-VALUE-BIND (A B) (FOO A B) (DECLARE (SPECIAL A)) (LIST A B))"))
Form: B Context: EVAL
Form: (LIST A B C) Context: EVAL
Form: A Context: EVAL; lexically bound; declared special
-Form: B Context: EVAL; lexically bound
+Form: B Context: EVAL; lexically bound; declared special
Form: C Context: EVAL; lexically bound
(LET ((A A) (B A) (C B))
(DECLARE (SPECIAL A B))
(LIST A B C))"))
-(assert (string=-modulo-tabspace
+;;;; Bug in LET* walking!
+(test-util:with-test (:name (:walk-let* :hairy-specials)
+ :fails-on :sbcl)
+ (assert
+ (string=-modulo-tabspace
(with-output-to-string (*standard-output*)
(take-it-out-for-a-test-walk (let* ((a a) (b a) (c b))
(declare (special a b))
(list a b c))))
"Form: (LET* ((A A) (B A) (C B))
- (DECLARE (SPECIAL A B))
- (LIST A B C)) Context: EVAL
-Form: A Context: EVAL
-Form: A Context: EVAL; lexically bound
-Form: B Context: EVAL; lexically bound
-Form: (LIST A B C) Context: EVAL
-Form: A Context: EVAL; lexically bound; declared special
-Form: B Context: EVAL; lexically bound
-Form: C Context: EVAL; lexically bound
-(LET* ((A A) (B A) (C B))
- (DECLARE (SPECIAL A B))
- (LIST A B C))"))
+ (DECLARE (SPECIAL A B))
+ (LIST A B C)) Context: EVAL
+ Form: A Context: EVAL
+ Form: A Context: EVAL; lexically bound; declared special
+ Form: B Context: EVAL; lexically bound; declared special
+ Form: (LIST A B C) Context: EVAL
+ Form: A Context: EVAL; lexically bound; declared special
+ Form: B Context: EVAL; lexically bound; declared special
+ Form: C Context: EVAL; lexically bound
+ (LET* ((A A) (B A) (C B))
+ (DECLARE (SPECIAL A B))
+ (LIST A B C))")))
(assert (string=-modulo-tabspace
(with-output-to-string (*standard-output*)