home *** CD-ROM | disk | FTP | other *** search
/ vis-ftp.cs.umass.edu / vis-ftp.cs.umass.edu.tar / vis-ftp.cs.umass.edu / pub / Software / ASCENDER / ascendMar8.tar / UMass / ISR / isr2basics.lisp < prev    next >
Lisp/Scheme  |  1995-04-11  |  97KB  |  2,644 lines

  1. ;;; -*- Mode:Common-Lisp; Package:isr2; Base:10 -*-
  2. ;;;------------------------------------------------------------------------
  3. ;;; ISR2BASICS.LISP - Basic ISR2 functions
  4. ;;; Created: Monday the eleventh of April, 1988; 10:01:26 am
  5. ;;; Author: Robert Heller
  6. ;;;------------------------------------------------------------------------
  7. ;;; Copyright (c) University of Massachusetts 1988
  8. ;;;------------------------------------------------------------------------
  9.  
  10. (in-package "ISR2")
  11.  
  12. (export '(*set-value-flag* system-status clear-system frame parent handle path? 
  13.       token-index-of define-feature features create create-new-token destroy 
  14.       copy-definition move rename describe-isr-object datatypep datatype-of
  15.       value add-feature-function))
  16.  
  17. (defvar *set-value-flag*)
  18. (setf (documentation '*set-value-flag* 'variable)
  19. "Flag used to disable/enable storage of feature values")
  20.  
  21. ;; basic system global valiables
  22.  
  23. (#+:EXPLORER cdefvar #-:EXPLORER defvar *isr-frame-root*
  24.       (make-frame "ROOT" :Documentation "ISR Root Frame")
  25.      "Root frame in the database")
  26.  
  27. (defvar *undefinable-numeric-feature-return-value* -1 
  28.   "Value to be returned when a feature value in undefinable")
  29.  
  30. ;;;;
  31.  
  32. (defun system-status (&optional (stream *standard-output*) &aux (*past-frames* nil))
  33.   "SYSTEM-STATUS &OPTIONAL (stream *standard-output*) -
  34. This function prints out the system status."
  35.   (declare (special *past-frames*))
  36.   (status-of-frame *isr-frame-root* stream 0))
  37.  
  38. (defmacro do-all-tokens ((index-var existence-vector) &body body)
  39.   "This macro indexes through all token indexes (based on the size of the
  40. existence vector)."
  41.   (let ((outer-index (gensym))
  42.     (existence-v (gensym))
  43.     (inner-index (gensym))
  44.     (vv-data     (gensym))
  45.     )
  46.     `(let* ((,existence-v ,existence-vector)
  47.         (,index-var 0)
  48.         (,vv-data (2index-vector-vector-data ,existence-v))
  49.         )
  50.        (dotimes (,outer-index (fill-pointer ,vv-data))
  51.      (dotimes (,inner-index *default-2index-vector-size*)
  52.        (progn ,@body)
  53.        (incf ,index-var))))
  54.     )
  55.   )
  56.  
  57.  
  58. (defmacro do-active-tokens ((index-var existence-vector) &body body)
  59.   "This macro applys BODY to every defined token in existence-vector."
  60.   (let ((outer-index (gensym))
  61.     (temp-vector (gensym))
  62.     (temp-inner-2index-vec (gensym))
  63.     (existence-v (gensym))
  64.     (inner-index (gensym))
  65.     (vv-data     (gensym))
  66.     )
  67.     `(let* ((,existence-v ,existence-vector)
  68.         (,index-var 0)
  69.         (,temp-inner-2index-vec nil)
  70.         (,temp-vector nil)
  71.         (,vv-data (2index-vector-vector-data ,existence-v))
  72.        )
  73.        (dotimes (,outer-index (fill-pointer ,vv-data))
  74.      (setf ,temp-inner-2index-vec (aref ,vv-data ,outer-index))
  75.      (if ,temp-inner-2index-vec
  76.          (progn
  77.            (setf ,temp-vector (2index-vector-data-vector
  78.                     ,temp-inner-2index-vec))
  79.            (dotimes (,inner-index *default-2index-vector-size*)
  80.             (when (= (aref ,temp-vector ,inner-index) 1)
  81.               ,@body)
  82.             (incf ,index-var)))
  83.          (incf ,index-var *default-2index-vector-size*)))
  84.        )
  85.     )
  86.   )
  87.  
  88.  
  89. (#-(or :allegro :lispworks) defsubst #+(or :allegro :lispworks) defun active-token-count (frame)
  90.   "This function returns the number of active tokens."
  91.   (let ((count 0))
  92.     (do-active-tokens (tokindex (frame-token-set-existence-vector frame))
  93.       (incf count))
  94.     count))
  95.  
  96.  
  97. (#-(or :allegro :lispworks) defsubst #+(or :allegro :lispworks) defun total-token-count (frame)
  98.   "This function retuns the total count of tokens."
  99.   (* (fill-pointer (2index-vector-vector-data
  100.              (frame-token-set-existence-vector frame)))
  101.      *default-2index-vector-size*)
  102.   )
  103.  
  104.  
  105. (defun status-of-frame (frame stream level
  106.             &aux (fill (make-string (* level 4) :initial-element #\space))
  107.             )
  108.   "This function prints out the status of a frame.  In the process it calls itself
  109. recursively on any sub-frames it finds in either the frame features or the token
  110. features."
  111.   (declare (special *past-frames*))
  112.   (when (and frame (not (member frame *past-frames*)))
  113.     (push frame *past-frames*)
  114.     (format stream "~&~AFrame at level ~D:~%" fill level)
  115.     (format stream "~&~A  Name: ~A~%" fill (frame-name frame))
  116.     (format stream "~&~A  Documentation: ~A~%" fill (frame-documentation frame))
  117.     (format stream "~&~A  Source File(s): ~S~%" fill (frame-source-file-list frame))
  118.     (format stream "~&~A  Tokens: ~D/~D~%" fill (active-token-count frame)
  119.         (total-token-count frame))
  120.     (map nil #'(lambda (feature-value-pair &aux fdescr fvalue)
  121.          (setf fdescr (rest feature-value-pair)
  122.                fvalue (fdescr-value fdescr))
  123.          (format stream "~&~A  ~A (Type: ~A): ~S~%" fill
  124.              (first feature-value-pair)
  125.              (elt *type-names* (fdescr-type fdescr))
  126.              (if (equalp fvalue
  127.                      (case (fdescr-type fdescr)
  128.                        (#.*int* *int-undefined*)
  129.                        (#.*real* *real-undefined*)
  130.                        (t *ptr-undefined*)))
  131.                  '**UNCALCULATED**
  132.                  fvalue))
  133.          (when (and
  134.              (= (fdescr-type fdescr)
  135.                 *handle*)
  136.              (handle-p fvalue)
  137.              (eq (handle-type fvalue) :frame))
  138.            (status-of-frame (handle-frame fvalue) stream
  139.                     (1+ level))
  140.            (pushnew (handle-frame fvalue) *past-frames*)))
  141.      (frame-feature-alist frame))
  142.     (format stream "~&~A  ~D Token features~%" fill
  143.         (length (frame-token-set-feature-vector
  144.               frame)))
  145.     (do-active-tokens (tokenindex (frame-token-set-existence-vector frame))
  146.       (map nil
  147.        #'(lambda (fdescr &aux (fvalue-vec (fdescr-value fdescr)))
  148.            (when (= (fdescr-type fdescr)
  149.             *handle*)
  150.          (let ((token-value-handle (vvref fvalue-vec
  151.                           tokenindex)))
  152.            (when (and (handle-p token-value-handle)
  153.                   (eq (handle-type token-value-handle) :frame))
  154.              (format stream
  155.                  "~&~A  Token ~d, Feature ~A (Type: Handle) ~S~%"
  156.                  fill tokenindex (fdescr-featurename fdescr)
  157.                  token-value-handle)
  158.              (status-of-frame (handle-frame token-value-handle) stream
  159.                       (1+ level)
  160.                       )
  161.              (pushnew (handle-frame token-value-handle) *past-frames*)))))
  162.        (frame-token-set-feature-vector frame))
  163.       )
  164.     )
  165.   )
  166.  
  167. (defun clear-system (&aux *past-frames*)
  168.   "CLEAR-SYSTEM - This function flushes all known data in the system."
  169.   (declare (special *past-frames*))
  170.   (clear-frame *isr-frame-root*)
  171.   (setf (frame-feature-alist *isr-frame-root*) nil)
  172.   (setf (fill-pointer (2index-vector-vector-data
  173.             (frame-token-set-existence-vector *isr-frame-root*)))
  174.     0)
  175.   (setf (frame-token-set-feature-vector *isr-frame-root*) nil)
  176.   t)
  177.  
  178. (defun clear-frame (frame)
  179.   "This function flushes a frame.  It also flushes any frames hanging below
  180. this frame."
  181.   (declare (special *past-frames*))
  182.   (when (and frame (not (member frame *past-frames*)))
  183.     (push frame *past-frames*)
  184.     (map nil #'(lambda (feature-value-pair &aux fdescr fvalue)
  185.          (setf fdescr (rest feature-value-pair)
  186.                fvalue (fdescr-value fdescr))
  187.          (when (and
  188.              (= (fdescr-type fdescr)
  189.                 *handle*)
  190.              (handle-p fvalue)
  191.              (eq (handle-type fvalue) :frame))
  192.            (clear-frame (handle-frame fvalue))
  193.            (pushnew (handle-frame fvalue) *past-frames*)))
  194.      (frame-feature-alist frame))
  195.     (map nil
  196.      #'(lambda (fdescr &aux (fvalue-vec (fdescr-value fdescr)))
  197.          (do-active-tokens (tokenindex (frame-token-set-existence-vector frame))
  198.            (let ((token-value-handle (vvref fvalue-vec
  199.                         tokenindex)))
  200.          (when (and (handle-p token-value-handle)
  201.                 (eq (handle-type token-value-handle) :frame))
  202.            (clear-frame (handle-frame token-value-handle))
  203.            (pushnew (handle-frame token-value-handle) *past-frames*))
  204.          ))
  205.          (with-lock ((2index-vector-vector-lock fvalue-vec))
  206.            (let ((dv (2index-vector-vector-data fvalue-vec))
  207.              temp)
  208.          (dotimes (i (fill-pointer dv))
  209.            (setf temp (aref dv i))
  210.            (when temp
  211.              (deallocate-resource (type-of temp) temp)))))
  212.          )
  213.      (frame-token-set-feature-vector frame))
  214.     (let ((evv (frame-token-set-existence-vector frame)))
  215.       (with-lock ((2index-vector-vector-lock evv))
  216.     (let ((ev (2index-vector-vector-data evv))
  217.           temp)
  218.       (dotimes (i (fill-pointer ev))
  219.         (setf temp (aref ev i))
  220.         (when temp
  221.           (deallocate-resource (type-of temp) temp))))))
  222.     )
  223.   )
  224.  
  225. (defun frame (handle)
  226.   "FRAME handle - Return a frame handle of a handle."
  227.   (unless (handle-p handle)
  228.     (error "~S is not a handle!" handle))
  229.   (if (eq (handle-type handle) :frame) 
  230.       handle
  231.       (make-handle :type :frame :frame (handle-frame handle)))
  232.   )
  233.  
  234. (defun %internal-handle (path &key (error-p t) (terminal-p nil) &aux parsed-path 
  235.            handle more-path)
  236.   "%INTERNAL-HANDLE path &KEY (error-p t) (terminal-p nil) -
  237. Return either a handle object of a list whose car is a handle object.  Try for
  238. the maximum depth posible.  If error-p is non-NIL, raise an error if there is
  239. a problem, else return NIL.  If terminal-p is non-NIL, check for a terminal
  240. path."
  241.   (setf parsed-path (parse-token-name path))
  242.   (multiple-value-setq (handle more-path)
  243.     (make-handle-from-parsed-path parsed-path))
  244.   (if (null handle)
  245.       (if error-p
  246.       (error "~S is not a legitimate path!" path)
  247.       nil)
  248.       (if terminal-p
  249.       (if (check-terminal-path handle more-path)
  250.           (if more-path
  251.           (cons handle more-path)
  252.           handle)
  253.           (if error-p
  254.           (error "~S is not a terminal path!" path)
  255.           nil))
  256.       (if more-path
  257.           (cons handle more-path)
  258.           handle)
  259.       )
  260.       )
  261.   )
  262.  
  263. (defun handle (path &key (error-p t) &aux handle)
  264.   "HANDLE path &KEY (error-p t) -
  265. Returns the handle for path.  If this is not posible, then either an error is signaled
  266. (error-p non-NIL) or NIL is returned (error-p NIL). If the argument is already a handle,
  267. then the handle returned is EQ to it."
  268.   (when (handle-p path) (return-from handle path))
  269.   (setf handle (%internal-handle path :terminal-p t :error-p nil))
  270.   (if (handle-p handle)
  271.       handle
  272.       (if error-p
  273.       (error "Cannot make ~S into a handle!" path)
  274.       nil))
  275.   )
  276.  
  277. (#-(or :allegro :lispworks) defsubst #+(or :allegro :lispworks) defun path? (path)
  278.   "PATH? path - returns T if path is a valid path to an existing object, NIL 
  279. otherwise."
  280.   (not (null (handle path :error-p nil))))
  281.  
  282. (defun parent (path &aux parsed-path handle more-path)
  283.   "PARENT path - Return the parent of a path."
  284.   (setf parsed-path (parse-token-name path))
  285.   (multiple-value-setq (handle more-path)
  286.     (make-handle-from-parsed-path parsed-path))
  287.   (if (and handle
  288.        (check-terminal-path handle more-path)
  289.        (not (eq (handle-frame handle) *isr-frame-root*)))
  290.       (frame-parent (handle-frame handle))
  291.       (error "~S is not a legitimate path!" path))
  292.   )
  293.  
  294. (defun check-terminal-path (handle more-path)
  295.   "Helper function: checks to be sure handle/more-path is a terminal
  296. path.  That is there is not additional levels in more-path below the
  297. path HANDLE represents."
  298.   (cond ((null handle) nil)
  299.     ((eq (handle-type handle) :frame)
  300.      (cond ((null more-path) t)
  301.            ((integerp (first more-path)) 
  302.         (or (null (rest more-path))
  303.             (and (stringp (second more-path))
  304.              (or (null (rest (rest more-path)))
  305.                  (and (stringp (third more-path))
  306.                   (equalp (subseq (third more-path)
  307.                           0 2)
  308.                       "F_")
  309.                   (null (rest (rest (rest more-path)))))))))
  310.            ((stringp  (first more-path)) 
  311.         (or (null (rest more-path))
  312.             (and (stringp (second more-path))
  313.              (equalp (subseq (second more-path)
  314.                      0 2)
  315.                  "F_")
  316.              (null (rest (rest more-path))))))
  317.            ((eq (first more-path) :?)
  318.         (or (null (rest more-path))
  319.             (and (stringp (second more-path))
  320.              (or (null (rest (rest more-path)))
  321.                  (and (stringp (third more-path))
  322.                   (equalp (subseq (third more-path)
  323.                           0 2)
  324.                       "F_")
  325.                   (null (rest (rest (rest more-path)))))))))
  326.            (t nil)))
  327.     ((or (eq (handle-type handle) :frame-feature)
  328.          (eq (handle-type handle) :token-feature))
  329.      (or (null more-path)
  330.          (and (stringp (first more-path))
  331.           (equalp (subseq (first more-path)
  332.                   0 2)
  333.               "F_")
  334.           (null (rest more-path)))))
  335.     ((eq (handle-type handle) :token)
  336.      (or (null more-path)
  337.          (and (stringp (first more-path))
  338.           (not (equalp (subseq (first more-path)
  339.                        0 2)
  340.                    "F_"))
  341.           (null (rest more-path)))))
  342.     (t (null more-path))
  343.     )
  344.   )
  345.  
  346.  
  347. (defun make-handle-from-parsed-path (parsed-path)
  348.   "This function returns two values: the \"rightmost\" handle and the remaining
  349. path in parsed-path."
  350.   (cond ((null parsed-path) (values nil nil))
  351.     ((handle-p (first parsed-path))
  352.      (make-handle-from-parsed-path1
  353.        (copy-handle (first parsed-path))
  354.        (rest parsed-path)))
  355.     ((stringp (first parsed-path))
  356.      (if (string= (first parsed-path) "ROOT")
  357.          (make-handle-from-parsed-path1
  358.            (make-handle :type :frame
  359.                 :frame *isr-frame-root*)
  360.            (rest parsed-path))
  361.          (make-handle-from-parsed-path1
  362.            (make-handle :type :frame
  363.                 :frame *isr-frame-root*)
  364.            parsed-path)))
  365.     ((or (integerp (first parsed-path)) (eq (first parsed-path) :?))
  366.      (make-handle-from-parsed-path1
  367.        (make-handle :type :frame
  368.             :frame *isr-frame-root*)
  369.        parsed-path))
  370.     (t (values nil nil))))
  371.  
  372. (defun make-handle-from-parsed-path1 (handle-above more-parsed-path)
  373.   "Helper function for make-handle-from-parsed-path: handles the recursive
  374. descent needed to traverse the path."
  375.   (DEBUGGING "~&*** Entering ISR2::MAKE-HANDLE-FROM-PARSED-PATH1: ~S ~S"
  376.         handle-above more-parsed-path)
  377.   (DEBUG-DESCRIBE handle-above)
  378.   (cond ((null more-parsed-path)
  379.      (if (and (or (eq (handle-type handle-above) :frame-feature)
  380.               (and (eq (handle-type handle-above) :token-feature)
  381.                (integerp (handle-token handle-above))))
  382.           (fdescr-p (handle-fdescr handle-above)))
  383.          (let* ((fdescr (handle-fdescr handle-above))
  384.             (fdescr-value (if (eq (handle-type handle-above) :frame-feature)
  385.                       (fdescr-value fdescr)
  386.                       (vvref (fdescr-value fdescr)
  387.                          (handle-token handle-above))))
  388.             )
  389.            (if (and
  390.             (= (fdescr-type fdescr) *handle*)
  391.             (handle-p fdescr-value)
  392.             (eq (handle-type fdescr-value) :frame)
  393.             (string= (fdescr-featurename fdescr)
  394.                  (frame-name (handle-frame fdescr-value)))
  395.             (eq (handle-frame handle-above)
  396.                 (handle-frame
  397.                   (frame-parent
  398.                 (handle-frame fdescr-value))))
  399.                )
  400.               (values (copy-handle fdescr-value) nil)
  401.               (values handle-above nil))
  402.           )
  403.          (values handle-above nil)))
  404.     ((integerp (first more-parsed-path))
  405.      (cond ((and (eq (handle-type handle-above) :frame)
  406.              (= (vvref (frame-token-set-existence-vector
  407.                  (handle-frame handle-above))
  408.                    (first more-parsed-path)) 1))
  409.         (setf (handle-type handle-above) :token
  410.               (handle-token handle-above) (first more-parsed-path)
  411.               )
  412.         (make-handle-from-parsed-path1 handle-above (rest more-parsed-path)))
  413.            ((and (member (handle-type handle-above) '(:token-subset :token-sort))
  414.              (tss-index-memq (first more-parsed-path)
  415.                      (handle-token-existence-array handle-above))
  416.              (= (vvref (frame-token-set-existence-vector
  417.                  (handle-frame handle-above))
  418.                    (first more-parsed-path))
  419.             1))
  420.         (setf (handle-type handle-above) :token
  421.               (handle-token handle-above) (first more-parsed-path)
  422.               )
  423.         (make-handle-from-parsed-path1 handle-above (rest more-parsed-path)))
  424.            ((eq (handle-type handle-above) :frame-feature)
  425.          (let ((fdescr (handle-fdescr handle-above)))
  426.               (if (and (fdescr-p fdescr)
  427.                    (= (fdescr-type fdescr) *handle*)
  428.                    (handle-p (fdescr-value fdescr))
  429.                    (eq (handle-type (fdescr-value fdescr)) :frame)
  430.                    #|
  431.                    (string= (fdescr-featurename fdescr)
  432.                     (frame-name (handle-frame
  433.                               (fdescr-value fdescr))))
  434.                    (eq (handle-frame handle-above)
  435.                    (handle-frame
  436.                      (frame-parent
  437.                        (handle-frame
  438.                      (fdescr-value fdescr)))))
  439.                    |#
  440.                    )
  441.               (make-handle-from-parsed-path1
  442.                 (copy-handle-into handle-above (fdescr-value fdescr))
  443.                 more-parsed-path)
  444.               (values handle-above more-parsed-path))
  445.               ))
  446.            ((eq (handle-type handle-above) :token-feature)
  447.          (let ((fdescr (handle-fdescr handle-above)))
  448.               (if (and (fdescr-p fdescr)
  449.                    (= (fdescr-type fdescr) *handle*)
  450.                    (integerp (handle-token handle-above)))
  451.               (let ((tokval (vvref (fdescr-value fdescr)
  452.                            (handle-token handle-above))))
  453.                    (if (and (handle-p tokval)
  454.                     (eq (handle-type tokval) :frame)
  455.                     #|
  456.                     (string= (fdescr-featurename fdescr)
  457.                          (frame-name (handle-frame
  458.                                    tokval)))
  459.                     (eq (handle-frame handle-above)
  460.                         (handle-frame
  461.                           (frame-parent
  462.                         (handle-frame
  463.                           tokval))))
  464.                     |#
  465.                     )
  466.                    (make-handle-from-parsed-path1
  467.                      (copy-handle-into handle-above tokval)
  468.                      more-parsed-path)
  469.                    (values handle-above more-parsed-path)))
  470.               (values handle-above more-parsed-path))
  471.               ))
  472.            (t (values handle-above more-parsed-path)))
  473.      )
  474.     ((and (member (handle-type handle-above) '(:frame :token-subset :token-sort))
  475.           (eq (first more-parsed-path) :?))
  476.      (setf (handle-type handle-above) :token
  477.            (handle-token handle-above) (first more-parsed-path)
  478.            )
  479.      (make-handle-from-parsed-path1 handle-above (rest more-parsed-path)))
  480.     ((and (eq (handle-type handle-above) :frame-feature)
  481.           (eq (first more-parsed-path) :?))
  482.      (let ((fdescr (handle-fdescr handle-above)))
  483.           (if (and (fdescr-p fdescr)
  484.                (= (fdescr-type fdescr) *handle*)
  485.                (handle-p (fdescr-value fdescr))
  486.                (eq (handle-type (fdescr-value fdescr)) :frame)
  487.                #|
  488.                (string= (fdescr-featurename fdescr)
  489.                 (frame-name (handle-frame (fdescr-value fdescr))))
  490.                (eq (handle-frame handle-above)
  491.                (handle-frame
  492.                  (frame-parent
  493.                    (handle-frame
  494.                  (fdescr-value fdescr)))))
  495.                |#
  496.                )
  497.           (make-handle-from-parsed-path1
  498.             (copy-handle-into handle-above (fdescr-value fdescr))
  499.             more-parsed-path)
  500.           (values handle-above more-parsed-path))
  501.           ))
  502.     ((and (eq (handle-type handle-above) :token-feature)
  503.           (integerp (handle-token handle-above))
  504.           (eq (first more-parsed-path) :?))
  505.      (let ((fdescr (handle-fdescr handle-above)))
  506.           (if (and (fdescr-p fdescr)
  507.                (= (fdescr-type fdescr) *handle*)
  508.                )
  509.           (let ((tokval (vvref (fdescr-value fdescr)
  510.                        (handle-token handle-above))))
  511.                (if (and (handle-p tokval)
  512.                 (eq (handle-type tokval) :frame)
  513.                 #|
  514.                 (string= (fdescr-featurename fdescr)
  515.                      (frame-name (handle-frame tokval)))
  516.                 (eq (handle-frame handle-above)
  517.                     (handle-frame
  518.                       (frame-parent
  519.                     (handle-frame
  520.                       tokval))))
  521.                 |#
  522.                 )
  523.                (make-handle-from-parsed-path1
  524.                  (copy-handle-into handle-above tokval)
  525.                  more-parsed-path)
  526.                (values handle-above more-parsed-path)))
  527.           (values handle-above more-parsed-path))
  528.           ))
  529.     ((stringp (first more-parsed-path))
  530.      (case (handle-type handle-above)
  531.            (:frame
  532.          (let ((fdescr-pair (assoc (first more-parsed-path)
  533.                        (frame-feature-alist
  534.                          (handle-frame handle-above))
  535.                        :test #'equalp)))
  536.               (if fdescr-pair
  537.               (progn
  538.                 (setf (handle-type handle-above) :frame-feature
  539.                   (handle-feature handle-above) (first more-parsed-path)
  540.                   (handle-fdescr handle-above) (rest fdescr-pair))
  541.                 (make-handle-from-parsed-path1 
  542.                   handle-above
  543.                   (rest more-parsed-path)))
  544.               (values handle-above more-parsed-path))
  545.               )
  546.          )
  547.            (:token
  548.          (let ((fdescr (first (member (first more-parsed-path)
  549.                           (frame-token-set-feature-vector
  550.                         (handle-frame handle-above))
  551.                           :test #'string=
  552.                           :key  #'fdescr-featurename))))
  553.               (if fdescr
  554.               (progn
  555.                 (setf (handle-type handle-above) :token-feature
  556.                   (handle-fdescr handle-above) fdescr
  557.                   (handle-feature handle-above) (first more-parsed-path))
  558.                 (make-handle-from-parsed-path1 
  559.                   handle-above
  560.                   (rest more-parsed-path)))
  561.               (values handle-above more-parsed-path))
  562.               )
  563.          )
  564.            (:frame-feature
  565.          (let ((fdescr (handle-fdescr handle-above)))
  566.               (if (and (fdescr-p fdescr)
  567.                    (= (fdescr-type fdescr) *handle*)
  568.                    (handle-p (fdescr-value fdescr))
  569.                    (eq (handle-type (fdescr-value fdescr)) :frame)
  570.                    #|
  571.                    (string= (fdescr-featurename fdescr)
  572.                     (frame-name (handle-frame
  573.                               (fdescr-value fdescr))))
  574.                    (eq (handle-frame handle-above)
  575.                    (handle-frame
  576.                      (frame-parent
  577.                        (handle-frame
  578.                      (fdescr-value fdescr)))))
  579.                    |#
  580.                    (not (string= (subseq (first more-parsed-path) 0 2)
  581.                          "F_"))
  582.                    )
  583.               (make-handle-from-parsed-path1
  584.                 (copy-handle-into handle-above (fdescr-value fdescr))
  585.                 more-parsed-path)
  586.               (values handle-above more-parsed-path))
  587.               ))
  588.            (:token-feature
  589.          (if (eq (handle-token handle-above) ':?)
  590.              (values handle-above more-parsed-path)
  591.              (let ((fdescr (handle-fdescr handle-above)))
  592.               (if (and (fdescr-p fdescr)
  593.                    (= (fdescr-type fdescr) *handle*))
  594.                   (let ((tokval (vvref (fdescr-value fdescr)
  595.                            (handle-token
  596.                              handle-above))))
  597.                    (if (and (handle-p tokval)
  598.                         (eq (handle-type tokval) :frame)
  599.                         #|
  600.                         (string= (fdescr-featurename fdescr)
  601.                              (frame-name (handle-frame
  602.                                    tokval)))
  603.                         (eq (handle-frame handle-above)
  604.                         (handle-frame
  605.                           (frame-parent (handle-frame
  606.                                   tokval))))
  607.                         |#
  608.                         (not (string= (subseq (first more-parsed-path)
  609.                                   0 2)
  610.                               "F_"))
  611.                         )
  612.                        (make-handle-from-parsed-path1
  613.                      (copy-handle-into handle-above tokval)
  614.                      more-parsed-path)
  615.                        (values handle-above more-parsed-path)))
  616.                   (values handle-above more-parsed-path))
  617.               )
  618.              )
  619.          )
  620.            (t (values handle-above more-parsed-path))))
  621.     (t (values handle-above more-parsed-path))
  622.     )
  623.   )
  624.  
  625. (defun copy-handle-into (output input)
  626.   (setf (handle-type output) (handle-type input)
  627.     (handle-frame output) (handle-frame input)
  628.     (handle-token output) (handle-token input)
  629.     (handle-feature output) (handle-feature input)
  630.     (handle-fdescr output) (handle-fdescr input)
  631.     (handle-token-existence-array output) (handle-token-existence-array input)
  632.     (handle-last-picked output) (handle-last-picked input)
  633.     (handle-sort-order output) (handle-sort-order input)
  634.     )
  635.   output)
  636.  
  637. (defun symfunctp (thing)
  638.   (or (and (consp thing)
  639.        (eq (first thing) 'lambda))
  640.       (and (symbolp thing)
  641.        (fboundp thing)))
  642.   )
  643.  
  644. (defun define-feature (path documentation datatype-key &key if-needed
  645.                if-getting if-setting &aux parsed-path handle 
  646.                more-path datatype)
  647.   "DEFINE-FEATURE path documentation datatype &key if-needed if-getting if-setting
  648. This function defines a new frame or token feature as defined by path."
  649.   (setf datatype (dt-from-keyword datatype-key))
  650.   (unless (and (integerp datatype) 
  651.            (>= datatype FIRST-DT)
  652.            (<= datatype LAST-DT))
  653.     (error "Illegal data type code: ~S" datatype-key))
  654.   (setf parsed-path (parse-token-name path))
  655.   (multiple-value-setq (handle more-path)
  656.     (make-handle-from-parsed-path parsed-path))
  657.   (unless (and handle
  658.            (check-terminal-path handle more-path))
  659.     (error "~S is not a legitimate path!" path))
  660.   (when (null if-needed)
  661.     (setf if-needed (list 'default-if-needed-function)))
  662.   (unless (every #'symfunctp if-needed)
  663.     (error "Not a list of functions ~S" if-needed))
  664.   (unless (every #'symfunctp if-getting)
  665.     (error "Not a list of functions ~S" if-getting))
  666.   (unless (every #'symfunctp if-setting)
  667.     (error "Not a list of functions ~S" if-setting))
  668.   (cond ((null more-path)
  669.      (if (member (handle-type handle) '(:frame-feature :token-feature))
  670.          (error "~S has already been defined!" path)
  671.          (error "~S is not a legitimate path!" path)))
  672.     ((and (eq (handle-type handle) :token)
  673.           (eq (handle-token handle) ':?))
  674.      (when (> (length more-path) 1)
  675.        (error "~S is not a legitimate path!" path))
  676.      (define-token-set-feature handle (first more-path)
  677.                    documentation datatype
  678.                    if-needed if-getting if-setting))
  679.     ((member (handle-type handle) '(:token :token-subset :token-sort))
  680.      (error "Cannot define a feature for path ~S" path))
  681.     ((eq (first more-path) ':?)
  682.      (when (> (length more-path) 2)
  683.        (error "~S is not a legitimate path!" path))
  684.      (define-token-set-feature handle (second more-path)
  685.                    documentation datatype
  686.                    if-needed if-getting if-setting))
  687.     ((stringp (first more-path))
  688.      (when (rest more-path)
  689.        (error "~S is not a legitimate path!" path))
  690.      (define-frame-feature handle (first more-path)
  691.                    documentation datatype
  692.                    if-needed if-getting if-setting))
  693.     (t (error "~S is not a legitimate path!" path))
  694.     )
  695.   )
  696.  
  697. (defun define-token-set-feature (handle name doc dt if-needed if-getting 
  698.                  if-setting)
  699.   "Helper function: defines a new token-set-feature."
  700.   (when (string= (subseq name 0 2) "F_")
  701.     (error "Reserved path-name element: ~S" name))
  702.   (let ((fdescr (make-fdescr
  703.           :type dt
  704.           :featurename name
  705.           :docstring doc
  706.           :value (make-2index-vector-vector dt)
  707.           :if-needed if-needed
  708.           :if-setting if-setting
  709.           :if-getting if-getting))
  710.     (frame (handle-frame handle))
  711.     )
  712.        (push fdescr
  713.          (frame-token-set-feature-vector frame))
  714.        (make-handle :type :token-feature
  715.             :frame frame
  716.             :feature name
  717.             :token :?
  718.             :fdescr fdescr)
  719.        ))
  720.  
  721. (defun define-frame-feature (handle name doc dt if-needed if-getting 
  722.                  if-setting)
  723.   "Helper function: defines a new frame-feature."
  724.   (when (string= (subseq name 0 2) "F_")
  725.     (error "Reserved path-name element: ~S" name))
  726.   (when (member name '("NAME" "DOCUMENTATION" "SOURCE-FILES") :test #'equalp)
  727.     (error "Reserved frame feature name: ~S" name))
  728.   (let ((fdescr (make-fdescr
  729.           :type dt
  730.           :featurename name
  731.           :docstring doc
  732.           :value  (ecase dt
  733.                  ((#.*pointer* #.*bitplane* #.*extents*
  734.                    #.*array* #.*string* #.*handle*)
  735.                   *ptr-undefined*)
  736.                  (#.*int* *int-undefined*)
  737.                  (#.*real* *real-undefined*)
  738.                  (#.*BOOLEAN* 0)
  739.                  )
  740.           :if-needed if-needed
  741.           :if-setting if-setting
  742.           :if-getting if-getting))
  743.     (frame (handle-frame handle))
  744.     )
  745.        (setf (frame-feature-alist frame)
  746.          (acons name fdescr (frame-feature-alist frame)))
  747.        (setf (handle-type handle) :frame-feature
  748.          (handle-fdescr handle) fdescr
  749.          (handle-feature handle) name)
  750.        handle))
  751.  
  752. (defun add-feature-function (path which-slot which-end new-function &aux
  753.                  parsed-path handle more-path)
  754.   "ADD-FEATURE-FUNCTION path which-slot which-end new-function -
  755. This function adds a new feature function.  WHICH-SLOT is one of the keywords
  756. :IF-NEEDED, :IF-GETTING, or :IF-SETTING. WHICH-END is either :BEFORE or :AFTER
  757. and specifies whether the new function is to be run before the existing
  758. feature functions or after the existing feature functions.  NEW-FUNCTION is a
  759. function object."
  760.   (setf parsed-path (parse-token-name path))
  761.   (multiple-value-setq (handle more-path)
  762.     (make-handle-from-parsed-path parsed-path))
  763.   (unless (and handle
  764.            (check-terminal-path handle more-path)
  765.            (eq (handle-type handle) :frame))
  766.     (error "~S is not a legitimate path!" path))
  767.   (unless (member which-slot '(:if-needed :if-getting :if-setting))
  768.     (error "Illegal slot name: ~S" which-slot))
  769.   (unless (member which-end '(:before :after))
  770.     (error "Illegal end: ~S" which-end))
  771.   (unless (symfunctp new-function)
  772.     (error "Not a function: ~S" new-function))
  773.   (cond ((null more-path)
  774.      (if (member (handle-type handle) '(:feature :token-feature))
  775.          (if (eq (handle-type handle) :feature)
  776.          (add-frame-feature-function (handle-frame handle)
  777.                          (handle-feature handle)
  778.                          which-slot which-end 
  779.                          new-function)
  780.          (add-token-set-feature-function (handle-frame handle)
  781.                          (handle-feature handle)
  782.                          which-slot which-end 
  783.                          new-function))
  784.          (error "~S is not a legitimate path!" path)))
  785.     ((and (eq (first more-path) ':?)
  786.           (rest more-path)
  787.           (stringp (second more-path))
  788.           (null (rest (rest more-path))))
  789.      (add-token-set-feature-function (handle-frame handle)
  790.                      (second more-path)
  791.                      which-slot which-end 
  792.                      new-function))
  793.     (t (error "~S is not a legitimate path!" path))
  794.     )
  795.   )
  796.   
  797. (defun add-token-set-feature-function (frame feature slot end function)
  798.   "Helper function to add a new token-set feature function"
  799.   (when (string= (subseq feature 0 2) "F_")
  800.     (error "Reserved path-name element: ~S" feature))
  801.   (let ((fdescr (first (member feature (frame-token-set-feature-vector
  802.                      frame)
  803.                    :test #'equalp
  804.                    :key #'fdescr-featurename))))
  805.        (unless fdescr
  806.      (error "Token set feature ~A not defined in frame ~S"
  807.         feature frame))
  808.        (if (eq end :before)
  809.        (case slot
  810.          (:if-needed (push function (fdescr-if-needed fdescr)))
  811.          (:if-getting (push function (fdescr-if-getting fdescr)))
  812.          (:if-setting (push function (fdescr-if-setting fdescr))))
  813.        (case slot
  814.          (:if-needed
  815.            (setf (fdescr-if-needed fdescr)
  816.              (nconc (fdescr-if-needed fdescr)
  817.                 (list function))))
  818.          (:if-getting
  819.            (setf (fdescr-if-getting fdescr)
  820.              (nconc (fdescr-if-getting fdescr)
  821.                 (list function))))
  822.          (:if-setting
  823.            (setf (fdescr-if-setting fdescr)
  824.              (nconc (fdescr-if-setting fdescr)
  825.                 (list function))))
  826.          )
  827.        )
  828.        )
  829.   t)
  830.  
  831. (defun add-frame-feature-function (frame feature slot end function)
  832.   "Helper function to add a new frame feature function"
  833.   (when (string= (subseq feature 0 2) "F_")
  834.     (error "Reserved path-name element: ~S" feature))
  835.   (when (member feature '("NAME" "DOCUMENTATION" "SOURCE-FILES") :test #'equalp)
  836.     (error "Cannot set feature functions on hard-wired frame-feature ~A" 
  837.        feature))
  838.   (let ((fdescr (cdr (assoc feature (frame-feature-alist
  839.                      frame)
  840.                    :test #'equalp))))
  841.        (unless fdescr
  842.      (error "Frame feature ~A not defined in frame ~S"
  843.         feature frame))
  844.        (if (eq end :before)
  845.        (case slot
  846.          (:if-needed (push function (fdescr-if-needed fdescr)))
  847.          (:if-getting (push function (fdescr-if-getting fdescr)))
  848.          (:if-setting (push function (fdescr-if-setting fdescr))))
  849.        (case slot
  850.          (:if-needed
  851.            (setf (fdescr-if-needed fdescr)
  852.              (nconc (fdescr-if-needed fdescr)
  853.                 (list function))))
  854.          (:if-getting
  855.            (setf (fdescr-if-getting fdescr)
  856.              (nconc (fdescr-if-getting fdescr)
  857.                 (list function))))
  858.          (:if-setting
  859.            (setf (fdescr-if-setting fdescr)
  860.              (nconc (fdescr-if-setting fdescr)
  861.                 (list function))))
  862.          )
  863.        )
  864.        )
  865.   t)
  866.  
  867. (defun default-if-needed-function (slot-name frame-handle token-handle)
  868.   "Default IF-NEEDED function.  Raises an error if called."
  869.   (error "Uncalculated value found for slot ~A, of frame ~S, token ~S" 
  870.      slot-name frame-handle token-handle))
  871.  
  872. (defun create (path &key frame-features token-features token-init-list
  873.             &aux parsed-path handle more-path)
  874.   "CREATE path &key frame-features token-features token-init-list -
  875. Create a new token or frame (tail of path says which).  If a frame, then
  876. frame-features and token-features define its feature lists (they are lists of
  877. arguments for DEFINE-FEATURE), else if a token token-init-list is a list of two
  878. element lists (featurename value) to be used as token value initializers."
  879.   (setf parsed-path (parse-token-name path))
  880.   (multiple-value-setq (handle more-path)
  881.     (make-handle-from-parsed-path parsed-path))
  882.   (unless (and handle
  883.            (check-terminal-path handle more-path)
  884.            (member (handle-type handle) '(:frame :token-subset :token
  885.                           :token-feature :frame-feature)))
  886.     (error "~S is not a legitimate path!" path))
  887.   #|
  888.   (when (or (null more-path) (and (stringp (first more-path))
  889.                   (string= (subseq (first more-path) 0 2)
  890.                        "F_")))
  891.     (error "~S has already been created!" path))
  892.   |#
  893.   (cond ((integerp (first more-path))
  894.      ;; create a token
  895.      (with-lock ((2index-vector-vector-lock 
  896.               (frame-token-set-existence-vector
  897.             (handle-frame handle))))
  898.             (create-token (handle-frame handle) (first more-path) token-init-list
  899.               (eq (handle-type handle) :frame))))
  900.     ((eq (handle-type handle) :token-subset)
  901.      (error "Token subsets don't have features or frames: ~S"
  902.         path))
  903.     ((member (handle-type handle) '(:token :token-feature))
  904.      (when (eq (handle-type handle) :token)
  905.        (when (null more-path)
  906.          (error "~S has already been created!" path))
  907.        (let ((tokindex (handle-token handle)))
  908.         (setf (handle-token handle) :?
  909.               handle (define-feature (list handle (first more-path)) "" :handle)
  910.               more-path (rest more-path)
  911.               (handle-token handle) tokindex)
  912.         ))
  913.      (create-frame handle frame-features token-features))
  914.     (t (when (eq (handle-type handle) :frame)
  915.          (when (null more-path)
  916.            (error "~S has already been created!" path))
  917.          (setf handle (define-feature (list handle (first more-path)) "" :handle)
  918.            more-path (rest more-path)))
  919.        (create-frame handle frame-features token-features)))
  920.   )
  921.  
  922. (defun create-new-token (path &key token-init-list
  923.             &aux parsed-path handle more-path)
  924.   "CREATE-NEW-TOKEN path &key token-init-list -
  925. Create a new token.  The token index is generated. Token-init-list is a 
  926. list of two element lists (featurename value) to be used as token value 
  927. initializers."
  928.   (setf parsed-path (parse-token-name path))
  929.   (multiple-value-setq (handle more-path)
  930.     (make-handle-from-parsed-path parsed-path))
  931.   (unless (and handle
  932.            (null more-path)
  933.            (member (handle-type handle) '(:frame :token-subset)))
  934.     (error "~S is not a legitimate path!" path))
  935.   (with-lock ((2index-vector-vector-lock
  936.         (frame-token-set-existence-vector (handle-frame handle))))
  937.     (let* ((new-index (find-free-token-index (handle-frame handle)))
  938.        (new-token (create-token (handle-frame handle) new-index token-init-list
  939.                     (eq (handle-type handle) :frame)))
  940.        )
  941.      (when (eq (handle-type handle) :token-subset)
  942.        (tss-index-add new-index handle))
  943.      new-token)))
  944.  
  945. (defun token-index-of (token-handle &aux index)
  946.   "Returns the token index in token-handle."
  947.   (unless (and (handle-p token-handle)
  948.            (member (handle-type token-handle) '(:token :token-feature)))
  949.     (error "Bad argument to ~S: not a token or token-feature handle - ~S!"
  950.        'token-index-of token-handle))
  951.   (setf index (handle-token token-handle))
  952.   (unless (integerp index)
  953.     (error "Bad argument to ~S: ambigous token or token-feature handle - ~S!"
  954.        'token-index-of token-handle))
  955.   index)
  956.  
  957. (defun find-free-token-index (frame)
  958.   "Helper function - find first free token index in frame."
  959.   (let ((evv (frame-token-set-existence-vector frame)))
  960.       (do ((index 0 (1+ index)))
  961.           ((= (vvref evv index) 0) index)
  962.           ))
  963.   )
  964.  
  965. (defsetf value %setf-value "Setf form for VALUE")
  966.  
  967. (defun create-token (frame token-index token-init-list &optional (permp nil)
  968.                &aux new-handle)
  969.   "Helper function: create a new token and maybe initializes some of its feature
  970. values."
  971.   (setf (vvref (frame-token-set-existence-vector
  972.          frame)
  973.            token-index) 1)
  974.   (when permp
  975.     (setf (vvref (frame-token-set-globalp-vector
  976.            frame)
  977.          token-index) 1))
  978.   (setf new-handle (make-handle :type :token
  979.                 :frame frame
  980.                 :token token-index))
  981.   (map nil #'(lambda (feature-value-pair)
  982.              (setf (value (list new-handle (first feature-value-pair)))
  983.                (second feature-value-pair)))
  984.        token-init-list)
  985.   new-handle)
  986.  
  987. (defun create-frame (fdescr-handle frame-features token-features)
  988.   "Helper function: create a new frame and define some features for it."
  989.   (unless (and (= (fdescr-type (handle-fdescr fdescr-handle)) *handle*)
  990.            (eq (if (eq (handle-type fdescr-handle) :frame-feature)
  991.                (fdescr-value (handle-fdescr fdescr-handle))
  992.                (vvref (fdescr-value (handle-fdescr fdescr-handle))
  993.                   (handle-token fdescr-handle)))
  994.            *ptr-undefined*))
  995.     (error "Attempt to create a frame in a non-handle feature or in a bound feature: ~S"
  996.        fdescr-handle))
  997.   (let* ((new-frame-name (handle-feature fdescr-handle))
  998.      (new-frame
  999.       (make-frame new-frame-name
  1000.               :parent (if (eq (handle-type fdescr-handle) :token-feature)
  1001.                   (make-handle :type :token
  1002.                            :frame (handle-frame fdescr-handle)
  1003.                            :token (handle-token fdescr-handle))
  1004.                   (make-handle :type :frame
  1005.                            :frame (handle-frame fdescr-handle)))))
  1006.      (new-frame-handle (make-handle :type :frame :frame new-frame))
  1007.      (new-any-token-index-handle
  1008.        (make-handle :type :token
  1009.             :frame new-frame
  1010.             :token :?))
  1011.      (success? nil)
  1012.      )
  1013.     (setf (value fdescr-handle) new-frame-handle)
  1014.     (unwind-protect
  1015.       (progn
  1016.         (map nil #'(lambda (frame-feature-def)
  1017.                    (apply #'define-feature
  1018.                       (list new-frame-handle
  1019.                         (first frame-feature-def))
  1020.                       (rest frame-feature-def)))
  1021.          frame-features)
  1022.         (map nil #'(lambda (token-feature-def)
  1023.                    (apply #'define-feature
  1024.                       (list new-any-token-index-handle
  1025.                         (first token-feature-def))
  1026.                       (rest token-feature-def)))
  1027.          token-features)
  1028.         (setf success? t))
  1029.       (unless success?
  1030.         (destroy new-frame-handle)))
  1031.     (if success?
  1032.         new-frame-handle
  1033.         nil))
  1034.   )
  1035.  
  1036. (defvar *value-frame-handle* (make-handle :type :frame)
  1037.     "scratch handle for use inside isr2:value")
  1038.  
  1039. (defvar *value-token-handle* (make-handle :type :token)
  1040.     "scratch handle for use inside isr2:value")
  1041.  
  1042. (defun value (path &key (if-undefined :error) &aux parsed-path handle more-path)
  1043.   "VALUE path &KEY (if-undefined :error) - returns the value at the end of path."
  1044.   (declare (special path))
  1045.   (when (and (listp path)
  1046.          (handle-p (first path))
  1047.          (eq (handle-type (first path)) :token-feature)
  1048.          (eq (handle-token (first path)) :?)
  1049.          (integerp (second path))
  1050.          (null (rest (rest path))))
  1051.     (let ((new-path (copy-handle (first path))))
  1052.      (setf (handle-token new-path) (second path)
  1053.            path new-path)))
  1054.   (setf parsed-path (parse-token-name path))
  1055.   (multiple-value-setq (handle more-path)
  1056.     (make-handle-from-parsed-path parsed-path))
  1057.   (unless (and handle
  1058.            (check-terminal-path handle more-path))
  1059.     (error "~S is not a legitimate path!" path))
  1060.   (DEBUGGING "~&*** Entering ISR2::VALUE ~S~&    Parsed: ~S, ~S" path 
  1061.          handle more-path)
  1062.   (unless (frame-is-loaded-p (handle-frame handle))
  1063.     (check-load-stub-frame handle))
  1064.   (case (handle-type handle)
  1065.     (:frame (if (null more-path) 
  1066.             handle
  1067.             (cond ((integerp (first more-path))
  1068.                (error "Token does not exist: ~S!" (list 
  1069.                                    handle 
  1070.                                    (first more-path))))
  1071.               ((string= (first more-path) "DOCUMENTATION")
  1072.                (cond ((null (rest more-path))
  1073.                   (frame-documentation (handle-frame handle)))
  1074.                  ((= (length more-path) 2)
  1075.                   (if (string= (second more-path)
  1076.                            "F_DATATYPE")
  1077.                       :string
  1078.                       (error "~S is not a legitimate path !" path)))
  1079.                  (t (error "~S is not a legitimate path !" path))))
  1080.               ((string= (first more-path) "SOURCE-FILES")
  1081.                (cond ((null (rest more-path))
  1082.                   (frame-source-file-list (handle-frame handle)))
  1083.                  ((= (length more-path) 2)
  1084.                   (if (string= (second more-path)
  1085.                            "F_DATATYPE")
  1086.                       :pointer
  1087.                       (error "~S is not a legitimate path !" path)))
  1088.                  (t (error "~S is not a legitimate path !" path))))
  1089.               ((string= (first more-path) "NAME")
  1090.                (cond ((null (rest more-path))
  1091.                   (frame-name (handle-frame handle)))
  1092.                  ((= (length more-path) 2)
  1093.                   (if (string= (second more-path)
  1094.                            "F_DATATYPE")
  1095.                       :string
  1096.                       (error "~S is not a legitimate path !" path)))
  1097.                  (t (error "~S is not a legitimate path !" path))))
  1098.               (t (error "~S is not a legitimate path !" path)))))
  1099.     (:frame-feature
  1100.       (frame-feature-value handle more-path if-undefined))
  1101.     (:token-feature
  1102.       (token-feature-value handle more-path if-undefined))
  1103.     (t (error "~S is not a legitimate path !" path)))
  1104.   )
  1105.  
  1106.  
  1107. (defun frame-feature-value (handle more-path if-undefined)
  1108.   "Helper function: fetch the value of a frame feature."
  1109.   (declare (special path))
  1110.   (if (null more-path)
  1111.       (let* ((fdescr (handle-fdescr handle))
  1112.          (orig-value (fdescr-value fdescr))
  1113.          (if-needed (fdescr-if-needed fdescr))
  1114.          (if-setting (fdescr-if-setting fdescr))
  1115.          (if-getting (fdescr-if-getting fdescr))
  1116.          (frame-handle (progn
  1117.                  (setf (handle-type *value-frame-handle*) :frame
  1118.                    (handle-frame *value-frame-handle*)
  1119.                    (handle-frame handle))
  1120.                  *value-frame-handle*))
  1121.          (*set-value-flag* t)
  1122.          )
  1123.        (declare (special *set-value-flag*))
  1124.        (when (equalp orig-value (case (fdescr-type fdescr)
  1125.                       ((#.*int* #.*boolean*) *int-undefinable*)
  1126.                       (#.*real* *real-undefinable*)
  1127.                       (t *ptr-undefinable*)))
  1128.          (setf orig-value :undefined))
  1129.        (when (equalp orig-value (case (fdescr-type fdescr)
  1130.                       ((#.*int* #.*boolean*) *int-undefined*)
  1131.                       (#.*real* *real-undefined*)
  1132.                       (t *ptr-undefined*)))
  1133.          (setf orig-value :uncalculated))
  1134.        (when (eq orig-value :uncalculated)
  1135.          (dolist (if-needed-fun if-needed)
  1136.              (setf orig-value
  1137.                (funcall if-needed-fun
  1138.                     (fdescr-featurename fdescr)
  1139.                     frame-handle
  1140.                     nil))
  1141.              (unless (eq orig-value :uncalculated) (return t)))
  1142.          (dolist (if-setting-fun if-setting)
  1143.              (setf orig-value
  1144.                (funcall if-setting-fun 
  1145.                     :uncalculated
  1146.                     orig-value
  1147.                     (fdescr-featurename fdescr)
  1148.                     frame-handle nil)))
  1149.          (when (eq orig-value :uncalculated)
  1150.            (setf orig-value
  1151.              (case (fdescr-type fdescr)
  1152.                (#.*int* *int-undefined*)
  1153.                (#.*real* *real-undefined*)
  1154.                (t *ptr-undefined*))))
  1155.          (when (eq orig-value :undefined)
  1156.            (setf orig-value
  1157.              (case (fdescr-type fdescr)
  1158.                (#.*int* *int-undefinable*)
  1159.                (#.*real* *real-undefinable*)
  1160.                (t *ptr-undefinable*))))
  1161.          (when *set-value-flag*
  1162.            (case (fdescr-type fdescr)
  1163.          (#.*int* (unless (typep orig-value 'integer)
  1164.                 (error "~S must be an integer!" orig-value)))
  1165.          (#.*real* (unless (typep orig-value 'single-float)
  1166.                  (error "~S must be a single float!" orig-value)))
  1167.          (#.*string* (unless (or (eq orig-value *ptr-undefined*)
  1168.                      (eq orig-value *ptr-undefinable*)
  1169.                      (typep orig-value 'string))
  1170.                    (error "~S must be a string!" orig-value)))
  1171.          (#.*array* (unless (or (eq orig-value *ptr-undefined*)
  1172.                     (eq orig-value *ptr-undefinable*)
  1173.                     (typep orig-value 'array))
  1174.                   (error "~S must be an array!" orig-value)))
  1175.          (#.*handle* (unless (or (eq orig-value *ptr-undefined*)
  1176.                      (eq orig-value *ptr-undefinable*)
  1177.                      (typep orig-value 'handle))
  1178.                    (error "~S must be a handle!" orig-value)))
  1179.          (#.*BOOLEAN* (unless (or (eq orig-value *ptr-undefined*)
  1180.                       (eq orig-value *ptr-undefinable*)
  1181.                       (typep orig-value 'bit))
  1182.                 (error "~S must be a bit!" orig-value)))
  1183.          (#.*bitplane* (unless (or (eq orig-value *ptr-undefined*)
  1184.                        (eq orig-value *ptr-undefinable*)
  1185.                        (typep orig-value '(array bit (* *))))
  1186.                  (error "~S must be a bitplane!" orig-value)))
  1187.          (#.*extents* (unless (or (eq orig-value *ptr-undefined*)
  1188.                       (eq orig-value *ptr-undefinable*)
  1189.                       (typep orig-value 'extents))
  1190.                 (error "~S must be an extents struct!" orig-value)))
  1191.          (#.*pointer*)
  1192.          )
  1193.            (setf (fdescr-value fdescr) orig-value)
  1194.            )
  1195.          (when (equalp orig-value (case (fdescr-type fdescr)
  1196.                         ((#.*int* #.*boolean*) *int-undefinable*)
  1197.                         (#.*real* *real-undefinable*)
  1198.                         (t *ptr-undefinable*)))
  1199.            (setf orig-value :undefined))
  1200.          (when (equalp orig-value (case (fdescr-type fdescr)
  1201.                         ((#.*int* #.*boolean*) *int-undefined*)
  1202.                         (#.*real* *real-undefined*)
  1203.                         (t *ptr-undefined*)))
  1204.            (setf orig-value :uncalculated))
  1205.          )
  1206.        (dolist (if-getting-fun if-getting)
  1207.            (setf orig-value
  1208.              (funcall if-getting-fun 
  1209.                   orig-value
  1210.                   (fdescr-featurename fdescr)
  1211.                   frame-handle nil)))
  1212.        (if (eq orig-value :undefined)
  1213.            (if (eq if-undefined :error)
  1214.            (error "The value of ~S is undefined!" handle)
  1215.            if-undefined)
  1216.            orig-value))
  1217.       (let ((field-name (first more-path))
  1218.         (fdescr (handle-fdescr handle)))
  1219.        (unless (null (rest more-path))
  1220.          (error "~S is not a legitimate path !" path))
  1221.        (cond ((string= field-name "F_DATATYPE")
  1222.           (keyword-from-dt (fdescr-type fdescr)))
  1223.          ((string= field-name "F_DOCUMENTATION")
  1224.           (fdescr-docstring fdescr))
  1225.          ((string= field-name "F_IF-NEEDED")
  1226.           (fdescr-if-needed fdescr))
  1227.          ((string= field-name "F_IF-GETTING")
  1228.           (fdescr-if-getting fdescr))
  1229.          ((string= field-name "F_IF-SETTING")
  1230.           (fdescr-if-setting fdescr))
  1231.          (t (error "~S is not a legitimate path !" path)))
  1232.        )
  1233.       )
  1234.   )
  1235.  
  1236. (defun token-feature-value (handle more-path if-undefined &aux token-index)
  1237.   "Helper function: fetch the value of a token feature."
  1238.   (declare (special path))
  1239.   (setf token-index (handle-token handle))
  1240.   (if (null more-path)
  1241.       (progn
  1242.     (unless (integerp token-index)
  1243.       (error "~S is not a legitimate path !" path))
  1244.     (unless (= (vvref (frame-token-set-existence-vector (handle-frame handle))
  1245.               token-index)
  1246.            1)
  1247.       (error "~S is not a legitimate path !" path))
  1248.     (let* ((fdescr (handle-fdescr handle))
  1249.            (orig-value (vvref (fdescr-value fdescr) token-index))
  1250.            (if-needed (fdescr-if-needed fdescr))
  1251.            (if-getting (fdescr-if-getting fdescr))
  1252.            (if-setting (fdescr-if-setting fdescr))
  1253.            (frame-handle (progn
  1254.                  (setf (handle-type *value-frame-handle*) :frame
  1255.                    (handle-frame *value-frame-handle*)
  1256.                    (handle-frame handle))
  1257.                  *value-frame-handle*))
  1258.            (*set-value-flag* t)
  1259.            (token-handle (progn
  1260.                  (setf (handle-type *value-token-handle*) :token
  1261.                    (handle-frame *value-token-handle*)
  1262.                    (handle-frame handle)
  1263.                    (handle-token *value-token-handle*)
  1264.                    (handle-token handle))
  1265.                  *value-token-handle*))
  1266.            )
  1267.           (declare (special *set-value-flag*))
  1268.           (when (equalp orig-value (case (fdescr-type fdescr)
  1269.                          ((#.*int* #.*boolean*) *int-undefinable*)
  1270.                          (#.*real* *real-undefinable*)
  1271.                          (t *ptr-undefinable*)))
  1272.         (setf orig-value :undefined))
  1273.           (when (equalp orig-value (case (fdescr-type fdescr)
  1274.                          ((#.*int* #.*boolean*) *int-undefined*)
  1275.                          (#.*real* *real-undefined*)
  1276.                          (t *ptr-undefined*)))
  1277.         (setf orig-value :uncalculated))
  1278.           (when (eq orig-value :uncalculated)
  1279.         (dolist (if-needed-fun if-needed)
  1280.             (setf orig-value
  1281.                   (funcall if-needed-fun
  1282.                        (fdescr-featurename fdescr)
  1283.                        frame-handle token-handle
  1284.                        ))
  1285.             (unless (eq orig-value :uncalculated) (return t)))
  1286.         (dolist (if-setting-fun if-setting)
  1287.             (setf orig-value
  1288.                   (funcall if-setting-fun 
  1289.                        :uncalculated
  1290.                        orig-value
  1291.                        (fdescr-featurename fdescr)
  1292.                        frame-handle token-handle)))
  1293.         (when (eq orig-value :uncalculated)
  1294.           (setf orig-value
  1295.             (case (fdescr-type fdescr)
  1296.                   (#.*int* *int-undefined*)
  1297.                   (#.*real* *real-undefined*)
  1298.                   (t *ptr-undefined*))))
  1299.         (when (eq orig-value :undefined)
  1300.           (setf orig-value
  1301.             (case (fdescr-type fdescr)
  1302.                   (#.*int* *int-undefinable*)
  1303.                   (#.*real* *real-undefinable*)
  1304.                   (t *ptr-undefinable*))))
  1305.         (when *set-value-flag*
  1306.           (case (fdescr-type fdescr)
  1307.             (#.*int* (unless (typep orig-value 'integer)
  1308.                    (error "~S must be an integer!" orig-value)))
  1309.             (#.*real* (unless (typep orig-value 'single-float)
  1310.                     (error "~S must be a single float!" orig-value)))
  1311.             (#.*string* (unless (or (eq orig-value *ptr-undefined*)
  1312.                         (eq orig-value *ptr-undefinable*)
  1313.                         (typep orig-value 'string))
  1314.                       (error "~S must be a string!" orig-value)))
  1315.             (#.*array* (unless (or (eq orig-value *ptr-undefined*)
  1316.                            (eq orig-value *ptr-undefinable*)
  1317.                            (typep orig-value 'array))
  1318.                      (error "~S must be an array!" orig-value)))
  1319.             (#.*handle* (unless (or (eq orig-value *ptr-undefined*)
  1320.                         (eq orig-value *ptr-undefinable*)
  1321.                         (typep orig-value 'handle))
  1322.                       (error "~S must be a handle!" orig-value)))
  1323.             (#.*BOOLEAN* (unless (typep orig-value 'bit)
  1324.                        (error "~S must be a bit!" orig-value)))
  1325.             (#.*bitplane* (unless (or (eq orig-value *ptr-undefined*)
  1326.                           (eq orig-value *ptr-undefinable*)
  1327.                           (typep orig-value '(array bit (* *))))
  1328.                     (error "~S must be a bitplane!" orig-value)))
  1329.             (#.*extents* (unless (or (eq orig-value *ptr-undefined*)
  1330.                          (eq orig-value *ptr-undefinable*)
  1331.                          (typep orig-value 'extents))
  1332.                        (error "~S must be an extents struct!" orig-value)))
  1333.             (#.*pointer*)
  1334.             )
  1335.           (setf (vvref (fdescr-value fdescr) token-index)
  1336.             orig-value))
  1337.         (when (equalp orig-value (case (fdescr-type fdescr)
  1338.                            ((#.*int* #.*boolean*) *int-undefinable*)
  1339.                            (#.*real* *real-undefinable*)
  1340.                            (t *ptr-undefinable*)))
  1341.           (setf orig-value :undefined))
  1342.         (when (equalp orig-value (case (fdescr-type fdescr)
  1343.                            ((#.*int* #.*boolean*) *int-undefined*)
  1344.                            (#.*real* *real-undefined*)
  1345.                            (t *ptr-undefined*)))
  1346.           (setf orig-value :uncalculated))
  1347.         )
  1348.           (dolist (if-getting-fun if-getting)
  1349.               (setf orig-value
  1350.                 (funcall if-getting-fun 
  1351.                      orig-value
  1352.                      (fdescr-featurename fdescr)
  1353.                      frame-handle token-handle)))
  1354.           (if (eq orig-value :undefined)
  1355.           (if (eq if-undefined :error)
  1356.               (error "The value of ~S is undefined!" handle)
  1357.               if-undefined)
  1358.           orig-value)))
  1359.       (let ((field-name (first more-path))
  1360.         (fdescr (handle-fdescr handle)))
  1361.        (unless (null (rest more-path))
  1362.          (error "~S is not a legitimate path !" path))
  1363.        (cond ((string= field-name "F_DATATYPE")
  1364.           (keyword-from-dt (fdescr-type fdescr)))
  1365.          ((string= field-name "F_DOCUMENTATION")
  1366.           (fdescr-docstring fdescr))
  1367.          ((string= field-name "F_IF-NEEDED")
  1368.           (copy-list (fdescr-if-needed fdescr)))
  1369.          ((string= field-name "F_IF-GETTING")
  1370.           (copy-list (fdescr-if-getting fdescr)))
  1371.          ((string= field-name "F_IF-SETTING")
  1372.           (copy-list (fdescr-if-setting fdescr)))
  1373.          (t (error "~S is not a legitimate path !" path)))
  1374.        )
  1375.       )
  1376.   )
  1377.  
  1378.  
  1379. (defun %setf-value (path newvalue &aux parsed-path handle more-path)
  1380.   "Setf function for VALUE."
  1381.   (declare (special path))
  1382.   (when (and (listp path)
  1383.          (handle-p (first path))
  1384.          (eq (handle-type (first path)) :token-feature)
  1385.          (eq (handle-token (first path)) :?)
  1386.          (integerp (second path))
  1387.          (null (rest (rest path))))
  1388.     (let ((new-path (copy-handle (first path))))
  1389.      (setf (handle-token new-path) (second path)
  1390.            path new-path)))
  1391.   (setf parsed-path (parse-token-name path))
  1392.   (multiple-value-setq (handle more-path)
  1393.     (make-handle-from-parsed-path parsed-path))
  1394.   (unless (and handle
  1395.            (check-terminal-path handle more-path))
  1396.     (error "~S is not a legitimate path!" path))
  1397.   (DEBUGGING "~&*** Entering ISR2::%SETF-VALUE ~S ~S~&    Parsed: ~S, ~S" path 
  1398.          newvalue handle more-path)
  1399.   (unless (frame-is-loaded-p (handle-frame handle))
  1400.     (check-load-stub-frame handle))
  1401.   (case (handle-type handle)
  1402.     (:frame (if (null more-path) 
  1403.             (error "~S is not a legitimate path !" path)
  1404.             (cond ((integerp (first more-path))
  1405.                (error "Token does not exist: ~S!" (list 
  1406.                                    handle 
  1407.                                    (first more-path))))
  1408.               ((string= (first more-path) "DOCUMENTATION")
  1409.                (cond ((null (rest more-path))
  1410.                   (setf 
  1411.                     (frame-documentation (handle-frame handle))
  1412.                     (string newvalue)))
  1413.                  (t (error "~S is not a legitimate path !" path))))
  1414.               ;; Note:  this may be removed at a future time.
  1415.               ((string= (first more-path) "SOURCE-FILES")
  1416.                (cond ((null (rest more-path))
  1417.                   (setf 
  1418.                     (frame-source-file-list (handle-frame handle))
  1419.                     (copy-list newvalue)))
  1420.                  (t (error "~S is not a legitimate path !" path))))
  1421.               (t (error "~S is not a legitimate path !" path)))))
  1422.     (:frame-feature
  1423.       (%setf-frame-feature-value handle more-path newvalue))
  1424.     (:token-feature
  1425.       (%setf-token-feature-value handle more-path newvalue))
  1426.     (t (error "~S is not a legitimate path !" path)))
  1427.   )
  1428.  
  1429.  
  1430. (defun %setf-frame-feature-value (handle more-path newvalue)
  1431.   "Function to set a frame feature value."
  1432.   (declare (special path))
  1433.   (if (null more-path)
  1434.       (let* ((fdescr (handle-fdescr handle))
  1435.          (orig-value (fdescr-value fdescr))
  1436.          (if-setting (fdescr-if-setting fdescr))
  1437.          (frame-handle (progn
  1438.                  (setf (handle-type *value-frame-handle*) :frame
  1439.                    (handle-frame *value-frame-handle*)
  1440.                    (handle-frame handle))
  1441.                  *value-frame-handle*))
  1442.          (*set-value-flag* t)
  1443.          )
  1444.         (declare (special *set-value-flag*))
  1445.         (when (equalp orig-value (case (fdescr-type fdescr)
  1446.                        ((#.*int* #.*boolean*) *int-undefinable*)
  1447.                        (#.*real* *real-undefinable*)
  1448.                        (t *ptr-undefinable*)))
  1449.           (setf orig-value :undefined))
  1450.         (when (equalp orig-value (case (fdescr-type fdescr)
  1451.                        ((#.*int* #.*boolean*) *int-undefined*)
  1452.                        (#.*real* *real-undefined*)
  1453.                        (t *ptr-undefined*)))
  1454.           (setf orig-value :uncalculated))
  1455.         (dolist (if-setting-fun if-setting)
  1456.              (setf newvalue
  1457.                (funcall if-setting-fun 
  1458.                     orig-value newvalue
  1459.                     (fdescr-featurename fdescr)
  1460.                     frame-handle nil)))
  1461.        (when *set-value-flag*
  1462.           (when (eq newvalue :uncalculated)
  1463.         (setf newvalue
  1464.               (case (fdescr-type fdescr)
  1465.                 (#.*int* *int-undefined*)
  1466.                 (#.*real* *real-undefined*)
  1467.                 (t *ptr-undefined*))))
  1468.           (when (eq newvalue :undefined)
  1469.         (setf newvalue
  1470.               (case (fdescr-type fdescr)
  1471.                 (#.*int* *int-undefinable*)
  1472.                 (#.*real* *real-undefinable*)
  1473.                 (t *ptr-undefinable*))))
  1474.            (case (fdescr-type fdescr)
  1475.          (#.*int* (unless (typep newvalue 'integer)
  1476.                 (error "~S must be an integer!" newvalue)))
  1477.          (#.*real* (unless (typep newvalue 'single-float)
  1478.                  (error "~S must be a single float!" newvalue)))
  1479.          (#.*string* (unless (or (eq newvalue *ptr-undefined*)
  1480.                      (eq newvalue *ptr-undefinable*)
  1481.                      (typep newvalue 'string))
  1482.                    (error "~S must be a string!" newvalue)))
  1483.          (#.*array* (unless (or (eq newvalue *ptr-undefined*)
  1484.                     (eq newvalue *ptr-undefinable*)
  1485.                     (typep newvalue 'array))
  1486.                   (error "~S must be an array!" newvalue)))
  1487.          (#.*handle* (unless (or (eq newvalue *ptr-undefined*)
  1488.                      (eq newvalue *ptr-undefinable*)
  1489.                      (typep newvalue 'handle))
  1490.                    (error "~S must be a handle!" newvalue)))
  1491.          (#.*BOOLEAN* (unless (or (eq newvalue *ptr-undefined*)
  1492.                       (eq newvalue *ptr-undefinable*)
  1493.                       (typep newvalue 'bit))
  1494.                 (error "~S must be a bit!" newvalue)))
  1495.          (#.*bitplane* (unless (or (eq newvalue *ptr-undefined*)
  1496.                        (eq newvalue *ptr-undefinable*)
  1497.                        (typep newvalue '(array bit (* *))))
  1498.                  (error "~S must be a bitplane!" newvalue)))
  1499.          (#.*extents* (unless (or (eq newvalue *ptr-undefined*)
  1500.                       (eq newvalue *ptr-undefinable*)
  1501.                       (typep newvalue 'extents))
  1502.                 (error "~S must be an extents struct!" newvalue)))
  1503.          (#.*pointer*)
  1504.          )
  1505.          (setf (fdescr-value fdescr) newvalue)))
  1506.       (let ((field-name (first more-path))
  1507.         (fdescr (handle-fdescr handle)))
  1508.        (unless (null (rest more-path))
  1509.          (error "~S is not a legitimate path !" path))
  1510.        (cond ((string= field-name "F_DOCUMENTATION")
  1511.           (setf (fdescr-docstring fdescr) (string newvalue)))
  1512.          ((string= field-name "F_IF-NEEDED")
  1513.           (unless (and (listp newvalue)
  1514.                    (every #'symfunctp newvalue))
  1515.             (error "~S is not a list of functions !" newvalue))
  1516.           (setf (fdescr-if-needed fdescr) newvalue))
  1517.          ((string= field-name "F_IF-GETTING")
  1518.           (unless (and (listp newvalue)
  1519.                    (every #'symfunctp newvalue))
  1520.             (error "~S is not a list of functions !" newvalue))
  1521.           (setf (fdescr-if-getting fdescr) newvalue))
  1522.          ((string= field-name "F_IF-SETTING")
  1523.           (unless (and (listp newvalue)
  1524.                    (every #'symfunctp newvalue))
  1525.             (error "~S is not a list of functions !" newvalue))
  1526.           (setf (fdescr-if-setting fdescr) newvalue))
  1527.          (t (error "~S is not a legitimate path !" path)))
  1528.        )
  1529.       )
  1530.   )
  1531.  
  1532. (defun %setf-token-feature-value (handle more-path newvalue &aux token-index)
  1533.   "Function to set a token feature value."
  1534.   (declare (special path))
  1535.   (setf token-index (handle-token handle))
  1536.   (if (null more-path)
  1537.       (progn
  1538.     (unless (integerp token-index)
  1539.       (error "~S is not a legitimate path !" path))
  1540.     (unless (= (vvref (frame-token-set-existence-vector (handle-frame handle))
  1541.               token-index)
  1542.            1)
  1543.       (error "~S is not a legitimate path !" path))
  1544.     (let* ((fdescr (handle-fdescr handle))
  1545.            (orig-value (vvref (fdescr-value fdescr) token-index))
  1546.            (if-setting (fdescr-if-setting fdescr))
  1547.            (frame-handle (progn
  1548.                  (setf (handle-type *value-frame-handle*) :frame
  1549.                    (handle-frame *value-frame-handle*)
  1550.                    (handle-frame handle))
  1551.                  *value-frame-handle*))
  1552.            (*set-value-flag* t)
  1553.            (token-handle (progn
  1554.                  (setf (handle-type *value-token-handle*) :token
  1555.                    (handle-frame *value-token-handle*)
  1556.                    (handle-frame handle)
  1557.                    (handle-token *value-token-handle*)
  1558.                    (handle-token handle))
  1559.                  *value-token-handle*))
  1560.            )
  1561.           (declare (special *set-value-flag*))
  1562.           (when (equalp orig-value (case (fdescr-type fdescr)
  1563.                          ((#.*int* #.*boolean*) *int-undefinable*)
  1564.                          (#.*real* *real-undefinable*)
  1565.                          (t *ptr-undefinable*)))
  1566.         (setf orig-value :undefined))
  1567.           (when (equalp orig-value (case (fdescr-type fdescr)
  1568.                          ((#.*int* #.*boolean*) *int-undefined*)
  1569.                          (#.*real* *real-undefined*)
  1570.                          (t *ptr-undefined*)))
  1571.         (setf orig-value :uncalculated))
  1572.           (dolist (if-setting-fun if-setting)
  1573.               (DEBUGGING "~&***In %setf-token-feature-value: about to call setting function")
  1574.               (DEBUG-DESCRIBE if-setting-fun)
  1575.               (setf newvalue
  1576.                 (funcall if-setting-fun 
  1577.                      orig-value newvalue
  1578.                      (fdescr-featurename fdescr)
  1579.                      frame-handle token-handle))
  1580.               (DEBUGGING "~%---Old value: ~S, New Value: ~S" orig-value newvalue)
  1581.               )
  1582.           (when *set-value-flag*
  1583.         (when (eq newvalue :uncalculated)
  1584.           (setf newvalue
  1585.             (case (fdescr-type fdescr)
  1586.                   (#.*int* *int-undefined*)
  1587.                   (#.*real* *real-undefined*)
  1588.                   (t *ptr-undefined*))))
  1589.         (when (eq newvalue :undefined)
  1590.           (setf newvalue
  1591.             (case (fdescr-type fdescr)
  1592.                   (#.*int* *int-undefinable*)
  1593.                   (#.*real* *real-undefinable*)
  1594.                   (t *ptr-undefinable*))))
  1595.            (case (fdescr-type fdescr)
  1596.              (#.*int* (unless (typep newvalue 'integer)
  1597.                 (error "~S must be an integer!" newvalue)))
  1598.              (#.*real* (unless (typep newvalue 'single-float)
  1599.                  (error "~S must be a single float!" newvalue)))
  1600.              (#.*string* (unless (or (eq newvalue *ptr-undefined*)
  1601.                          (eq newvalue *ptr-undefinable*)
  1602.                          (typep newvalue 'string))
  1603.                    (error "~S must be a string!" newvalue)))
  1604.              (#.*array* (unless (or (eq newvalue *ptr-undefined*)
  1605.                         (eq newvalue *ptr-undefinable*)
  1606.                         (typep newvalue 'array))
  1607.                   (error "~S must be an array!" newvalue)))
  1608.              (#.*handle* (unless (or (eq newvalue *ptr-undefined*)
  1609.                          (eq newvalue *ptr-undefinable*)
  1610.                          (typep newvalue 'handle))
  1611.                    (error "~S must be a handle!" newvalue)))
  1612.              (#.*BOOLEAN* (unless (typep newvalue 'bit)
  1613.                     (error "~S must be a bit!" newvalue)))
  1614.              (#.*bitplane* (unless (or (eq newvalue *ptr-undefined*)
  1615.                            (eq newvalue *ptr-undefinable*)
  1616.                            (typep newvalue '(array bit (* *))))
  1617.                      (error "~S must be a bitplane!" newvalue)))
  1618.              (#.*extents* (unless (or (eq newvalue *ptr-undefined*)
  1619.                           (eq newvalue *ptr-undefinable*)
  1620.                           (typep newvalue 'extents))
  1621.                     (error "~S must be an extents struct!" newvalue)))
  1622.              (#.*pointer*)
  1623.              )
  1624.            (setf (vvref (fdescr-value fdescr) token-index)
  1625.              newvalue))
  1626.        (cond ((eq newvalue *ptr-undefined*) :uncalculated)
  1627.          ((eq newvalue *ptr-undefinable*) :undefined)
  1628.          (t newvalue))))
  1629.       (let ((field-name (first more-path))
  1630.         (fdescr (handle-fdescr handle)))
  1631.        (unless (null (rest more-path))
  1632.          (error "~S is not a legitimate path !" path))
  1633.        (cond ((string= field-name "F_DOCUMENTATION")
  1634.           (setf (fdescr-docstring fdescr) (string newvalue)))
  1635.          ((string= field-name "F_IF-NEEDED")
  1636.           (unless (and (listp newvalue)
  1637.                    (list-length newvalue)
  1638.                    (every #'symfunctp newvalue))
  1639.             (error "~S is not a list of functions !" newvalue))
  1640.           (setf (fdescr-if-needed fdescr) (copy-list newvalue)))
  1641.          ((string= field-name "F_IF-GETTING")
  1642.           (unless (and (listp newvalue)
  1643.                    (list-length newvalue)
  1644.                    (every #'symfunctp newvalue))
  1645.             (error "~S is not a list of functions !" newvalue))
  1646.           (setf (fdescr-if-getting fdescr) (copy-list newvalue)))
  1647.          ((string= field-name "F_IF-SETTING")
  1648.           (unless (and (listp newvalue)
  1649.                    (list-length newvalue)
  1650.                    (every #'symfunctp newvalue))
  1651.             (error "~S is not a list of functions !" newvalue))
  1652.           (setf (fdescr-if-setting fdescr) (copy-list newvalue)))
  1653.          (t (error "~S is not a legitimate path !" path)))
  1654.        )
  1655.       )
  1656.   )
  1657.  
  1658. (defun destroy (path &aux parsed-path handle more-path)
  1659.   "DESTROY path -
  1660. Destroys (deletes) an existing token or frame (tail of path says which).  If a frame, then
  1661. everything below it in the tree is destroyed."
  1662.   (setf parsed-path (parse-token-name path))
  1663.   (multiple-value-setq (handle more-path)
  1664.     (make-handle-from-parsed-path parsed-path))
  1665.   (unless (and handle
  1666.            (check-terminal-path handle more-path))
  1667.     (error "~S is not a legitimate path!" path))
  1668.   (unless (null more-path)
  1669.     (error "~S does not exist!" path))
  1670.   (ecase (handle-type handle)
  1671.      (:frame (destroy-frame handle (parent handle)))
  1672.      (:token (destroy-token handle))
  1673.      (:frame-feature (destroy-frame-feature handle))
  1674.      (:token-feature (destroy-token-feature handle))
  1675.      )
  1676.   )
  1677.  
  1678. (defun destroy-frame (frame frame-parent)
  1679.   "Helper function - destroy a frame."
  1680.   (when (null frame-parent)
  1681.     (clear-system)
  1682.     (return-from destroy-frame frame))
  1683.   (destroy-frame1 frame)
  1684.   (let ((fdescr-handle (copy-handle frame-parent)))
  1685.        (setf (handle-type fdescr-handle) (if (eq (handle-type frame-parent) :token)
  1686.                          :token-feature
  1687.                          :frame-feature)
  1688.          (handle-feature fdescr-handle) (frame-name (handle-frame frame))
  1689.          (handle-fdescr fdescr-handle)
  1690.          (cond ((eq (handle-type frame-parent) :token)
  1691.             (first (member (frame-name (handle-frame frame))
  1692.                    (frame-token-set-feature-vector
  1693.                      (handle-frame frame-parent))
  1694.                    :test #'equalp
  1695.                    :key #'fdescr-featurename)))
  1696.            (t (cdr (assoc (frame-name (handle-frame frame))
  1697.                   (frame-feature-alist 
  1698.                     (handle-frame frame-parent))
  1699.                   :test #'equalp))))
  1700.          )
  1701.        (if (eq (handle-type frame-parent) :token)
  1702.        (setf (vvref (fdescr-value (handle-fdescr fdescr-handle))
  1703.             (handle-token frame-parent))
  1704.          *ptr-undefined*)
  1705.        (setf (fdescr-value (handle-fdescr fdescr-handle))
  1706.          *ptr-undefined*))
  1707.        fdescr-handle)
  1708.   )
  1709.  
  1710. (defun destroy-frame1 (frame)
  1711.   "Helper function - destroy a frame's contents."
  1712.   (map nil #'(lambda (feature-value-pair &aux fdescr fvalue)
  1713.              (setf fdescr (rest feature-value-pair)
  1714.                fvalue (fdescr-value fdescr))
  1715.              (when (and
  1716.                  (= (fdescr-type fdescr)
  1717.                 *handle*)
  1718.                  (handle-p fvalue)
  1719.                  (eq (handle-type fvalue) :frame)
  1720.                  (equalp (parent fvalue) frame)
  1721.                  )
  1722.                (destroy-frame1 fvalue)))
  1723.        (frame-feature-alist (handle-frame frame)))
  1724.   (map nil
  1725.        #'(lambda (fdescr &aux (fvalue-vec (fdescr-value fdescr)))
  1726.         (do-active-tokens (tokenindex (frame-token-set-existence-vector
  1727.                         (handle-frame frame)))
  1728.         (let ((token-value-handle (vvref fvalue-vec
  1729.                          tokenindex)))
  1730.              (when (and (handle-p token-value-handle)
  1731.                 (eq (handle-type token-value-handle) :frame)
  1732.                 (equalp (parent token-value-handle) frame))
  1733.                (destroy-frame1 token-value-handle))
  1734.              ))
  1735.         (with-lock ((2index-vector-vector-lock fvalue-vec))
  1736.            (let ((dv (2index-vector-vector-data fvalue-vec))
  1737.              temp)
  1738.             (dotimes (i (fill-pointer dv))
  1739.                  (setf temp (aref dv i))
  1740.                  (when temp
  1741.                    (deallocate-resource (type-of temp) temp)))))
  1742.         )
  1743.        (frame-token-set-feature-vector (handle-frame frame)))
  1744.   (let ((evv (frame-token-set-existence-vector (handle-frame frame))))
  1745.        (with-lock ((2index-vector-vector-lock evv))
  1746.       (let ((ev (2index-vector-vector-data evv))
  1747.         temp)
  1748.            (dotimes (i (fill-pointer ev))
  1749.             (setf temp (aref ev i))
  1750.             (when temp
  1751.               (deallocate-resource (type-of temp) temp))))))
  1752.   frame)
  1753.  
  1754. (defun destroy-token (token)
  1755.   "Helper function - destroy a token."
  1756.   (unless (integerp (handle-token token))
  1757.     (error "Ambiguous token index not allowed in DESTROY: ~S" token))
  1758.   (let ((token-index (handle-token token))
  1759.     (frame       (handle-frame token))
  1760.     )
  1761.        (setf (vvref (frame-token-set-existence-vector frame) token-index) 0)
  1762.        (setf (vvref (frame-token-set-globalp-vector frame) token-index) 0)
  1763.        (check-and-destroy-empty-block (frame-token-set-existence-vector frame)
  1764.                       token-index
  1765.                       )
  1766.        (check-and-destroy-empty-block (frame-token-set-globalp-vector frame)
  1767.                       token-index
  1768.                       )
  1769.        (map nil
  1770.         #'(lambda (fdescr &aux (fvalue-vec (fdescr-value fdescr)))
  1771.               (setf (vvref fvalue-vec token-index)
  1772.                 (2index-vector-vector-undefined-value fvalue-vec))
  1773.               (check-and-destroy-empty-block fvalue-vec token-index)
  1774.               )
  1775.         (frame-token-set-feature-vector frame))
  1776.        (list (make-handle :type :frame
  1777.               :frame frame)
  1778.          token-index)
  1779.        )
  1780.   )
  1781.  
  1782. (defun check-and-destroy-empty-block (vvec index)
  1783.   "Helper function - check for an empty/unused vector block in vvec.  An
  1784. \"empty/unused\" block is defined as one having all its elements set to the
  1785. undefined (uncalculated) value.  The block checked is the one that INDEX 
  1786. falls in.  If the block is empty, it is released via deallocate-resource."
  1787.   (with-lock ((2index-vector-vector-lock vvec))
  1788.     (let* ((ov (truncate index *default-2index-vector-size*))
  1789.            (outer-vec (2index-vector-vector-data vvec))
  1790.            (undefined (2index-vector-vector-undefined-value vvec))
  1791.            (ov-size (fill-pointer outer-vec))
  1792.            (inner-vec (if (< ov ov-size) (aref outer-vec ov)))
  1793.            )
  1794.           (when (and inner-vec
  1795.              (every
  1796.                #'(lambda (elt) (equalp elt undefined))
  1797.                (2index-vector-data-vector inner-vec)))
  1798.         (deallocate-resource (type-of inner-vec) inner-vec)
  1799.         (setf (aref outer-vec ov) nil)
  1800.         (when (= ov (1- ov-size))
  1801.           (do ()
  1802.               ((or (zerop (fill-pointer outer-vec))
  1803.                (not (null (aref outer-vec
  1804.                         (1- (fill-pointer outer-vec)))))))
  1805.               (decf (fill-pointer outer-vec)))))
  1806.           )
  1807.     )
  1808.   )
  1809.  
  1810. (defun destroy-frame-feature (handle &aux (frame (handle-frame handle))
  1811.                      (feature-name (handle-feature handle)))
  1812.   "Helper function - destroy a frame feature."
  1813.   (setf (frame-feature-alist frame)
  1814.     (delete feature-name
  1815.         (frame-feature-alist frame)
  1816.         :test #'string=
  1817.         :key #'car))
  1818.   (list (make-handle :type :frame :frame frame)
  1819.     feature-name)
  1820.   )
  1821.  
  1822. (defun destroy-token-feature (handle &aux (frame (handle-frame handle))
  1823.                      (feature-name (handle-feature handle))
  1824.                      (fvalue-vec (fdescr-value
  1825.                            (handle-fdescr handle))))
  1826.   "Helper function - destroy a token feature."
  1827.   (setf (frame-token-set-feature-vector frame)
  1828.     (delete feature-name
  1829.         (frame-token-set-feature-vector frame)
  1830.         :test #'string=
  1831.         :key #'fdescr-featurename))
  1832.   (with-lock ((2index-vector-vector-lock fvalue-vec))
  1833.        (let ((dv (2index-vector-vector-data fvalue-vec))
  1834.          temp)
  1835.         (dotimes (i (fill-pointer dv))
  1836.              (setf temp (aref dv i))
  1837.              (when temp
  1838.                (deallocate-resource (type-of temp) temp)))))
  1839.   (list (make-handle :type :token :frame frame
  1840.              :token (handle-token handle))
  1841.     feature-name)
  1842.   )
  1843.  
  1844. (defun copy-definition (source-path destination-path &optional (clobber-p nil)
  1845.             &aux source-parsed-path source-handle source-more-path
  1846.                  dest-parsed-path dest-handle dest-more-path)
  1847.   "COPY-DEFINITION source-path destination-path &OPTIONAL (clobber-p NIL) -
  1848. Copies the definitions in source-path to destination-path.  If clobber-p is 
  1849. non-NIL the destination-path will be destroyed first if it already exists."
  1850.   (setf source-parsed-path (parse-token-name source-path))
  1851.   (multiple-value-setq (source-handle source-more-path)
  1852.     (make-handle-from-parsed-path source-parsed-path))
  1853.   (unless (and source-handle
  1854.            (check-terminal-path source-handle source-more-path))
  1855.     (error "~S is not a legitimate path!" source-path))
  1856.   (unless (null source-more-path)
  1857.     (error "~S does not exist!" source-path))
  1858.   (setf dest-parsed-path (parse-token-name destination-path))
  1859.   (multiple-value-setq (dest-handle dest-more-path)
  1860.     (make-handle-from-parsed-path dest-parsed-path))
  1861.   (unless (and dest-handle
  1862.            (check-terminal-path dest-handle dest-more-path))
  1863.     (error "~S is not a legitimate path!" destination-path))
  1864.   (cond ((and (eq (handle-type source-handle) :frame)
  1865.           (member (handle-type dest-handle) '(:frame :token :frame-feature 
  1866.                           :token-feature)))
  1867.      (when (member (handle-type dest-handle) '(:token :token-feature))
  1868.        (unless (integerp (handle-token dest-handle))
  1869.          (error "Cannot copy a frame definition to an ambigous token: ~S to ~S" source-path
  1870.             destination-path)))
  1871.      (when (and (eq (handle-type dest-handle) :token)
  1872.             (null dest-more-path))
  1873.        (error "Cannot copy a frame definition to a token: ~S to ~S" source-path 
  1874.           destination-path))
  1875.      (when (and (eq (handle-type dest-handle) :frame)
  1876.             (null dest-more-path))
  1877.        (if clobber-p
  1878.            (progn (setf dest-parsed-path (destroy dest-handle))
  1879.               (multiple-value-setq (dest-handle dest-more-path)
  1880.             (make-handle-from-parsed-path dest-parsed-path)))
  1881.            (error "Frame already exists: ~S !" destination-path)))
  1882.      (setf dest-handle
  1883.            (create (cons dest-handle dest-more-path)
  1884.                :frame-features (mapcar
  1885.                      #'(lambda (ffpair
  1886.                              &aux (ffdescr (rest ffpair)))
  1887.                            `(,(first ffpair)
  1888.                               ,(fdescr-docstring ffdescr)
  1889.                               ,(keyword-from-dt
  1890.                              (fdescr-type ffdescr))))
  1891.                      (frame-feature-alist
  1892.                        (handle-frame source-handle)))
  1893.                :token-features (mapcar
  1894.                      #'(lambda (fdescr)
  1895.                            `(,(fdescr-featurename fdescr)
  1896.                               ,(fdescr-docstring fdescr)
  1897.                               ,(keyword-from-dt
  1898.                              (fdescr-type fdescr))
  1899.                               :if-needed
  1900.                               ,(fdescr-if-needed fdescr)
  1901.                               :if-getting
  1902.                               ,(fdescr-if-getting fdescr)
  1903.                               :if-setting
  1904.                               ,(fdescr-if-setting fdescr)))
  1905.                      (frame-token-set-feature-vector
  1906.                        (handle-frame 
  1907.                          source-handle)))
  1908.                ))
  1909.      (setf (frame-documentation
  1910.          (handle-frame dest-handle))
  1911.            (frame-documentation
  1912.          (handle-frame source-handle)))
  1913.      dest-handle)
  1914.     ((and (eq (handle-type source-handle) :token)
  1915.           (eq (handle-type dest-handle)   :frame)
  1916.           (null dest-more-path))
  1917.      (let ((dummy-handle (make-handle :type :token
  1918.                       :frame (handle-frame dest-handle)
  1919.                       :token :?)))
  1920.           (map nil
  1921.            #'(lambda (fdescr)
  1922.                  (define-feature (list dummy-handle
  1923.                            (fdescr-featurename fdescr))
  1924.                          (fdescr-docstring fdescr)
  1925.                          (keyword-from-dt (fdescr-type fdescr))
  1926.                          :if-needed
  1927.                          (fdescr-if-needed fdescr)
  1928.                          :if-getting
  1929.                          (fdescr-if-getting fdescr)
  1930.                          :if-setting
  1931.                          (fdescr-if-setting fdescr)))
  1932.            (frame-token-set-feature-vector
  1933.              (handle-frame source-handle)))
  1934.           )
  1935.      dest-handle)
  1936.     (t (error "~S is not a valid object for COPY-DEFINITION" source-path))
  1937.     )
  1938.   )
  1939.           
  1940.   
  1941. (defun move (source-path destination-path &optional (clobber-p nil)
  1942.          &aux source-parsed-path source-handle source-more-path
  1943.           dest-parsed-path dest-handle dest-more-path)
  1944.   "MOVE source-path destination-path &OPTIONAL (clobber-p nil) -
  1945. Moves the source frame or tokensequence to the destination path.  The source must
  1946. specify either a frame or a tokensequence(?) and the destination a frame.  If the
  1947. destination already exists and clobber-p is non-nil, it will be destroyed (or 
  1948. cleared), before the move."
  1949.   (setf source-parsed-path (parse-token-name source-path))
  1950.   (multiple-value-setq (source-handle source-more-path)
  1951.     (make-handle-from-parsed-path source-parsed-path))
  1952.   (unless (and source-handle
  1953.            (check-terminal-path source-handle source-more-path))
  1954.     (error "~S is not a legitimate path!" source-path))
  1955.   (unless (null source-more-path)
  1956.     (error "~S does not exist!" source-path))
  1957.   (setf dest-parsed-path (parse-token-name destination-path))
  1958.   (multiple-value-setq (dest-handle dest-more-path)
  1959.     (make-handle-from-parsed-path dest-parsed-path))
  1960.   (unless (and dest-handle
  1961.            (check-terminal-path dest-handle dest-more-path))
  1962.     (error "~S is not a legitimate path!" destination-path))
  1963.   (cond ((and (eq (handle-type source-handle) :frame)
  1964.           (member (handle-type dest-handle) '(:frame :token :frame-feature 
  1965.                           :token-feature)))
  1966.      (when (member (handle-type dest-handle) '(:token :token-feature))
  1967.        (unless (integerp (handle-token dest-handle))
  1968.          (error "Cannot move a frame to an ambigous token: ~S to ~S" source-path
  1969.             destination-path)))
  1970.      (when (and (eq (handle-type dest-handle) :token)
  1971.             (null dest-more-path))
  1972.        (error "Cannot move a frame to a token: ~S to ~S" source-path 
  1973.           destination-path))
  1974.      (when (and (eq (handle-type dest-handle) :frame)
  1975.             (null dest-more-path))
  1976.        (if clobber-p
  1977.            (progn (setf dest-parsed-path (destroy dest-handle))
  1978.               (multiple-value-setq (dest-handle dest-more-path)
  1979.             (make-handle-from-parsed-path dest-parsed-path)))
  1980.            (error "Frame already exists: ~S !" destination-path)))
  1981.      (setf dest-handle
  1982.            (create (cons dest-handle dest-more-path)
  1983.                :frame-features (mapcar
  1984.                      #'(lambda (ffpair
  1985.                              &aux (ffdescr (rest ffpair)))
  1986.                            `(,(first ffpair)
  1987.                               ,(fdescr-docstring ffdescr)
  1988.                               ,(keyword-from-dt
  1989.                               (fdescr-type ffdescr))
  1990.                               ))
  1991.                      (frame-feature-alist
  1992.                        (handle-frame source-handle)))
  1993.                :token-features (mapcar
  1994.                      #'(lambda (fdescr)
  1995.                            `(,(fdescr-featurename fdescr)
  1996.                               ,(fdescr-docstring fdescr)
  1997.                               ,(keyword-from-dt
  1998.                              (fdescr-type fdescr))
  1999.                               :if-needed
  2000.                               ,(fdescr-if-needed fdescr)
  2001.                               :if-getting
  2002.                               ,(fdescr-if-getting fdescr)
  2003.                               :if-setting
  2004.                               ,(fdescr-if-setting fdescr)))
  2005.                      (frame-token-set-feature-vector
  2006.                        (handle-frame 
  2007.                          source-handle)))
  2008.                ))
  2009.      (setf (frame-documentation
  2010.          (handle-frame dest-handle))
  2011.            (frame-documentation
  2012.          (handle-frame source-handle))
  2013.            (frame-source-file-list
  2014.          (handle-frame dest-handle))
  2015.            (frame-source-file-list
  2016.          (handle-frame source-handle))
  2017.            )
  2018.      (map nil
  2019.           #'(lambda (ffpair &aux (ffdescr (rest ffpair)) value)
  2020.            (setf value (fdescr-value ffdescr))
  2021.            (cond ((equalp value (case (fdescr-type ffdescr)
  2022.                           ((#.*int* #.*boolean*) *int-undefined*)
  2023.                           (#.*real* *real-undefined*)
  2024.                           (t *ptr-undefined*)))
  2025.               (setf value :uncalculated))
  2026.              ((equalp value (case (fdescr-type ffdescr)
  2027.                           ((#.*int* #.*boolean*) *int-undefinable*)
  2028.                           (#.*real* *real-undefinable*)
  2029.                           (t *ptr-undefinable*)))
  2030.               (setf value :undefined))
  2031.              )
  2032.            (unless (eq value :uncalculated)
  2033.              (setf (value (list dest-handle (first ffpair))) value)))
  2034.           (frame-feature-alist
  2035.         (handle-frame source-handle)))
  2036.      (do-active-tokens (token-index (frame-token-set-existence-vector
  2037.                       (handle-frame source-handle)))
  2038.          (create (list dest-handle token-index)
  2039.              :token-init-list
  2040.              (mapcan
  2041.                #'(lambda (fdescr &aux value)
  2042.                 (setf value (vvref (fdescr-value fdescr) token-index))
  2043.                 (cond ((equalp value (case (fdescr-type fdescr)
  2044.                                ((#.*int* #.*boolean*) 
  2045.                             *int-undefined*)
  2046.                                (#.*real* *real-undefined*)
  2047.                                (t *ptr-undefined*)))
  2048.                    (setf value :uncalculated))
  2049.                   ((equalp value (case (fdescr-type fdescr)
  2050.                                ((#.*int* #.*boolean*) 
  2051.                             *int-undefinable*)
  2052.                                (#.*real* *real-undefinable*)
  2053.                                (t *ptr-undefinable*)))
  2054.                    (setf value :undefined))
  2055.                   )
  2056.                 (unless (eq value :uncalculated)
  2057.                   (list
  2058.                 (list (fdescr-featurename fdescr)
  2059.                       value))))
  2060.                (frame-token-set-feature-vector (handle-frame 
  2061.                              source-handle)))))
  2062.      (destroy source-handle)
  2063.      dest-handle)
  2064.     ((and (eq (handle-type source-handle) :token)
  2065.           (eq (handle-type dest-handle) :frame))
  2066.      (if (null dest-more-path)
  2067.          (progn
  2068.            (when (not (zerop (active-token-count (handle-frame dest-handle))))
  2069.          (if clobber-p
  2070.              (do-active-tokens (token-index (frame-token-set-existence-vector
  2071.                               (handle-frame dest-handle)))
  2072.                        (destroy (list dest-handle token-index)))
  2073.              (error "Frame token set not empty: ~S !" destination-path))
  2074.          )
  2075.            (copy-definition source-handle dest-handle))
  2076.          (setf dest-handle
  2077.            (create (cons dest-handle dest-more-path)
  2078.                :token-features (mapcar
  2079.                      #'(lambda (fdescr)
  2080.                            `(,(fdescr-featurename fdescr)
  2081.                               ,(fdescr-docstring fdescr)
  2082.                               ,(keyword-from-dt
  2083.                              (fdescr-type fdescr))
  2084.                               :if-needed
  2085.                               ,(fdescr-if-needed fdescr)
  2086.                               :if-getting
  2087.                               ,(fdescr-if-getting fdescr)
  2088.                               :if-setting
  2089.                               ,(fdescr-if-setting fdescr)))
  2090.                      (frame-token-set-feature-vector
  2091.                        (handle-frame 
  2092.                          source-handle)))
  2093.                )
  2094.            (frame-documentation
  2095.          (handle-frame dest-handle))
  2096.            (frame-documentation
  2097.          (handle-frame source-handle))
  2098.            (frame-source-file-list
  2099.          (handle-frame dest-handle))
  2100.            (frame-source-file-list
  2101.          (handle-frame source-handle))
  2102.            )
  2103.          )
  2104.      (let ((dummy-handle (copy-handle source-handle)))
  2105.           (do-active-tokens (token-index (frame-token-set-existence-vector
  2106.                            (handle-frame source-handle)))
  2107.          (create (list dest-handle token-index)
  2108.              :token-init-list
  2109.              (mapcan
  2110.                #'(lambda (fdescr &aux value)
  2111.                 (setf value (vvref (fdescr-value fdescr) token-index))
  2112.                 (cond ((equalp value (case (fdescr-type fdescr)
  2113.                                ((#.*int* #.*boolean*) 
  2114.                             *int-undefined*)
  2115.                                (#.*real* *real-undefined*)
  2116.                                (t *ptr-undefined*)))
  2117.                    (setf value :uncalculated))
  2118.                   ((equalp value (case (fdescr-type fdescr)
  2119.                                ((#.*int* #.*boolean*) 
  2120.                             *int-undefinable*)
  2121.                                (#.*real* *real-undefinable*)
  2122.                                (t *ptr-undefinable*)))
  2123.                    (setf value :undefined))
  2124.                   )
  2125.                 (unless (eq value :uncalculated)
  2126.                   (list
  2127.                 (list (fdescr-featurename fdescr)
  2128.                       value))))
  2129.                (frame-token-set-feature-vector (handle-frame 
  2130.                              source-handle))))
  2131.          (setf (handle-token dummy-handle) token-index)
  2132.          (destroy dummy-handle)))
  2133.      dest-handle)
  2134.     (t (error "~S is not a valid object for MOVE" source-path))
  2135.     )
  2136.   )
  2137.  
  2138. (defun rename (source-path newname &aux source-parsed-path source-handle
  2139.            source-more-path parent-frame)
  2140.   "RENAME source-path newname -
  2141. Rename the last element in source path to newname"
  2142.   (setf source-parsed-path (parse-token-name source-path))
  2143.   (multiple-value-setq (source-handle source-more-path)
  2144.     (make-handle-from-parsed-path source-parsed-path))
  2145.   (unless (and source-handle
  2146.            (check-terminal-path source-handle source-more-path))
  2147.     (error "~S is not a legitimate path!" source-path))
  2148.   (unless (null source-more-path)
  2149.     (error "~S does not exist!" source-path))
  2150.   (when (find #\$ (string newname))
  2151.     (error "Newname is the name of a frame, not a path. Therefore ~S should not have a dollar sign" newname))
  2152.   (setf parent-frame (parent source-handle))
  2153.   (unless (or (stringp newname) (symbolp newname))
  2154.     (error "Argument must be a string or a symbol: ~S !" newname))
  2155.   (setf newname (string-upcase newname))
  2156.   (ecase (handle-type source-handle)
  2157.      ((:token :token-subset :token-sort)
  2158.       (error "Tokens, TSS, and Sorts cannot be renamed: ~S !" source-path))
  2159.      (:frame (rename-frame parent-frame source-handle newname))
  2160.      (:token-feature (rename-token-feature source-handle newname))
  2161.      (:frame-feature (rename-frame-feature source-handle newname))
  2162.      )
  2163.   )
  2164.  
  2165. (defun rename-frame (parent-handle frame-handle newname)
  2166.   (if (eq (handle-type parent-handle) :token)
  2167.       (let* ((parent-frame (handle-frame parent-handle))
  2168.          (frame (handle-frame frame-handle))
  2169.          (parent-token-features (frame-token-set-feature-vector parent-frame))
  2170.          (parent-newname-feature (first (member newname parent-token-features
  2171.                             :test #'equalp
  2172.                             :key #'fdescr-featurename)))
  2173.          (parent-oldname-feature (first (member (frame-name frame)
  2174.                             parent-token-features
  2175.                             :test #'equalp
  2176.                             :key #'fdescr-featurename)))
  2177.          (oldname (frame-name frame))
  2178.          )
  2179.         (when parent-newname-feature
  2180.           (error "Cannot rename frame - frame already exists: ~S"
  2181.              (list parent-handle newname)))
  2182.         (setf (fdescr-featurename parent-oldname-feature) newname)
  2183.         (setf (frame-name frame) newname)
  2184.         (setf (first (last (frame-path-list frame))) newname)
  2185.         (fixup-child-frame-path-lists frame (1- (length (frame-path-list frame)))
  2186.                       oldname newname)
  2187.         frame-handle)
  2188.       (let* ((parent-frame (handle-frame parent-handle))
  2189.          (frame (handle-frame frame-handle))
  2190.          (parent-frame-features (frame-feature-alist parent-frame))
  2191.          (parent-newname-feature (assoc newname parent-frame-features
  2192.                         :test #'equalp))
  2193.          (parent-oldname-feature (assoc (frame-name frame) parent-frame-features
  2194.                         :test #'equalp))
  2195.          (oldname (frame-name frame))
  2196.          )
  2197.         (when parent-newname-feature
  2198.           (error "Cannot rename frame - frame already exists: ~S"
  2199.              (list parent-handle newname)))
  2200.         (setf (first parent-oldname-feature) newname)
  2201.         (setf (fdescr-featurename (rest parent-oldname-feature)) newname)
  2202.         (setf (frame-name frame) newname)
  2203.         (setf (first (last (frame-path-list frame))) newname)
  2204.         (fixup-child-frame-path-lists frame (1- (length (frame-path-list frame)))
  2205.                       oldname newname)
  2206.         frame-handle)
  2207.       )
  2208.   )
  2209.  
  2210. (defun fixup-child-frame-path-lists (frame depth oldname newname)
  2211.  
  2212.   (map nil #'(lambda (ffeat &aux (ffdescr (rest ffeat)) sub-frame-handle 
  2213.                 sub-frame pathlist pathp)
  2214.         (when (and (= (fdescr-type ffdescr) *handle*)
  2215.                (handle-p (setf sub-frame-handle (fdescr-value ffdescr)))
  2216.                (eq (handle-type sub-frame-handle) :frame)
  2217.                (progn (setf sub-frame (handle-frame sub-frame-handle))
  2218.                   (eq (handle-frame (frame-parent sub-frame))
  2219.                       frame)))
  2220.           (setf pathlist (frame-path-list sub-frame)
  2221.             pathp    (nthcdr depth pathlist))
  2222.           (when (equalp (first pathp) oldname)
  2223.             (setf (first pathp) newname)
  2224.             (fixup-child-frame-path-lists sub-frame depth oldname newname)
  2225.             )))
  2226.        (frame-feature-alist frame))
  2227.   (map nil #'(lambda (tfdescr &aux (vvec (fdescr-value tfdescr))
  2228.                   sub-frame-handle sub-frame pathlist pathp)
  2229.         (when (= (fdescr-type tfdescr) *handle*)
  2230.           (do-active-tokens (tindex (frame-token-set-existence-vector frame))
  2231.              (when (and (handle-p (setf sub-frame-handle
  2232.                            (vvref vvec tindex)))
  2233.                 (eq (handle-type sub-frame-handle) :frame)
  2234.                 (progn (setf sub-frame (handle-frame sub-frame-handle))
  2235.                        (and (eq (handle-frame (frame-parent sub-frame))
  2236.                         frame)
  2237.                         (eq (handle-token (frame-parent sub-frame))
  2238.                         tindex))))
  2239.                (setf pathlist (frame-path-list sub-frame)
  2240.                  pathp    (nthcdr depth pathlist))
  2241.                (when (equalp (first pathp) oldname)
  2242.              (setf (first pathp) newname)
  2243.              (fixup-child-frame-path-lists sub-frame depth
  2244.                                oldname newname)
  2245.              )))
  2246.           ))
  2247.        (frame-token-set-feature-vector frame))
  2248.   t)
  2249.  
  2250. (defun rename-frame-feature (frame-feature-handle newname)
  2251.   (let* ((frame (handle-frame frame-feature-handle))
  2252.      (frame-features (frame-feature-alist frame))
  2253.      (newname-feature (assoc newname frame-features
  2254.                  :test #'equalp))
  2255.      (oldname-feature (assoc (handle-feature frame-feature-handle)
  2256.                  frame-features
  2257.                  :test #'equalp))
  2258.      )
  2259.     (when newname-feature
  2260.       (error "Cannot rename feature - feature already exists: ~S"
  2261.          (make-handle :type :frame-feature
  2262.                   :frame frame
  2263.                   :feature newname
  2264.                   :fdescr (rest newname-feature))))
  2265.     (setf (first oldname-feature) newname)
  2266.     (setf (fdescr-featurename (rest oldname-feature)) newname)
  2267.     (setf frame-feature-handle (copy-handle frame-feature-handle))
  2268.     (setf (handle-feature frame-feature-handle) newname)
  2269.     frame-feature-handle)
  2270.   )
  2271.  
  2272. (defun rename-token-feature (token-feature-handle newname)
  2273.   (let* ((frame (handle-frame token-feature-handle))
  2274.      (token-features (frame-token-set-feature-vector frame))
  2275.      (newname-feature (member newname token-features
  2276.                  :test #'equalp
  2277.                  :key #'fdescr-featurename))
  2278.      (oldname-feature (member (handle-feature token-feature-handle) 
  2279.                   token-features
  2280.                  :test #'equalp
  2281.                  :key #'fdescr-featurename))
  2282.      )
  2283.     (when newname-feature
  2284.       (error "Cannot rename feature - feature already  exists: ~S"
  2285.          (make-handle :type :token-feature
  2286.                   :frame frame
  2287.                   :feature newname
  2288.                   :fdescr (first newname-feature))))
  2289.     (setf (fdescr-featurename (first oldname-feature)) newname)
  2290.     (setf token-feature-handle (copy-handle token-feature-handle))
  2291.     (setf (handle-feature token-feature-handle) newname)
  2292.     token-feature-handle)
  2293.   )
  2294.  
  2295. (defun describe-isr-object (path &key (stream *standard-output*)
  2296.                 (verbose t) &aux parsed-path handle
  2297.                 more-parsed-path)
  2298.   "DESCRIBE-isr-object path &KEY (stream *standard-output*) (verbose t) -
  2299. Describe ISR object at the end of path. If stream is NIL, then no printing is
  2300. done.  Verbose controls how verbose the output is.  If non-NIL, the features in
  2301. a frame are listed, the values of a token's feature values are listed, and the value
  2302. of a frame feature handle is printed.  If verbose is NIL, this information is NOT
  2303. printed."
  2304.   (setf parsed-path (parse-token-name path))
  2305.   (multiple-value-setq (handle more-parsed-path)
  2306.     (make-handle-from-parsed-path parsed-path))
  2307.   (unless (and handle
  2308.            (null more-parsed-path))
  2309.     (error "~S is not a legitimate path!" path))
  2310.   (when stream
  2311.     (let ((frame (handle-frame handle)))
  2312.      (case (handle-type handle)
  2313.            (:frame
  2314.          (format stream "~2&It is an ISR Frame object ~S~%" handle)
  2315.          (format stream "~&Name: ~A~%" (frame-name frame))
  2316.          (format stream "~&Documentation: ~A~%" (frame-documentation frame))
  2317.          (format stream "~&Source files: ~S~%" (frame-source-file-list frame))
  2318.          (format stream "~&Tokens: ~D/~D~%" (active-token-count frame)
  2319.              (total-token-count frame))
  2320.          (format stream "~&~D Frame features, ~D Token features~%"
  2321.              (length (frame-feature-alist frame))
  2322.              (length (frame-token-set-feature-vector frame)))
  2323.          (when verbose
  2324.            (when (frame-feature-alist frame)
  2325.              (format stream
  2326.          "~&Frame features: ~{~<~%                ~1,80:; ~{~A : ~A~}~>~^,~}.~%"
  2327.                  (mapcar #'(lambda (ffpair)
  2328.                            (list (first ffpair)
  2329.                              (elt *type-names*
  2330.                               (fdescr-type (rest ffpair)))))
  2331.                      (frame-feature-alist frame))))
  2332.            (when (frame-token-set-feature-vector frame)
  2333.              (format stream
  2334.          "~&Token features: ~{~<~%                ~1,80:; ~{~A : ~A~}~>~^,~}.~%"
  2335.                  (mapcar #'(lambda (fdescr)
  2336.                            (list (fdescr-featurename fdescr)
  2337.                              (elt *type-names*
  2338.                               (fdescr-type fdescr))))
  2339.                      (frame-token-set-feature-vector frame))))
  2340.            )
  2341.          )
  2342.            (:token
  2343.          (format stream "~2&It is an ISR token object ~S~%" handle)
  2344.          (when verbose
  2345.            (map nil
  2346.             #'(lambda (fdescr)
  2347.                  (format 
  2348.                    stream
  2349.                    "~&  ~A = ~S~%"
  2350.                    (fdescr-featurename fdescr)
  2351.                    (if (equalp
  2352.                      (vvref (fdescr-value fdescr)
  2353.                         (handle-token handle))
  2354.                      (case (fdescr-type fdescr)
  2355.                        (#.*int* *int-undefined*)
  2356.                        (#.*real* *real-undefined*)
  2357.                        (t *ptr-undefined*)))
  2358.                    '**UNCALCULATED**
  2359.                    (if (equalp (vvref (fdescr-value fdescr)
  2360.                               (handle-token handle))
  2361.                            (case (fdescr-type fdescr)
  2362.                              (#.*int* *int-undefinable*)
  2363.                              (#.*real* *real-undefinable*)
  2364.                              (t *ptr-undefinable*))
  2365.                            )
  2366.                        '**UNDEFINED**
  2367.                        (vvref (fdescr-value fdescr)
  2368.                           (handle-token handle))))))
  2369.             (frame-token-set-feature-vector frame))
  2370.            )
  2371.          )
  2372.            ((:frame-feature :token-feature)
  2373.         (let ((fdescr (handle-fdescr handle)))
  2374.              (format stream "~2&It is an ISR ~A feature object ~S~%" 
  2375.                  (if (eq (handle-type handle) :frame-feature)
  2376.                  "Frame"
  2377.                  "Token")
  2378.                  handle)
  2379.              (format stream "~&Documentation: ~A~%"
  2380.                  (fdescr-docstring fdescr))
  2381.              (format stream "~&Data type: ~A~%"
  2382.                  (elt *type-names*
  2383.                   (fdescr-type fdescr)))
  2384.              (when (and verbose (eq (handle-type handle)
  2385.                         :frame-feature))
  2386.                (format stream "~&Value: ~S~%"
  2387.                    (if (equalp (fdescr-value fdescr)
  2388.                        (case (fdescr-type fdescr)
  2389.                          (#.*int* *int-undefined*)
  2390.                          (#.*real* *real-undefined*)
  2391.                          (t *ptr-undefined*)))
  2392.                    '**UNCALCULATED**
  2393.                    (if (equalp (fdescr-value fdescr)
  2394.                            (case (fdescr-type fdescr)
  2395.                              (#.*int* *int-undefinable*)
  2396.                              (#.*real* *real-undefinable*)
  2397.                              (t *ptr-undefinable*))
  2398.                            )
  2399.                        '**UNDEFINED**
  2400.                        (fdescr-value fdescr)))))
  2401.              ))
  2402.            (:token-subset
  2403.          (format stream "~2&It is an ISR TokenSubSequence object ~S~%" handle)
  2404.          (let ((2vv (handle-token-existence-array handle)))
  2405.               (format stream "~&It contains ~D tokens~%" 
  2406.                   (if (typep 2vv '2index-vector-vector)
  2407.                   (active-token-count-2vv 2vv)
  2408.                   (length 2vv)))
  2409.               ))
  2410.            (:token-sort
  2411.          (format stream "~2&It is an ISR TokenSort object ~S~%" handle)
  2412.          (format stream "~&Sort Key is ~A~%" (handle-feature handle))
  2413.          (format stream "~&Sort order is :~A~%" (handle-sort-order handle))
  2414.          (format stream "~&It contains ~D tokens~%" 
  2415.              (length (handle-token-existence-array handle)))
  2416.          )
  2417.            (t (warn "Cannot describe ~S !" handle))
  2418.            )
  2419.      )
  2420.     )
  2421.   handle)
  2422.  
  2423. (defun datatype-of (path)
  2424.   "DATATYPE-OF path - return the data type code for path."
  2425.   (cond ((or (stringp path) (symbolp path) (handle-p path))
  2426.      (value (list path 'f_datatype)))
  2427.     (t (value (append path (list 'f_datatype)))))
  2428.   )
  2429.  
  2430. (defun datatypep (path type)
  2431.   "DATATYPEP path type - Returns T if feature at path is of type type."
  2432.   (eq (datatype-of path) type))
  2433.  
  2434. (defun frame-features (frame-path)
  2435.   "FRAME-FEATURES-OF-FRAME frame-path - returns a list of feature names for the
  2436. frame features in frame-path."
  2437.   (let ((frame-handle (%internal-handle frame-path :error-p t :terminal-p t)))
  2438.        (unless (and (handle-p frame-handle)
  2439.             (eq (handle-type frame-handle) :frame))
  2440.      (error "~S is not a frame!" frame-path))
  2441.        (append '("DOCUMENTATION" "SOURCE-FILES" "NAME")
  2442.            (mapcar #'first
  2443.                (frame-feature-alist (handle-frame frame-handle)))))
  2444.   )
  2445.  
  2446. (defun token-features (frame-path)
  2447.   "TOKEN-FEATURES-OF-FRAME frame-path - Returns a list of token set feature
  2448. names in frame frame-path."
  2449.   (let ((frame-handle (%internal-handle frame-path :error-p t :terminal-p t)))
  2450.        (unless (and (handle-p frame-handle)
  2451.             (eq (handle-type frame-handle) :frame))
  2452.      (error "~S is not a frame!" frame-path))
  2453.        (mapcar
  2454.      #'fdescr-featurename
  2455.      (frame-token-set-feature-vector (handle-frame frame-handle))))
  2456.   )
  2457.  
  2458. (defun features (path)
  2459.   "FEATURES path - Returns a list of frame features iff path is a frame,
  2460. TSS, or Sort, or a list of token features iff path is token."
  2461.   (let ((handle (%internal-handle path :error-p t :terminal-p t)))
  2462.        (case (handle-type handle)
  2463.          ((:frame :token-subset :token-sort)
  2464.           (frame-features (frame handle)))
  2465.          (:token (token-features (frame handle)))
  2466.          (t (error "Cannot return a feature list for ~S" path))
  2467.          )
  2468.        )
  2469.   )
  2470.  
  2471. (defun ancester-p (frame-handle posible-ancester-frame-handle)
  2472.   "Internal function - tests to see if its second argument is an ancester
  2473. of its first argument.  *No error checks!*"
  2474.   (do ((a-parent (frame-parent (handle-frame frame-handle))
  2475.          (frame-parent (handle-frame a-parent))))
  2476.       ((or (null a-parent)
  2477.        (eq (handle-frame a-parent)
  2478.            (handle-frame posible-ancester-frame-handle)))
  2479.        (not (null a-parent)))
  2480.       )
  2481.   )
  2482.  
  2483. (defun find-all-decendants (frame-handle)
  2484.   "Internal function - finds all of the decendants of its argument."
  2485.   (let ((offspring (find-all-decendants1 (handle-frame frame-handle)
  2486.                      '()
  2487.                      )))
  2488.        (setf offspring (delete (handle-frame frame-handle)
  2489.                    offspring))
  2490.        (do* ((result (cons nil offspring))
  2491.          (p result)
  2492.          handle)
  2493.         ((null (rest p)) (rest result))
  2494.         (setf handle (make-handle :type :frame
  2495.                       :frame (second p)))
  2496.         (cond ((ancester-p handle frame-handle)
  2497.            (setf (second p) handle
  2498.              p (rest p)))
  2499.           (t (setf (rest p) (rest (rest p)))))
  2500.         )
  2501.        )
  2502.   )
  2503.  
  2504. (defun find-all-decendants1 (frame offspring)
  2505.   "Helper function for find-all-decendants - this is the recursive plunge
  2506. function - traverses the frame tree, looking for new elements to add to the
  2507. offspring list."
  2508.   (unless (member frame offspring)
  2509.     (map nil
  2510.      #'(lambda (ffpair)
  2511.            (when (and (handle-p (fdescr-value (rest ffpair)))
  2512.                   (not (eq frame (handle-frame
  2513.                            (fdescr-value (rest ffpair))))))
  2514.              (setf offspring
  2515.                (add-frame (handle-frame (fdescr-value (rest ffpair)))
  2516.                       offspring))
  2517.              (setf offspring
  2518.                (nunion offspring
  2519.                    (find-all-decendants1
  2520.                      (handle-frame (fdescr-value (rest ffpair)))
  2521.                      offspring)))))
  2522.      (frame-feature-alist frame))
  2523.     (do-active-tokens (tokenindex (frame-token-set-existence-vector frame))
  2524.     (map nil
  2525.          #'(lambda (fdescr &aux (fvalue-vec (fdescr-value fdescr)))
  2526.                (when (= (fdescr-type fdescr) *handle*)
  2527.              (let ((token-value-handle (vvref fvalue-vec tokenindex)))
  2528.                   (when (and (handle-p token-value-handle)
  2529.                      (not (eq (handle-frame token-value-handle)
  2530.                           frame)))
  2531.                 (setf offspring (add-frame (handle-frame 
  2532.                                  token-value-handle)
  2533.                                offspring))
  2534.                 (setf offspring (nunion offspring
  2535.                             (find-all-decendants1
  2536.                               (handle-frame
  2537.                                 token-value-handle)
  2538.                               offspring)))
  2539.                 )
  2540.                   )
  2541.              )
  2542.                )
  2543.          (frame-token-set-feature-vector frame))
  2544.     )
  2545.     )
  2546.   offspring)
  2547.  
  2548. (defun add-frame (frame list)
  2549.   "helper function - does a condition push."
  2550.   (unless (member frame list)
  2551.     (push frame list))
  2552.   list)
  2553.  
  2554. (defun sort-by-tree-depth (frame-handle-list)
  2555.   "helper function that sorts a frame handle list by depth (as measured
  2556. by length of path."
  2557.   (sort frame-handle-list
  2558.     #'(lambda (handle-1 handle-2)
  2559.           (< (length (frame-path-list (handle-frame handle-1)))
  2560.              (length (frame-path-list (handle-frame handle-2)))
  2561.              )
  2562.           )
  2563.     )
  2564.   )
  2565.  
  2566.  
  2567.  
  2568. (export '(handle= make-copy-of-handle))
  2569.  
  2570. (defun handle= (h1 h2)
  2571.   "HANDLE= h1 h2
  2572. Compare two handle objects and return t if they are the \"same\".  \"Sameness\" differs
  2573. from what EQUALP would return, since the storage form and pick state are \"don't cares\" 
  2574. as far as equality is concerned."
  2575.   (cond ((not (handle-p h1)) (error "Not a handle: ~S" h1))
  2576.     ((not (handle-p h2)) (error "Not a handle: ~S" h2))
  2577.     (t (or (eq h1 h2)
  2578.            (and (eq (handle-type h1) (handle-type h2))
  2579.             (eq (handle-frame h1) (handle-frame h2))
  2580.             (case (handle-type h1)
  2581.               (:frame t)
  2582.               (:token (eq (handle-token h1) (handle-token h2)))
  2583.               (:frame-feature (string= (handle-feature h1)
  2584.                            (handle-feature h2)))
  2585.               (:token-feature (and (eq (handle-token h1)
  2586.                            (handle-token h2))
  2587.                            (string= (handle-feature h1)
  2588.                             (handle-feature h2))))
  2589.               (:token-subset (tss= (handle-token-existence-array h1)
  2590.                            (handle-token-existence-array h2)))
  2591.               (:token-sort (and (string= (handle-feature h1)
  2592.                              (handle-feature h2))
  2593.                         (eq (handle-sort-order h1)
  2594.                         (handle-sort-order h2))
  2595.                         (equalp (handle-token-existence-array h1)
  2596.                             (handle-token-existence-array h2))))
  2597.               (t nil)
  2598.               )
  2599.             )
  2600.            )
  2601.        )
  2602.     )
  2603.   )
  2604.  
  2605. (defun tss= (t1 t2)
  2606.   (cond ((and (listp t1) (listp t2))
  2607.      (equalp t1 t2))
  2608.     ((and (typep t1 '2index-vector-vector)
  2609.           (typep 21 '2index-vector-vector)
  2610.           )
  2611.      (equalp t1 t2))
  2612.     ((typep t1 '2index-vector-vector)
  2613.      (do-active-tokens (tkindex t1)
  2614.          (unless (member tkindex t2)
  2615.            (return nil)))
  2616.      t)
  2617.     (t (do-active-tokens (tkindex t2)
  2618.          (unless (member tkindex t1)
  2619.            (return nil)))
  2620.        t)
  2621.     )
  2622.   )
  2623.  
  2624.  
  2625. (defun make-copy-of-handle (handle)
  2626.   "MAKE-COPY-OF-HANDLE handle
  2627. Does a \"deep\" copy of a handle." 
  2628.   (cond ((not (handle-p handle))
  2629.      (error "Not a handle: ~S" handle))
  2630.     ((eq (handle-type handle) :token-subset)
  2631.      (make-tss handle))
  2632.     ((eq (handle-type handle) :token-sort)
  2633.      (copy-token-sort handle))
  2634.     (t (copy-handle handle))
  2635.     )
  2636.   )
  2637.  
  2638. (defun copy-token-sort (old-sort &aux new-sort)
  2639.   (setf new-sort (copy-handle old-sort)
  2640.     (handle-last-picked new-sort) nil
  2641.     (handle-token-existence-array new-sort) 
  2642.     (copy-list (handle-token-existence-array old-sort)))
  2643.   new-sort)
  2644.