Changeset 464
- Timestamp:
- Feb 2, 2004, 8:11:51 AM (21 years ago)
- File:
-
- 1 edited
-
trunk/ccl/level-1/l1-processes.lisp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ccl/level-1/l1-processes.lisp
r78 r464 334 334 335 335 336 (defun require-global-symbol (s )336 (defun require-global-symbol (s &optional env) 337 337 (let* ((s (require-type s 'symbol)) 338 338 (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))))))) 340 343 (error "~s not defined with ~s" s 'defglobal)) 341 344 s)) 342 343 ; This does something like special binding, but the "bindings" established344 ; 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 ,@decls371 (locally (declare (special ,@(nreverse specvars)))372 (unwind-protect373 (progn (psetq ,@(nreverse psetform)) ,@body)374 (psetq ,@(nreverse restoreform)))))))))375 376 377 378 379 345 380 346
Note:
See TracChangeset
for help on using the changeset viewer.
