annotate lisp/compat.el @ 608:4d7fdf497470

[xemacs-hg @ 2001-06-04 16:59:51 by wmperry] 2001-06-04 William M. Perry <wmperry@gnu.org> * gpmevent.c (KG_CTRL): Just define these unconditionally. The linux headers are so lame that they do not expose these to userland programs and you cannot gracefully include the kernel headers. 2001-06-03 William M. Perry <wmperry@gnu.org> * scrollbar-gtk.c (gtk_create_scrollbar_instance): Make calling of gtk_size_request unconditional. 2001-06-02 William M. Perry <wmperry@gnu.org> * emacs-marshals.c: Regenerated. 2001-06-01 William M. Perry <wmperry@gnu.org> * glyphs-shared.c (read_bitmap_data): Common definition of read_bitmap_data_from_file added. This does not attempt to use the Xmu based code at all - lets us be consistent across platforms. * glyphs-gtk.c: Removed definition of read_bitmap_data_from_file - this is now in glyphs-shared.c * glyphs-msw.c: Ditto. * glyphs-x.c: Ditto. 2001-06-03 William M. Perry <wmperry@gnu.org> * dialog-gtk.el (popup-builtin-open-dialog): Yikes - don't forget to return the filename! * font.el (font-window-system-mappings): Add gtk entry - just an alias to the X code) 2001-06-02 William M. Perry <wmperry@gnu.org> * gtk-marshal.el: Fix for removing of the string_hash utility functions in hash.c
author wmperry
date Mon, 04 Jun 2001 17:00:02 +0000
parents de805c49cfc1
children 6728e641994e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
410
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
1 ;;; compat.el --- Mechanism for non-intrusively providing compatibility funs.
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
2
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
3 ;; Copyright (C) 2000 Ben Wing.
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
4
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
5 ;; Author: Ben Wing <ben@xemacs.org>
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
6 ;; Maintainer: Ben Wing
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
7 ;; Keywords: internal
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
8
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
9 ;; This file is part of XEmacs.
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
10
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
11 ;; XEmacs is free software; you can redistribute it and/or modify it
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
12 ;; under the terms of the GNU General Public License as published by
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
13 ;; the Free Software Foundation; either version 2, or (at your option)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
14 ;; any later version.
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
15
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
16 ;; XEmacs is distributed in the hope that it will be useful, but
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
17 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
19 ;; General Public License for more details.
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
20
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
22 ;; along with XEmacs; see the file COPYING. If not, write to the
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
24 ;; Boston, MA 02111-1307, USA.
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
25
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
26 ;;; Synched up with: Not in FSF.
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
27
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
28 ;;; Authorship:
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
29
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
30 ; Written May 2000 by Ben Wing.
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
31
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
32 ;;; Commentary:
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
33
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
34 ;; Typical usage:
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
35
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
36 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
37 ;; 1. Wrap modules that define compatibility functions like this: ;;
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
38 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
39
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
40 ;(compat-define-group 'fsf-compat)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
41
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
42 ;(compat-define-functions 'fsf-compat
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
43
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
44 ;(defun overlayp (object)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
45 ; "Return t if OBJECT is an overlay."
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
46 ; (and (extentp object)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
47 ; (extent-property object 'overlay)))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
48
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
49 ;(defun make-overlay (beg end &optional buffer front-advance rear-advance)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
50 ; ...)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
51
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
52 ;...
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
53
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
54 ;) ;; end of (compat-define-group 'fsf-compat)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
55
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
56 ;;;; overlay.el ends here
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
57
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
58
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
59 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
60 ;; 2. Wrap modules that use the compatibility functions like this: ;;
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
61 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
62
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
63 ;(compat 'fsf-compat
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
64
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
65 ;(defun random-module-my-fun (bar baz)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
66 ; (if (fboundp 'overlays-in) (overlays-in bar baz)))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
67
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
68 ;...
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
69
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
70 ;) ;; end of (compat 'fsf-compat)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
71
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
72 ;;;; random-module.el ends here
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
73
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
74
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
75 (defun compat-hash-table (group)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
76 (get group 'compat-table))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
77
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
78 (defun compat-make-hash-table (group)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
79 (put group 'compat-table (make-hash-table)))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
80
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
81 (defmacro compat-define-group (group)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
82 "Define GROUP as a group of compatibility functions.
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
83 Individual functions are defined using `compat-define-functions'.
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
84 Once defined, the functions can be used by wrapping your code in the
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
85 `compat' macro.
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
86
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
87 If GROUP is already defined, nothing happens."
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
88 (let ((group (eval group)))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
89 (or (hash-table-p (compat-hash-table group))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
90 (compat-make-hash-table group))))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
91
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
92 (defmacro compat-clear-functions (group)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
93 "Clear all defined functions and macros out of GROUP."
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
94 (let ((group (eval group)))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
95 (clrhash (compat-hash-table group))))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
96
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
97 (defmacro compat-define-functions (group &rest body)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
98 "Define compatibility functions in GROUP.
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
99 You should simply wrap this around the code that defines the functions.
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
100 Any functions and macros defined at top level using `defun' or `defmacro'
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
101 will be noticed and added to GROUP. Other top-level code will be executed
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
102 normally. All code and definitions in this group can safely reference any
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
103 other functions in this group -- the code is effectively wrapped in a
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
104 `compat' call. You can call `compat-define-functions' more than once, if
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
105 necessary, for a single group.
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
106
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
107 What actually happens is that the functions and macros defined here are in
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
108 fact defined using names prefixed with GROUP. To use these functions,
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
109 wrap any calling code with the `compat' macro, which lexically renames
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
110 the function and macro calls appropriately."
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
111 (let ((group (eval group)))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
112 (let (fundef
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
113 (body-tail body))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
114 (while body-tail
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
115 (setq fundef (car body-tail))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
116 (when (and (consp fundef) (eq (car fundef) 'defun))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
117 (puthash (second fundef) (third fundef) (compat-hash-table group)))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
118 (when (and (consp fundef) (eq (car fundef) 'defmacro))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
119 (puthash (second fundef) (third fundef) (compat-hash-table group)))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
120 (setq body-tail (cdr body-tail))))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
121 (let (fundef
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
122 (body-tail body)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
123 result)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
124 (while body-tail
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
125 (setq fundef (car body-tail))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
126 (push
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
127 (cond ((and (consp fundef) (eq (car fundef) 'defun))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
128 (nconc (list 'defun
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
129 (intern (concat (symbol-name group) "-"
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
130 (symbol-name (second fundef))))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
131 (third fundef))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
132 (nthcdr 3 fundef)))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
133 ((and (consp fundef) (eq (car fundef) 'defmacro))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
134 (nconc (list 'defmacro
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
135 (intern (concat (symbol-name group) "-"
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
136 (symbol-name (second fundef))))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
137 (third fundef))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
138 (nthcdr 3 fundef)))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
139 (t fundef))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
140 result)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
141 (setq body-tail (cdr body-tail)))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
142 (nconc (list 'compat (list 'quote group)) (nreverse result)))))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
143
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
144 (defvar compat-active-groups nil)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
145
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
146 (defun compat-fboundp (groups fun)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
147 "T if FUN is either `fboundp' or one of the compatibility funs in GROUPS.
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
148 GROUPS is a list of compatibility groups as defined using
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
149 `compat-define-group'."
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
150 (or (fboundp fun)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
151 (block nil
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
152 (mapcar #'(lambda (group)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
153 (if (gethash fun (compat-hash-table group))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
154 (return t)))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
155 groups))))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
156
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
157 (defmacro compat (group &rest body)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
158 "Make use of compatibility functions and macros in GROUP.
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
159 You should simply wrap this around the code that uses the functions
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
160 and macros in GROUP. Typically, a call to `compat' should be placed
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
161 at the top of an ELisp module, with the closing parenthesis at the
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
162 bottom; use this in place of a `require' statement. Wrapped code can
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
163 be either function or macro definitions or other ELisp code, and
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
164 wrapped function or macro definitions need not be at top level. All
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
165 calls to the compatibility functions or macros will be noticed anywhere
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
166 within the wrapped code. Calls to `fboundp' within the wrapped code
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
167 will also behave correctly when called on compatibility functions and
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
168 macros, even though they would return nil elsewhere (including in code
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
169 in other modules called dynamically from the wrapped code).
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
170
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
171 The functions and macros define in GROUP are actually defined under
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
172 prefixed names, to avoid namespace clashes and bad interactions with
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
173 other code that calls `fboundp'. All calls inside of the wrapped code
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
174 to the compatibility functions and macros in GROUP are lexically
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
175 mapped to the prefixed names. Since this is a lexical mapping, code
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
176 in other modules that is called by functions in this module will not
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
177 be affected."
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
178 (let ((group (eval group))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
179 defs)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
180 (maphash
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
181 #'(lambda (fun args)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
182 (push
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
183 (list fun args
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
184 (nconc
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
185 (list 'list
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
186 (list 'quote
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
187 (intern (concat (symbol-name group) "-"
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
188 (symbol-name fun)))))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
189 args))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
190 defs))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
191 (compat-hash-table group))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
192 ;; it would be cleaner to use `lexical-let' instead of `let', but that
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
193 ;; causes function definitions to have obnoxious, unreadable junk in
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
194 ;; them. #### Move `lexical-let' into C!!!
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
195 `(let ((compat-active-groups (cons ',group compat-active-groups)))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
196 (macrolet ((fboundp (fun) `(compat-fboundp ',compat-active-groups ,fun))
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
197 ,@defs)
de805c49cfc1 Import from CVS: tag r21-2-35
cvs
parents:
diff changeset
198 ,@body))))