annotate lisp/efs/efs-defun.el @ 98:0d2f883870bc r20-1b1

Import from CVS: tag r20-1b1
author cvs
date Mon, 13 Aug 2007 09:13:56 +0200
parents 8fc7fe29b841
children 8b8b7f3559a2 8619ce7e4c50
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1 ;; -*-Emacs-Lisp-*-
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3 ;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4 ;; File: efs-defun.el
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5 ;; Release: $efs release: 1.15 $
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6 ;; Version: $Revision: 1.1 $
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7 ;; RCS:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8 ;; Description: efs-defun allows for OS-dependent coding of functions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9 ;; Author: Sandy Rutherford <sandy@ibm550.sissa.it>
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10 ;; Created: Thu Oct 22 17:58:14 1992
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
11 ;; Modified: Sun Nov 27 12:18:35 1994 by sandy on gandalf
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
12 ;; Language: Emacs-Lisp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
13 ;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
14 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
15
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
16 ;;; This file is part of efs. See efs.el for copyright
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
17 ;;; (it's copylefted) and warrranty (there isn't one) information.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
18
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
19 ;;; efs-defun allows object-oriented emacs lisp definitions.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
20 ;;; In efs, this feature is used to support multiple host types.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
21 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
22 ;;; The first arg after the function name is a key which determines
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
23 ;;; which version of the function is being defined. Normally, when the function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
24 ;;; is called this key is given as the first argument to the function.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
25 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
26 ;;; For example:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
27 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
28 ;;; (efs-defun foobar vms (x y)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
29 ;;; (message "hello vms world")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
30 ;;; (+ x y))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
31 ;;; => foobar
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
32 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
33 ;;; (foobar 'vms 1 2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
34 ;;; => 3
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
35
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
36 ;;; The key nil plays a special role:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
37 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
38 ;;; First, it defines a default action. If there is no function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
39 ;;; definition associated with a given OS-key, then the function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
40 ;;; definition associated with nil is used. If further there is no
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
41 ;;; function definition associated with nil, then an error is
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
42 ;;; signaled.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
43 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
44 ;;; Second, the documentation string for the function is the one given
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
45 ;;; with the nil definition. You can supply doc-strings with other
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
46 ;;; definitions of the function, but they are not accessible with
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
47 ;;; 'describe-function. In fact, when the function is either loaded or
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
48 ;;; byte-compiled, they are just thrown away.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
49
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
50 ;;; There is another way to define the default action of an efs-function.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
51 ;;; This is with the use flag. If you give as the key (&use foobar),
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
52 ;;; then when the function is called the variable foobar will be used to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
53 ;;; determine which OS version of the function to use. As well as
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
54 ;;; allowing you to define the doc string, if the use flag is used,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
55 ;;; then you can specify an interactive specification with the function.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
56 ;;; Although a function is only interactive, if the default definition
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
57 ;;; has an interactive spec, it is still necessary to give interactive
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
58 ;;; specs for the other definitions of the function as well. It is possible
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
59 ;;; for these interactive specs to differ.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
60 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
61 ;;; For example:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
62 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
63 ;;; (efs-defun fizzle (&use foobar)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
64 ;;; "Fizzle's doc string."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
65 ;;; (interactive)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
66 ;;; (message "fizz wizz"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
67 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
68 ;;; (efs-defun fizzle vms
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
69 ;;; (interactive)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
70 ;;; (message "VMS is fizzled."))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
71 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
72 ;;; (setq foobar 'unix)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
73 ;;; => unix
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
74 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
75 ;;; (fizzle)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
76 ;;; => "fizz wizz"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
77 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
78 ;;; (setq foobar 'vms)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
79 ;;; => vms
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
80 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
81 ;;; (fizzle)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
82 ;;; => "VMS is fizzled."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
83 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
84 ;;; M-x f i z z l e <return>
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
85 ;;; => "VMS is fizzled."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
86 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
87 ;;; Actually, when you use the &use spec, whatever follows it is simply
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
88 ;;; evaluated at call time.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
89
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
90 ;;; Note that when the function is defined, the key is implicitly
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
91 ;;; quoted, whereas when the function is called, the key is
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
92 ;;; evaluated. If this seems strange, think about how efs-defuns
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
93 ;;; are used in practice.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
94
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
95 ;;; There are no restrictions on the order in which the different OS-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
96 ;;; definitions are done.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
97
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
98 ;;; There are no restrictions on the keys that can be used, nor on the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
99 ;;; symbols that can be used as arguments to an efs-defun. We go
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
100 ;;; to some lengths to avoid potential conflicts. In particular, when
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
101 ;;; the OS-keys are looked up in the symbol's property list, we
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
102 ;;; actually look for a symbol with the same name in the special
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
103 ;;; obarray, efs-key-obarray. This avoids possible conflicts with
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
104 ;;; other entries in the property list, that are usually accessed with
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
105 ;;; symbols in the standard obarray.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
106
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
107 ;;; The V19 byte-compiler will byte-compile efs-defun's.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
108 ;;; The standard emacs V18 compiler will not, however they will still
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
109 ;;; work, just not at byte-compiled speed.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
110
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
111 ;;; efs-autoload works much like the standard autoload, except it
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
112 ;;; defines the efs function cell for a given host type as an autoload.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
113 ;;; The from-kbd arg only makes sense if the default action of the autoload
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
114 ;;; has been defined with a &use.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
115
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
116 ;;; To do:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
117 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
118 ;;; 1. Set an edebug-form-hook for efs-defun
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
119
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
120 ;;; Known Bugs:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
121 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
122 ;;; 1. efs-autoload will correctly NOT overload an existing function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
123 ;;; definition with an autoload definition. However, it will also
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
124 ;;; not overload a previous autoload with a new one. It should. An
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
125 ;;; overload can be forced for the KEY def of function FUN by doing
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
126 ;;; (put 'FUN (intern "KEY" efs-key-obarray) nil) first.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
127 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
128
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
129 ;;; Provisions and requirements
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
130
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
131 (provide 'efs-defun)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
132 (require 'backquote)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
133
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
134 ;;; Variables
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
135
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
136 (defconst efs-defun-version
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
137 (concat (substring "$efs release: 1.15 $" 14 -2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
138 "/"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
139 (substring "$Revision: 1.1 $" 11 -2)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
140
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
141 (defconst efs-key-obarray (make-vector 7 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
142
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
143 ;; Unfortunately, we need to track this in bytecomp.el.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
144 ;; It's not much to keep track of, although.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
145 (defconst efs-defun-bytecomp-buffer "*Compile-Log*")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
146
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
147 (defvar efs-key nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
148 "Inside an efs function, this is set to the key that was used to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
149 call the function. You can test this inside the default definition, to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
150 determine which key was actually used.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
151 (defvar efs-args nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
152 "Inside an efs function, this is set to a list of the calling args
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
153 of the function.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
154
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
155 ;;; Utility Functions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
156
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
157 ;;; These functions are called when the macros efs-defun and efs-autoload
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
158 ;;; are expanded. Their purpose is to help in producing the expanded code.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
159
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
160 (defun efs-defun-arg-count (list)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
161 ;; Takes a list of arguments, and returns a list of three
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
162 ;; integers giving the number of normal args, the number
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
163 ;; of &optional args, and the number of &rest args (this should
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
164 ;; only be 0 or 1, but we don't check this).
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
165 (let ((o-leng (length (memq '&optional list)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
166 (r-leng (length (memq '&rest list)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
167 (leng (length list)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
168 (list (- leng (max o-leng r-leng))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
169 (max 0 (- o-leng r-leng 1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
170 (max 0 (1- r-leng)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
171
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
172 ;; For each efs-function the property efs-function-arg-structure
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
173 ;; is either a list of three integers to indicate the number of normal,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
174 ;; optional, and rest args, or it can be the symbol 'autoload to indicate
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
175 ;; that all definitions of the function are autoloads, and we have no
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
176 ;; idea of its arg structure.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
177
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
178 (defun efs-defun-arg-check (fun key list)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
179 ;; Checks that the LIST of args is consistent for the KEY def
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
180 ;; of function FUN.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
181 (let ((prop (get fun 'efs-function-arg-structure))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
182 count)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
183 (if (eq list 'autoload)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
184 (or prop (put fun 'efs-function-arg-structure 'autoload))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
185 (setq count (efs-defun-arg-count list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
186 (if (and prop (not (eq prop 'autoload)) (not (equal prop count)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
187 (let ((warning
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
188 (format
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
189 "args. for the %s def. of %s don't agree with previous defs."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
190 key fun)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
191 (message (concat "Warning: " warning))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
192 ;; We are compiling, I suppose...
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
193 (if (get-buffer efs-defun-bytecomp-buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
194 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
195 (set-buffer efs-defun-bytecomp-buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
196 (goto-char (point-max))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
197 (insert "efs warning:\n " warning "\n")))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
198 (put fun 'efs-function-arg-structure count))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
199
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
200 (defun efs-def-generic (fun use doc-string interactive-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
201 ;; Generates a generic function def using USE.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
202 ;; If use is nil, the first arg of the function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
203 ;; is the key.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
204 (let ((def-args '(&rest efs-args))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
205 result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
206 (or use
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
207 (setq def-args (cons 'efs-key def-args)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
208 (setq result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
209 (` (or (get (quote (, fun))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
210 (, (if use
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
211 (list 'intern
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
212 (list 'symbol-name use)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
213 'efs-key-obarray)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
214 '(intern
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
215 (symbol-name efs-key)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
216 efs-key-obarray))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
217 (get (quote (, fun))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
218 (intern "nil" efs-key-obarray)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
219 ;; Make the gen fun interactive, if nec.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
220 (setq result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
221 (if interactive-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
222 (` ((interactive)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
223 (if (interactive-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
224 (let ((prefix-arg current-prefix-arg))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
225 (call-interactively
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
226 (, result)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
227 (, (cons 'apply (list result 'efs-args))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
228 (list (cons 'apply (list result 'efs-args)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
229 (if doc-string (setq result (cons doc-string result)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
230 (cons 'defun (cons fun (cons def-args result)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
231
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
232 (defun efs-def-autoload (fun key file from-kbd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
233 ;; Returns the autoload lambda for FUN and FILE.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
234 ;; I really should have some notion of efs-autoload
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
235 ;; objects, and not just plain lambda's.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
236 (let ((result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
237 (if from-kbd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
238 (`
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
239 (lambda (&rest args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
240 (interactive)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
241 (let ((qkey (intern (symbol-name (quote (, key)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
242 efs-key-obarray))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
243 (tmp1 (intern "tmp1" efs-key-obarray))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
244 (tmp2 (intern "tmp2" efs-key-obarray)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
245 ;; Need to store the a-f-function, to see if it has been
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
246 ;; re-defined by the load. This is avoid to an infinite loop.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
247 (set tmp1 (get (quote (, fun)) qkey))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
248 ;; Need to store the prefix arg in case it's interactive.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
249 ;; These values are stored in variables interned in the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
250 ;; efs-key-obarray, because who knows what loading a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
251 ;; file might do.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
252 (set tmp2 current-prefix-arg)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
253 (load (, file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
254 ;; check for re-def
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
255 (if (equal (symbol-value tmp1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
256 (get (quote (, fun)) qkey))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
257 (error "%s definition of %s is not defined by loading %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
258 qkey (quote (, fun)) (, file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
259 ;; call function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
260 (if (interactive-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
261 (let ((prefix-arg (symbol-value tmp2)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
262 (call-interactively
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
263 (get (quote (, fun)) qkey)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
264 (apply (get (quote (, fun)) qkey) args)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
265 (` (lambda (&rest args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
266 (let ((qkey (intern (symbol-name (quote (, key)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
267 efs-key-obarray))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
268 (tmp1 (intern "tmp1" efs-key-obarray)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
269 ;; Need to store the a-f-function, to see if it has been
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
270 ;; re-defined by the load. This is avoid to an infinite loop.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
271 (set tmp1 (get (quote (, fun)) qkey))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
272 (load (, file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
273 ;; check for re-def
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
274 (if (equal (symbol-value tmp1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
275 (get (quote (, fun)) qkey))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
276 (error "%s definition of %s is not defined by loading %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
277 qkey (quote (, fun)) (, file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
278 ;; call function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
279 (apply (get (quote (, fun)) qkey) args)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
280 (list 'put (list 'quote fun)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
281 (list 'intern
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
282 (list 'symbol-name (list 'quote key))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
283 'efs-key-obarray)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
284 (list 'function result))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
285
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
286 ;;; User level macros -- efs-defun and efs-autoload.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
287
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
288 (defmacro efs-defun (funame key args &rest body)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
289 (let* ((use (and (eq (car-safe key) '&use)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
290 (nth 1 key)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
291 (key (and (null use) key))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
292 result doc-string interactive-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
293 ;; check args
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
294 (efs-defun-arg-check funame key args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
295 ;; extract doc-string
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
296 (if (stringp (car body))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
297 (setq doc-string (car body)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
298 body (cdr body)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
299 ;; If the default fun is interactive, and it's a use construct,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
300 ;; then we allow the gen fun to be interactive.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
301 (if use
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
302 (setq interactive-p (eq (car-safe (car-safe body)) 'interactive)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
303 (setq result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
304 (` ((put (quote (, funame))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
305 (intern (symbol-name (quote (, key)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
306 efs-key-obarray)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
307 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
308 (, (cons 'lambda
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
309 (cons args body)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
310 (quote (, funame)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
311 ;; if the key is null, make a generic def
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
312 (if (null key)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
313 (setq result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
314 (cons (efs-def-generic
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
315 funame use doc-string interactive-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
316 result)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
317 ;; return
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
318 (cons 'progn result)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
319
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
320 ;;; For lisp-mode
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
321
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
322 (put 'efs-defun 'lisp-indent-hook 'defun)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
323
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
324 ;; efs-autoload
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
325 ;; Allows efs function cells to be defined as autoloads.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
326 ;; If efs-autoload inserted autoload objects in the property list,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
327 ;; and the funcall mechanism in efs-defun checked for such
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
328 ;; auto-load objects, we could reduce the size of the code
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
329 ;; resulting from expanding efs-autoload. However, the expansion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
330 ;; of efs-defun would be larger. What is the best thing to do?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
331
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
332 (defmacro efs-autoload (fun key file &optional docstring from-kbd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
333 (let* ((use (and (eq (car-safe key) '&use)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
334 (nth 1 key)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
335 (key (and (null use) key)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
336 (efs-defun-arg-check (eval fun) key 'autoload)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
337 ;; has the function been previously defined?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
338 (`
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
339 (if (null (get (, fun)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
340 (intern (symbol-name (quote (, key)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
341 efs-key-obarray)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
342 (,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
343 (if (null key)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
344 (list 'progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
345 ;; need to eval fun, since autoload wants an explicit
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
346 ;; quote built into the fun arg.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
347 (efs-def-generic
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
348 (eval fun) use docstring from-kbd )
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
349 (efs-def-autoload (eval fun) key file from-kbd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
350 (list 'quote
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
351 (list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
352 'efs-autoload
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
353 key file docstring from-kbd)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
354 (list 'progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
355 (efs-def-autoload (eval fun) key file from-kbd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
356 (list 'quote
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
357 (list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
358 'efs-autoload
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
359 key file docstring from-kbd)))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
360
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
361 (defun efs-fset (sym key fun)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
362 ;; Like fset but sets KEY's definition of SYM.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
363 (put sym (intern (symbol-name key) efs-key-obarray) fun))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
364
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
365 (defun efs-fboundp (key fun)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
366 ;; Like fboundp, but checks for KEY's def.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
367 (null (null (get fun (intern (symbol-name key) efs-key-obarray)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
368
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
369 ;; If we are going to use autoload objects, the following two functions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
370 ;; will be useful.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
371 ;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
372 ;; (defun efs-defun-do-autoload (fun file key interactive-p args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
373 ;; ;; Loads FILE and runs the KEY def of FUN.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
374 ;; (let (fun file key interactive-p args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
375 ;; (load file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
376 ;; (let ((new-def (get fun key)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
377 ;; (if (eq (car-safe new-def) 'autoload)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
378 ;; (error "%s definition of %s is not defined by loading %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
379 ;; key fun file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
380 ;; (if interactive-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
381 ;; (let ((prefix-arg current-predix-arg))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
382 ;; (call-interactively fun))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
383 ;; (apply new-def args)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
384 ;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
385 ;; (defun efs-defun-autoload (fun key file doc-string from-kbd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
386 ;; ;; Sets the KEY def of FUN to an autoload object.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
387 ;; (let* ((key (intern (symbol-name key) efs-key-obarray))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
388 ;; (def (get fun key)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
389 ;; (if (or (null def)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
390 ;; (eq (car-safe def) 'autoload))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
391 ;; (put fun key (list 'autoload file doc-string from-kbd)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
392
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
393 ;;; end of efs-defun.el