196 lines
5.9 KiB
Scheme
196 lines
5.9 KiB
Scheme
|
||
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
;;; ;;;
|
||
;;; S c o o p s ;;;
|
||
;;; ;;;
|
||
;;; (c) Copyright 1985 Texas Instruments Incorporated ;;;
|
||
;;; All Rights Reserved ;;;
|
||
;;; ;;;
|
||
;;; File updated : 8/29/85 ;;;
|
||
;;; ;;;
|
||
;;; File : utl.scm ;;;
|
||
;;; ;;;
|
||
;;; Amitabh Srivastava ;;;
|
||
;;; ;;;
|
||
;;; This file contains various utility routines ;;;
|
||
;;; ;;;
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
||
|
||
;;; Error handler. Looks up the error message in the table and
|
||
;;; prints it.
|
||
|
||
(define error-handler
|
||
(let ((error-table
|
||
(let ((table (make-vector 8)))
|
||
(vector-set! table 0 " Invalid class definition ")
|
||
(vector-set! table 1 " Invalid option ")
|
||
(vector-set! table 2 " Class not defined ")
|
||
(vector-set! table 3 " Method has been deleted ")
|
||
(vector-set! table 4 " Method is not present ")
|
||
(vector-set! table 5 " Variable is not present")
|
||
(vector-set! table 6 " Not a Scoops Class")
|
||
(vector-set! table 7 " Class not compiled ")
|
||
table)))
|
||
(lambda (msg number flag)
|
||
(if flag
|
||
(error (vector-ref error-table number) msg)
|
||
(bkpt (vector-ref error-table number) msg)))))
|
||
|
||
|
||
;;; some functions defined globally which will be moved locally later
|
||
|
||
(define %sc-class-description
|
||
(lambda (class)
|
||
(writeln " ")
|
||
(writeln " CLASS DESCRIPTION ")
|
||
(writeln " ================== ")
|
||
(writeln " ")
|
||
(writeln " NAME : " (%sc-name class))
|
||
(writeln " CLASS VARS : "
|
||
(mapcar car (%sc-allcvs class)))
|
||
(writeln " INSTANCE VARS : "
|
||
(mapcar car (%sc-allivs class)))
|
||
(writeln " METHODS : "
|
||
(mapcar car (%sc-method-structure class)))
|
||
(writeln " MIXINS : " (%sc-mixins class))
|
||
(writeln " CLASS COMPILED : " (%sc-class-compiled class))
|
||
(writeln " CLASS INHERITED : " (%sc-class-inherited class))
|
||
))
|
||
;;;
|
||
|
||
(define %sc-inst-desc
|
||
(lambda (inst)
|
||
(letrec ((class (access %sc-class inst))
|
||
(printvars
|
||
(lambda (f1 f2)
|
||
(if f1
|
||
(begin
|
||
(writeln " " (caar f1) " : "
|
||
(cdr (assq (caar f1) f2)))
|
||
(printvars (cdr f1) f2))))))
|
||
(writeln " ")
|
||
(writeln " INSTANCE DESCRIPTION ")
|
||
(writeln " ==================== ")
|
||
(writeln " ")
|
||
(writeln " Instance of Class " (%sc-name class))
|
||
(writeln " ")
|
||
(writeln " Class Variables : ")
|
||
(printvars (%sc-allcvs class)
|
||
(environment-bindings (%sc-class-env class)))
|
||
(writeln " ")
|
||
(writeln "Instance Variables :")
|
||
(printvars (%sc-allivs class) (environment-bindings inst))
|
||
)))
|
||
;;;
|
||
|
||
(define describe
|
||
(lambda (class-inst)
|
||
(if (vector? class-inst)
|
||
(begin
|
||
(%scoops-chk-class class-inst)
|
||
(%sc-class-description class-inst))
|
||
(%sc-inst-desc class-inst))))
|
||
|
||
|
||
(define %scoops-chk-class-compiled
|
||
(lambda (name class)
|
||
(or (%sc-class-compiled class)
|
||
(error-handler name 7 #!true))))
|
||
|
||
;;; (rename-class (class new-name))
|
||
|
||
(macro rename-class
|
||
(lambda (e)
|
||
(let ((class (caadr e))
|
||
(new-name (cadadr e)))
|
||
`(begin
|
||
(%sc-name->class ',class)
|
||
(%sc-set-name ,class ',new-name)
|
||
(set! (access ,new-name user-initial-environment) ,class)
|
||
(putprop ',new-name ,new-name '%class)
|
||
',new-name))))
|
||
|
||
;;; (getcv class var)
|
||
|
||
(macro getcv
|
||
(lambda (e)
|
||
(let ((class (cadr e))
|
||
(var (caddr e)))
|
||
`(begin
|
||
(and (%sc-name->class ',class)
|
||
(%scoops-chk-class-compiled ',class ,class))
|
||
(send (%sc-class-env ,class) ,(%sc-concat "GET-" var))))))
|
||
|
||
;;; (setcv class var val)
|
||
|
||
(macro setcv
|
||
(lambda (e)
|
||
(let ((class (cadr e))
|
||
(var (caddr e))
|
||
(val (cadddr e)))
|
||
`(begin
|
||
(and (%sc-name->class ',class)
|
||
(%scoops-chk-class-compiled ',class ,class))
|
||
(send (%sc-class-env ,class) ,(%sc-concat "SET-" var) ,val)))))
|
||
|
||
;;; (class-compiled? class)
|
||
|
||
(define class-compiled?
|
||
(lambda (class)
|
||
(%scoops-chk-class class)
|
||
(%sc-class-compiled class)))
|
||
|
||
|
||
;;; (class-of-object object)
|
||
|
||
(define class-of-object
|
||
(lambda (obj)
|
||
(%sc-name (access %sc-class obj))))
|
||
|
||
;;; (name->class name)
|
||
|
||
(define name->class
|
||
(lambda (name)
|
||
(%sc-name->class name)))
|
||
|
||
;;;
|
||
|
||
(define %sc-class-info
|
||
(lambda (fn)
|
||
(lambda (class)
|
||
(%scoops-chk-class class)
|
||
(mapcar car (fn class)))))
|
||
|
||
;;;
|
||
|
||
(define methods (%sc-class-info %sc-method-values))
|
||
|
||
;;;
|
||
|
||
(define all-methods (%sc-class-info %sc-method-structure))
|
||
|
||
;;;
|
||
|
||
(define classvars (%sc-class-info %sc-cv))
|
||
|
||
;;;
|
||
|
||
(define all-classvars (%sc-class-info %sc-allcvs))
|
||
|
||
;;;
|
||
|
||
(define instvars (%sc-class-info %sc-iv))
|
||
|
||
;;;
|
||
|
||
(define all-instvars (%sc-class-info %sc-allivs))
|
||
|
||
|
||
;;;
|
||
|
||
(define mixins
|
||
(lambda (class)
|
||
(%scoops-chk-class class)
|
||
(%sc-mixins class))) |