Changeset 464


Ignore:
Timestamp:
Feb 2, 2004, 8:11:51 AM (21 years ago)
Author:
Gary Byers
Message:

REQUIRE-GLOBAL-SYMBOL checks the environment, too.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ccl/level-1/l1-processes.lisp

    r78 r464  
    334334 
    335335
    336 (defun require-global-symbol (s)
     336(defun require-global-symbol (s &optional env)
    337337  (let* ((s (require-type s 'symbol))
    338338         (bits (%symbol-bits s)))
    339     (unless (logbitp $sym_vbit_global bits)
     339    (unless (or (logbitp $sym_vbit_global bits)
     340                (let* ((defenv (if env (definition-environment env))))
     341                  (if defenv
     342                    (eq :global (%cdr (assq s (defenv.specials defenv)))))))
    340343      (error "~s not defined with ~s" s 'defglobal))
    341344    s))
    342 
    343 ; This does something like special binding, but the "bindings" established
    344 ; aren't undone by context switch.
    345 (defmacro let-globally ((&rest vars) &body body &environment env)
    346   (multiple-value-bind (body decls) (parse-body body env)
    347     (let* ((initforms nil)
    348            (psetform nil)
    349            (specvars nil)
    350            (restoreform nil))
    351       (flet ((pair-name-value (p)
    352                (if (atom p)
    353                  (values (require-global-symbol p) nil)
    354                  (if (and (consp (%cdr p)) (null (%cddr p)))
    355                    (values (require-global-symbol (%car p)) (%cadr p))
    356                    (error "Invalid variable initialization form : ~s")))))
    357         (declare (inline pair-name-value))
    358         (dolist (v vars)
    359           (let* ((oldval (gensym))
    360                  (newval (gensym)))
    361             (multiple-value-bind (var valueform) (pair-name-value v)
    362               (push var specvars)
    363               (push var restoreform)
    364               (push oldval restoreform)
    365               (push `(,oldval (uvref ',var #.ppc32::symbol.vcell-cell)) initforms)
    366               (push `(,newval ,valueform) initforms)
    367               (push var psetform)
    368               (push newval psetform))))
    369         `(let ,(nreverse initforms)
    370            ,@decls
    371            (locally (declare (special ,@(nreverse specvars)))
    372              (unwind-protect
    373                (progn (psetq ,@(nreverse psetform)) ,@body)
    374                (psetq ,@(nreverse restoreform)))))))))
    375 
    376 
    377 
    378 
    379345
    380346
Note: See TracChangeset for help on using the changeset viewer.