home *** CD-ROM | disk | FTP | other *** search
- ;;;; This file contains the frames procedures.
-
- ;;; This section contains FPUT and its auxiliaries.
-
- (DEFUN FPUT (FRAME SLOT FACET VALUE)
- (LET ((VALUE-LIST (FOLLOW-PATH (LIST SLOT FACET)
- (FGET-FRAME FRAME))))
- (COND ((MEMBER VALUE VALUE-LIST) NIL)
- (T (RPLACD (LAST VALUE-LIST) (LIST VALUE))
- VALUE))))
-
- (DEFUN FOLLOW-PATH (PATH A-LIST)
- (COND ((NULL PATH) A-LIST)
- (T (FOLLOW-PATH (REST PATH) (EXTEND (FIRST PATH) A-LIST)))))
-
- (DEFUN EXTEND (KEY A-LIST)
- (COND ((ASSOC KEY (REST A-LIST)))
- (T (SECOND (RPLACD (LAST A-LIST) (LIST (LIST KEY)))))))
-
- (DEFUN FGET-FRAME (FRAME)
- (COND ((GET FRAME 'FRAME)) ;Frame already made?
- (T (SETF (GET FRAME 'FRAME) (LIST FRAME))))) ;If not, make one.
-
- ;;; This section contains FGET and FREMOVE.
-
- (DEFUN FGET (FRAME SLOT FACET)
- (REST (ASSOC FACET (REST (ASSOC SLOT (REST (GET FRAME 'FRAME)))))))
-
- (DEFUN FREMOVE (FRAME SLOT FACET VALUE)
- (LET ((VALUE-LIST (FOLLOW-PATH (LIST SLOT FACET)
- (FGET-FRAME FRAME))))
- (COND ((MEMBER VALUE VALUE-LIST)
- (DELETE VALUE VALUE-LIST)
- T)
- (T NIL))))
-
- ;;; This section contains procedures for using defaults and demons.
-
- (DEFUN FPUT-P (FRAME SLOT FACET VALUE)
- (COND ((FPUT FRAME SLOT FACET VALUE)
- (MAPFIRST #'(LAMBDA (E) ;Use procedures.
- (MAPFIRST #'(LAMBDA (DEMON) (FUNCALL DEMON FRAME SLOT))
- (FGET E SLOT 'IF-ADDED)))
- (FGET-CLASSES FRAME))
- VALUE)))
-
- (DEFUN FGET-V-D (FRAME SLOT)
- (COND ((FGET FRAME SLOT 'VALUE))
- ((FGET FRAME SLOT 'DEFAULT))))
-
- (DEFUN FGET-V-D-P (FRAME SLOT)
- (COND ((FGET FRAME SLOT 'VALUE)) ;Try values first.
- ((FGET FRAME SLOT 'DEFAULT)) ;Then try defaults.
- (T (MAPCAN ;Combine results, if any.
- #'(LAMBDA (DEMON) (FUNCALL DEMON FRAME SLOT))
- (FGET FRAME SLOT 'IF-NEEDED)))))
-
- ;;; This section contains procedures for using inherited values,
- ;;; defaults, and demons.
-
- (DEFUN FGET-I (FRAME SLOT)
- (FGET-I1 (FGET-CLASSES FRAME) SLOT))
-
- (DEFUN FGET-I1 (FRAMES SLOT)
- (COND ((NULL FRAMES) NIL) ;Give up?
- ((FGET (FIRST FRAMES) SLOT 'VALUE)) ;Got something?
- (T (FGET-I1 (REST FRAMES) SLOT)))) ;Climb tree.
-
- (DEFUN FGET-Z (FRAME SLOT)
- (FGET-Z1 SLOT (FGET-CLASSES FRAME)))
-
- (DEFUN FGET-Z1 (S C)
- (COND ((NULL C) NIL)
- ((FGET-V-D-P (FIRST C) S))
- (T (FGET-Z1 S (REST C)))))
-
- (DEFUN FGET-CLASSES (START)
- (REVERSE (FGET-CLASSES1 (LIST START) NIL)))
-
- (DEFUN FGET-CLASSES1 (Q C)
- (COND ((NULL Q) C)
- (T (FGET-CLASSES1 (APPEND (FGET (FIRST Q) 'A-KIND-OF 'VALUE)
- (REST Q))
- (ADJOIN (CAR Q) C)))))
-
- ;;; This section contains representative demons.
-
- (DEFUN ASK (FRAME SLOT)
- (FORMAT T "Please supply a value for ~a's ~a" FRAME SLOT)
- (TERPRI) ;Start new line.
- (LET ((RESPONSE (READ))) ;Get user's answer.
- (COND (RESPONSE (LIST RESPONSE)) ;Return list with answer if
- (T NIL)))) ; RESPONSE is other than NIL.
-
- (DEFUN CALCULATE-WEIGHT (FRAME SLOT)
- (LET ((HEIGHT (FGET-V-D FRAME 'HEIGHT)))
- (COND (HEIGHT (LIST (FPUT FRAME
- 'WEIGHT
- 'VALUE
- (* 33 (FIRST HEIGHT))))))))
-