annotate lisp/apel/atype.el @ 183:e121b013d1f0 r20-3b18

Import from CVS: tag r20-3b18
author cvs
date Mon, 13 Aug 2007 09:54:23 +0200
parents 43dd3413c7c7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
155
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
1 ;;; atype.el --- atype functions
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
2
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
3 ;; Copyright (C) 1994,1995,1996,1997 Free Software Foundation, Inc.
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
4
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
5 ;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
6 ;; Version: $Id: atype.el,v 1.1 1997/06/03 04:18:34 steve Exp $
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
7 ;; Keywords: atype
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
8
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
9 ;; This file is part of APEL (A Portable Emacs Library).
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
10
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
11 ;; This program is free software; you can redistribute it and/or
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
12 ;; modify it under the terms of the GNU General Public License as
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
13 ;; published by the Free Software Foundation; either version 2, or (at
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
14 ;; your option) any later version.
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
15
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
16 ;; This program is distributed in the hope that it will be useful, but
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
17 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
19 ;; General Public License for more details.
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
20
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
24 ;; Boston, MA 02111-1307, USA.
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
25
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
26 ;;; Code:
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
27
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
28 (require 'emu)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
29 (require 'alist)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
30
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
31
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
32 ;;; @ field unifier
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
33 ;;;
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
34
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
35 (defun field-unifier-for-default (a b)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
36 (let ((ret
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
37 (cond ((equal a b) a)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
38 ((null (cdr b)) a)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
39 ((null (cdr a)) b)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
40 )))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
41 (if ret
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
42 (list nil ret nil)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
43 )))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
44
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
45 (defun field-unify (a b)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
46 (let ((f
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
47 (let ((type (car a)))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
48 (and (symbolp type)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
49 (intern (concat "field-unifier-for-" (symbol-name type)))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
50 ))))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
51 (or (fboundp f)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
52 (setq f (function field-unifier-for-default))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
53 )
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
54 (funcall f a b)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
55 ))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
56
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
57
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
58 ;;; @ type unifier
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
59 ;;;
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
60
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
61 (defun assoc-unify (class instance)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
62 (catch 'tag
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
63 (let ((cla (copy-alist class))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
64 (ins (copy-alist instance))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
65 (r class)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
66 cell aret ret prev rest)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
67 (while r
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
68 (setq cell (car r))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
69 (setq aret (assoc (car cell) ins))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
70 (if aret
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
71 (if (setq ret (field-unify cell aret))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
72 (progn
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
73 (if (car ret)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
74 (setq prev (put-alist (car (car ret))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
75 (cdr (car ret))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
76 prev))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
77 )
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
78 (if (nth 2 ret)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
79 (setq rest (put-alist (car (nth 2 ret))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
80 (cdr (nth 2 ret))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
81 rest))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
82 )
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
83 (setq cla (put-alist (car cell)(cdr (nth 1 ret)) cla))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
84 (setq ins (del-alist (car cell) ins))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
85 )
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
86 (throw 'tag nil)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
87 ))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
88 (setq r (cdr r))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
89 )
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
90 (setq r (copy-alist ins))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
91 (while r
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
92 (setq cell (car r))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
93 (setq aret (assoc (car cell) cla))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
94 (if aret
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
95 (if (setq ret (field-unify cell aret))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
96 (progn
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
97 (if (car ret)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
98 (setq prev (put-alist (car (car ret))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
99 (cdr (car ret))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
100 prev))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
101 )
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
102 (if (nth 2 ret)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
103 (setq rest (put-alist (car (nth 2 ret))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
104 (cdr (nth 2 ret))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
105 rest))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
106 )
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
107 (setq cla (del-alist (car cell) cla))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
108 (setq ins (put-alist (car cell)(cdr (nth 1 ret)) ins))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
109 )
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
110 (throw 'tag nil)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
111 ))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
112 (setq r (cdr r))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
113 )
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
114 (list prev (append cla ins) rest)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
115 )))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
116
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
117 (defun get-unified-alist (db al)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
118 (let ((r db) ret)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
119 (catch 'tag
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
120 (while r
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
121 (if (setq ret (nth 1 (assoc-unify (car r) al)))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
122 (throw 'tag ret)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
123 )
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
124 (setq r (cdr r))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
125 ))))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
126
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
127
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
128 ;;; @ utilities
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
129 ;;;
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
130
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
131 (defun delete-atype (atl al)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
132 (let* ((r atl) ret oal)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
133 (setq oal
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
134 (catch 'tag
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
135 (while r
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
136 (if (setq ret (nth 1 (assoc-unify (car r) al)))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
137 (throw 'tag (car r))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
138 )
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
139 (setq r (cdr r))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
140 )))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
141 (delete oal atl)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
142 ))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
143
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
144 (defun remove-atype (sym al)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
145 (and (boundp sym)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
146 (set sym (delete-atype (eval sym) al))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
147 ))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
148
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
149 (defun replace-atype (atl old-al new-al)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
150 (let* ((r atl) ret oal)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
151 (if (catch 'tag
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
152 (while r
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
153 (if (setq ret (nth 1 (assoc-unify (car r) old-al)))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
154 (throw 'tag (rplaca r new-al))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
155 )
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
156 (setq r (cdr r))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
157 ))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
158 atl)))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
159
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
160 (defun set-atype (sym al &rest options)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
161 (if (null (boundp sym))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
162 (set sym al)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
163 (let* ((replacement (memq 'replacement options))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
164 (ignore-fields (car (cdr (memq 'ignore options))))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
165 (remove (or (car (cdr (memq 'remove options)))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
166 (let ((ral (copy-alist al)))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
167 (mapcar (function
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
168 (lambda (type)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
169 (setq ral (del-alist type ral))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
170 ))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
171 ignore-fields)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
172 ral)))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
173 )
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
174 (set sym
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
175 (or (if replacement
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
176 (replace-atype (eval sym) remove al)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
177 )
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
178 (cons al
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
179 (delete-atype (eval sym) remove)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
180 )
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
181 )))))
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
182
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
183
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
184 ;;; @ end
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
185 ;;;
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
186
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
187 (provide 'atype)
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
188
43dd3413c7c7 Import from CVS: tag r20-3b4
cvs
parents:
diff changeset
189 ;;; atype.el ends here