home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-385-Vol-1of3.iso
/
s
/
s48.zip
/
MISC
/
DISCLOSE.SCM
< prev
next >
Wrap
Text File
|
1992-06-17
|
3KB
|
88 lines
; Copyright (c) 1992 by Richard Kelsey and Jonathan Rees. See file COPYING.
; Disclosers, etc.
; Make prettier error messages for exceptions
(define-method disclose-condition-methods (make-class 'exception 0)
(lambda (c)
(if (exception? c)
(let ((opcode (exception-opcode c))
(args (exception-arguments c)))
(cond ((or (= opcode op/global)
(= opcode op/set-global!))
(let ((loc (car args)))
(list 'error
(if (location-defined? loc)
"unassigned variable"
"undefined variable")
(or (location-name loc) loc))))
((or (= opcode op/check-nargs=)
(= opcode op/check-nargs>=))
(let ((proc (car args))
(as (cadr args)))
(list 'error
"wrong number of arguments"
(error-form (or (and (closure? proc)
(template-name
(closure-template proc)))
proc)
as))))
((= opcode op/call)
(list 'error
"attempt to call a non-procedure"
(map value->expression (cons (car args) (cadr args)))))
(else
(list 'error
"exception"
(let ((name (enumerand->name opcode op)))
(if (>= opcode op/eq?)
(error-form name args)
(cons name args)))))))
(fail))))
; Print methods (were in rtsistruct.scm)
(define-method disclose-methods (make-class 'closure 0)
(lambda (obj)
(if (closure? obj)
(let ((id (template-id (closure-template obj)))
(name (template-name (closure-template obj))))
(if name
(list 'procedure id name)
(list 'procedure id)))
(fail))))
(define-method disclose-methods (make-class 'location 0)
(lambda (obj)
(if (location? obj)
(cons 'location
(cons (location-id obj)
(let ((name (location-name obj)))
(if (and name (not (eq? name (location-id obj))))
(list name)
'()))))
(fail))))
(define-method disclose-methods (make-class 'continuation 0)
(lambda (obj)
(if (continuation? obj)
(list 'continuation
(list 'pc (continuation-pc obj))
(let ((tem (continuation-template obj)))
(or (template-name tem) (template-id tem))))
(fail))))
(define-method disclose-methods (make-class 'code-vector 0)
(lambda (obj)
(if (code-vector? obj)
(list 'code-vector (code-vector-length obj))
; (cons 'code-vector
; (let ((z (code-vector-length obj)))
; (do ((i (- z 1) (- i 1))
; (l '() (cons (code-vector-ref obj i) l)))
; ((< i 0) l))))
(fail))))