annotate lisp/hyperbole/kotl/knode.el @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1 ;;!emacs
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3 ;; FILE: knode.el
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4 ;; SUMMARY: Generic nodes for use as elements in data structures.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5 ;; USAGE: GNU Emacs Lisp Library
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6 ;; KEYWORDS: extensions, hypermedia, outlines
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8 ;; AUTHOR: Kellie Clark & Bob Weiner
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
10 ;; ORIG-DATE: 5/1/93
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
11 ;; LAST-MOD: 14-Jun-95 at 12:45:49 by Bob Weiner
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
12 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
13 ;; This file is part of Hyperbole.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
14 ;; Available for use and distribution under the same terms as GNU Emacs.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
15 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
16 ;; Copyright (C) 1993-1995, Free Software Foundation, Inc.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
17 ;; Developed with support from Motorola Inc.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
18 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
19 ;; DESCRIPTION:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
20 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21 ;; DESCRIP-END.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
22
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
23 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
24 ;;; Public functions
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
25 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
27 ;;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
28 ;;; Knodes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
29 ;;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
30
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
31 (defun knode:create (contents &optional prop-list)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
32 "Return a new knode which stores CONTENTS and optional PROP-LIST."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
33 (list 'knode
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
34 'contents contents
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
35 'plist prop-list))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
36
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
37 (defun knode:contents (knode)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
38 "Return KNODE's contents."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
39 (if (knode:is-p knode)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
40 (car (cdr (memq 'contents knode)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41 (error "(knode:contents): Argument must be a knode.")))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
42
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
43 (fset 'knode:copy 'copy-tree)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
44
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
45 (defun knode:is-p (object)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
46 "Is OBJECT a knode?"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
47 (and (listp object) (eq (car object) 'knode)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
48
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
49 (defun knode:set-contents (knode contents)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
50 "Set KNODE's CONTENTS."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
51 (if (knode:is-p knode)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
52 (setcar (cdr (memq 'contents knode)) contents)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
53 (error "(knode:set-contents): First arg must be a knode.")))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
54
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
55 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
56 ;;; Private functions
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
57 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
58
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
59 (defun knode:get-attr (obj attribute)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
60 "Return the value of OBJECT's ATTRIBUTE."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
61 (car (cdr (memq attribute obj))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
62
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
63 (defun knode:remove-attr (obj attribute)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
64 "Remove OBJECT's ATTRIBUTE, if any, and return modified OBJECT.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
65 Use (setq object (knode:remove-attr object attribute)) to ensure that OBJECT
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
66 is updated."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
67 (let ((tail obj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
68 sym
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
69 prev)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
70 (setq sym (car tail))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
71 (while (and sym (eq sym attribute))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
72 (setq tail (cdr (cdr tail))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
73 sym (car tail)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
74 (setq obj tail
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
75 prev tail
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
76 tail (cdr (cdr tail)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
77 (while tail
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
78 (setq sym (car tail))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
79 (if (eq sym attribute)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
80 (setcdr (cdr prev) (cdr (cdr tail))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81 (setq prev tail
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82 tail (cdr (cdr tail))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
83 obj))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
84
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
85 (defun knode:set-attr (obj attribute value)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
86 "Set OBJECT's ATTRIBUTE to VALUE and return OBJECT."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
87 (let ((attr (memq attribute obj)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
88 (if attr
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
89 (setcar (cdr attr) value)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
90 (setq obj (nconc obj (list attribute value)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
91 obj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
92
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
93 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
94 ;;; Private variables
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
95 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
96
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97 (provide 'knode)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98