annotate lisp/utils/pretty-print.el @ 12:bcdc7deadc19 r19-15b7

Import from CVS: tag r19-15b7
author cvs
date Mon, 13 Aug 2007 08:48:16 +0200
parents
children ec9a17fef872
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
1 ;; -*- Syntax: Emacs-Lisp; Mode: emacs-lisp -*-
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
2 ;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
3 ;; Emacs Lisp pretty printer and macro expander
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
4 ;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
5 ;; Copyright (C) 1992,1993 Guido Bosch <Guido.Bosch@loria.fr>
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
6
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
7 ;; This file is written in GNU Emacs Lisp, but is not part of GNU Emacs.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
8
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
9 ;; This file is part of XEmacs.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
10
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
11 ;; XEmacs is free software; you can redistribute it and/or modify it
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
12 ;; under the terms of the GNU General Public License as published by
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
13 ;; the Free Software Foundation; either version 2, or (at your option)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
14 ;; any later version.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
15
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
16 ;; XEmacs is distributed in the hope that it will be useful,
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
19 ;; GNU General Public License for more details.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
20
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
22 ;; along with XEmacs; see the file COPYING. If not, write to
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
23 ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
24 ;; 02111-1307, USA.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
25
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
26 ;; Synched up with: Not in FSF.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
27
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
28 ;; Please send bugs and comments to the author.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
29 ;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
30 ;; <DISCLAIMER>
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
31 ;; This program is still under development. Neither the author nor
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
32 ;; CRIN-INRIA accepts responsibility to anyone for the consequences of
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
33 ;; using it or for whether it serves any particular purpose or works
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
34 ;; at all.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
35 ;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
36 ;; The package has been developed under Lucid Emacs 19, but also runs
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
37 ;; on Emacs 18, if it is compiled with the version 19 byte compiler
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
38 ;; (function `compiled-function-p' lacking).
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
39 ;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
40
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
41 ;; Installation and Usage
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
42 ;; ----------------------
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
43 ;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
44 ;; This package provides an Emacs Lisp sexpression pretty printer and
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
45 ;; macroexpander. To install it, put the following line in your .emacs,
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
46 ;; default.el or site-init.el/site-run.el (for Lucid Emacs):
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
47 ;; (require 'pp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
48 ;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
49 ;; The package can also be made autoloadable, with the following entry
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
50 ;; points:
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
51 ;; (autoload 'pp-function "pp" nil t)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
52 ;; (autoload 'pp-variable "pp" nil t)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
53 ;; (autoload 'pp-plist "pp" nil t)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
54 ;; (autoload 'macroexpand-sexp "pp" nil t)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
55 ;; (autoload 'macroexpand-all-sexp "pp" nil t)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
56 ;; (autoload 'prettyexpand-sexp "pp" nil t)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
57 ;; (autoload 'prettyexpand-all-sexp "pp" nil t)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
58 ;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
59 ;;(define-key emacs-lisp-mode-map '(control meta m) 'macroexpand-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
60 ;;(define-key emacs-lisp-mode-map '(control meta M) 'macroexpand-all-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
61 ;;(define-key emacs-lisp-mode-map '(control symbol m) 'prettyexpand-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
62 ;;(define-key emacs-lisp-mode-map '(control symbol M) 'prettyexpand-all-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
63 ;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
64 ;;(define-key lisp-interaction-mode-map '(control meta m) 'macroexpand-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
65 ;;(define-key lisp-interaction-mode-map '(control meta M) 'macroexpand-all-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
66 ;;(define-key lisp-interaction-mode-map '(control symbol m) 'prettyexpand-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
67 ;;(define-key lisp-interaction-mode-map '(control symbol M) 'prettyexpand-all-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
68 ;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
69
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
70 ;; Pretty printing of the different cells of a symbol is done with the
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
71 ;; commands:
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
72 ;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
73 ;; M-x pp-function
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
74 ;; M-x pp-variable
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
75 ;; M-x pp-plist
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
76 ;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
77 ;; They print a symbol's function definition, variable value and
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
78 ;; property list, respectively. These commands pop up a separate
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
79 ;; window in which the pretty printed lisp object is displayed.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
80 ;; Completion for function and variable symbols is provided. If a
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
81 ;; function is byte compiled, `pp-function' proposes to call the Emacs
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
82 ;; Lisp disassembler (this feature only works for Emacs 19, as it
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
83 ;; needs the `compiled-function-p' predicate).
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
84 ;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
85 ;; To use the macro expander, put the cursor at the beginning of the
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
86 ;; form to be expanded, then type
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
87 ;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
88 ;; C-M-m (macroexpand-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
89 ;; or C-M-Sh-M (macroexpand-all-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
90 ;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
91 ;; Both commands will pop up a temporary window containing the
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
92 ;; macroexpanded code. The only difference is that the second command
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
93 ;; expands recursively all containing macro calls, while the first one
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
94 ;; does it only for the uppermost sexpression.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
95 ;; With a prefix argument, the macro expansion isn't displayed in a
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
96 ;; separate buffer but replaces the original code in the current
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
97 ;; buffer. Be aware: Comments will be lost.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
98 ;; You can get back the original sexpression using the `undo'
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
99 ;; command on `C-x u'.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
100 ;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
101 ;; There is also a prettyfied version of the macroexpander:
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
102 ;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
103 ;; C-Sym-m (prettyexpand-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
104 ;; or C-Sym-M (prettyexpand-all-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
105 ;;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
106 ;; The only difference with the corresponding macroexpand commands is
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
107 ;; that calls to macros specified in the variable
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
108 ;; `pp-shadow-expansion-list' are not expanded, in order to make the
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
109 ;; code look nicer. This is only useful for Lucid Emacs or code that
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
110 ;; uses Dave Gillespies cl package, as it inhibits expansion of the
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
111 ;; following macros: block, eval-when, defun*, defmacro*, function*,
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
112 ;; setf.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
113
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
114 ; Change History
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
115 ;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
116 ; $Log: pretty-print.el,v $
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
117 ; Revision 1.2 1997/01/04 21:20:13 steve
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
118 ; beta6 to beta7 patches
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
119 ;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
120 ; Revision 1.1 1997/01/01 21:45:30 steve
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
121 ; *** empty log message ***
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
122 ;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
123 ; Revision 1.4 1993/03/25 14:09:52 bosch
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
124 ; Commands `prettyexpand-sexp' and `prettyexpand-all-sexp' and
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
125 ; corresponding key bindings added. Commands pp-{function, variable}
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
126 ; rewritten. `pp-plist' added. Function `pp-internal-loop' (for Dave
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
127 ; Gillespies CL loop macro) added.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
128 ;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
129 ; Revision 1.3 1993/03/03 12:24:13 bosch
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
130 ; Macroexpander rewritten. Function `pp-macroexpand-all' added (snarfed
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
131 ; from Dave Gillespies cl-extra.el). Pretty printing for top level
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
132 ; defining forms added (`pp-internal-def'). Key bindings for
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
133 ; `emacs-lisp-mode-map' and `lisp-interaction-mode-map' added. Built-in
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
134 ; variable `print-gensym' set for printinng uninterned symbols. Started
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
135 ; adding support for cl-dg (defun*, defmacro*, ...). Minor bug fixes.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
136 ;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
137 ; Revision 1.2 1993/02/25 17:35:02 bosch
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
138 ; Comments about Emacs 18 compatibility added.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
139 ;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
140 ; Revision 1.1 1993/02/25 16:55:01 bosch
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
141 ; Initial revision
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
142 ;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
143 ;
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
144
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
145
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
146 ;; TO DO LIST
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
147 ;; ----------
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
148 ;; Provide full Emacs 18 compatibility.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
149
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
150 ;; Popper support
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
151 (defvar pp-buffer-name "*Pretty Print*")
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
152 (defvar pp-macroexpand-buffer-name "*Macro Expansion*")
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
153 (if (featurep 'popper)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
154 (or (eq popper-pop-buffers 't)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
155 (setq popper-pop-buffers
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
156 (cons pp-buffer-name
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
157 (cons pp-macroexpand-buffer-name
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
158 popper-pop-buffers)))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
159
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
160 ;; User level functions
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
161 ;;;###autoload
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
162 (defun pp-function (symbol)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
163 "Pretty print the function definition of SYMBOL in a seperate buffer"
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
164 (interactive
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
165 (list (pp-read-symbol 'fboundp "Pretty print function definition of: ")))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
166 (if (compiled-function-p (symbol-function symbol))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
167 (if (y-or-n-p
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
168 (format "Function %s is byte compiled. Disassemble? " symbol))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
169 (disassemble (symbol-function symbol))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
170 (pp-symbol-cell symbol 'symbol-function))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
171 (pp-symbol-cell symbol 'symbol-function)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
172
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
173 ;;;###autoload
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
174 (defun pp-variable (symbol)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
175 "Pretty print the variable value of SYMBOL in a seperate buffer"
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
176 (interactive
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
177 (list (pp-read-symbol 'boundp "Pretty print variable value of: ")))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
178 (pp-symbol-cell symbol 'symbol-value))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
179
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
180 ;;;###autoload
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
181 (defun pp-plist (symbol)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
182 "Pretty print the property list of SYMBOL in a seperate buffer"
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
183 (interactive
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
184 (list (pp-read-symbol 'symbol-plist "Pretty print property list of: ")))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
185 (pp-symbol-cell symbol 'symbol-plist))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
186
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
187 (defun pp-read-symbol (predicate prompt)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
188 "Read a symbol for which PREDICATE is true, promptiong with PROMPT."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
189 (let (symbol)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
190 (while (or (not symbol) (not (funcall predicate symbol)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
191 (setq symbol
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
192 (intern-soft
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
193 (completing-read
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
194 prompt
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
195 obarray
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
196 predicate
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
197 t
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
198 (and symbol (symbol-name symbol))))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
199 symbol))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
200
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
201 (defun pp-symbol-cell (symbol accessor)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
202 "Pretty print the contents of the cell of SYMBOL that can be reached
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
203 with the function ACCESSOR."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
204 (with-output-to-temp-buffer pp-buffer-name
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
205 (set-buffer pp-buffer-name)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
206 (emacs-lisp-mode)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
207 (erase-buffer)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
208 (pp-internal
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
209 (funcall accessor symbol)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
210 (format "%s's %s is:\n" symbol accessor))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
211 (terpri)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
212
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
213
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
214
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
215 ;; Macro expansion (user level)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
216
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
217 ;;;###autoload
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
218 (defun macroexpand-sexp (&optional replace)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
219 "Macro expand the sexpression following point. Pretty print expansion in a
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
220 temporary buffer. With prefix argument, replace the original
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
221 sexpression by its expansion in the current buffer."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
222 (interactive "P")
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
223 (pp-macroexpand-internal 'macroexpand replace t))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
224
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
225 ;;;###autoload
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
226 (defun macroexpand-all-sexp (&optional replace)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
227 "Macro expand recursively the sexpression following point. Pretty print
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
228 expansion in a temporary buffer. With prefix argument, replace the
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
229 original sexpression by its expansion in the current buffer."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
230 (interactive "P")
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
231 (pp-macroexpand-internal 'pp-macroexpand-all replace t))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
232
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
233 ;;;###autoload
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
234 (defun prettyexpand-sexp (&optional replace)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
235 "Macro expand the sexpression following point. Pretty print expansion
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
236 in a temporary buffer. With prefix argument, replace the original
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
237 sexpression by its expansion in the current buffer.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
238 However, calls to macros specified in the variable
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
239 `pp-shadow-expansion-list' are not expanded, in order to make the code
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
240 look nicer."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
241
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
242 (interactive "P")
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
243 (pp-macroexpand-internal 'macroexpand replace))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
244
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
245 ;;;###autoload
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
246 (defun prettyexpand-all-sexp (&optional replace)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
247 "Macro expand recursively the sexpression following point. Pretty print
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
248 expansion in a temporary buffer. With prefix argument, replace the
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
249 original sexpression by its expansion in the current buffer.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
250 However, calls to macros specified in the variable
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
251 `pp-shadow-expansion-list' are not expanded, in order to make the code
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
252 look nicer."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
253 (interactive "P")
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
254 (pp-macroexpand-internal 'pp-macroexpand-all replace))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
255
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
256 (define-key emacs-lisp-mode-map '(control meta m) 'macroexpand-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
257 (define-key emacs-lisp-mode-map '(control meta M) 'macroexpand-all-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
258 (define-key emacs-lisp-mode-map '(control symbol m) 'prettyexpand-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
259 (define-key emacs-lisp-mode-map '(control symbol M) 'prettyexpand-all-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
260
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
261 (define-key lisp-interaction-mode-map '(control meta m) 'macroexpand-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
262 (define-key lisp-interaction-mode-map '(control meta M) 'macroexpand-all-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
263 (define-key lisp-interaction-mode-map '(control symbol m) 'prettyexpand-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
264 (define-key lisp-interaction-mode-map '(control symbol M) 'prettyexpand-all-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
265
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
266
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
267 ;; Macro expansion (internals)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
268
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
269 (defvar pp-shadow-expansion-list
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
270 (mapcar 'list '(block eval-when defun* defmacro* function* setf))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
271 "The value of this variable is given as the optional environment
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
272 argument of the macroexpand functions. Forms specified in this list are
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
273 not expanded.")
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
274
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
275 (defun pp-macroexpand-internal
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
276 (macroexpand-function replace &optional dont-shadow)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
277 "Macro expand the sexp that starts at point, using
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
278 MACROEXPAND-FUNCTION. If REPLACE is non-nil, replace the original
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
279 text by its expansion, otherwise pretty print the expansion in a
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
280 temporary buffer. With optional argument DONT-SHADOW non-nil, do not
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
281 use the `pp-shadow-expansion-list' to inhibit expansion of some
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
282 forms."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
283
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
284 (interactive)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
285 (let ((expansion
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
286 (funcall
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
287 macroexpand-function
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
288 (let ((stab (syntax-table)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
289 (unwind-protect
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
290 (save-excursion
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
291 (set-syntax-table emacs-lisp-mode-syntax-table)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
292 ;; (forward-sexp 1)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
293 (read (current-buffer)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
294 (set-syntax-table stab)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
295 (if dont-shadow
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
296 nil
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
297 pp-shadow-expansion-list))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
298 (save-excursion
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
299 (if replace
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
300 (let ((start (point))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
301 (end (progn (forward-sexp 1) (point))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
302 (delete-region start end)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
303 (pp-internal expansion))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
304 (with-output-to-temp-buffer pp-macroexpand-buffer-name
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
305 (set-buffer pp-macroexpand-buffer-name)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
306 (erase-buffer)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
307 (emacs-lisp-mode)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
308 (pp-internal expansion))))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
309
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
310 ;; Internal pretty print functions
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
311
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
312 (defun pp-internal (form &optional title)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
313 "Pretty print FORM in in the current buffer.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
314 Optional string TITEL is inserted before the pretty print."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
315 (let (start)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
316 (if title (princ title))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
317 (setq start (point))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
318 ;; print-escape-newlines must be t, otherwise we cannot use
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
319 ;; (current-column) to detect good line breaks
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
320 (let ((print-escape-newlines t)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
321 (print-gensym t)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
322 )
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
323 (prin1 form (current-buffer))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
324 (goto-char start)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
325 (pp-internal-sexp))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
326
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
327 (defun pp-internal-sexp ()
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
328 "Pretty print the following sexp.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
329 Point must be on or before the first character."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
330
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
331 (skip-chars-forward " \n\t")
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
332 (let* ((char (following-char))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
333 (ch-class (char-syntax char))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
334 (start (point)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
335
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
336 (cond
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
337 ;; open paren
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
338 ((eq char ?\()
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
339 (down-list 1)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
340 (if (memq (char-syntax (following-char)) '(?_ ?w))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
341 (let ((symbol (read (current-buffer))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
342 (cond ((fboundp symbol)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
343 (goto-char start)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
344 (pp-internal-function symbol))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
345 ((memq symbol '(lambda macro))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
346 (pp-internal-lambda))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
347 (t
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
348 (goto-char start)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
349 (pp-internal-list))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
350 (up-list -1)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
351 (pp-internal-list)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
352
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
353 ;;symbols & strings
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
354 ((memq ch-class '(?_ ; symbol
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
355 ?w ; word
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
356 ?\" ; string
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
357 ?\\ ; escape
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
358 ?\' ; quote (for uninterned symbols)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
359 )) (forward-sexp 1))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
360
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
361 ;; vector
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
362 ((eq char ?\[) (pp-internal-list))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
363
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
364 ;; error otherwise
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
365 (t (error "pp-internal-sexp: character class not treated yet: `%c'"
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
366 ch-class)))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
367
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
368 (defun pp-internal-function (func)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
369 "Pretty print a functuion call.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
370 Point must be on the open paren. the function symbol may be passed as an
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
371 optional argument."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
372 (let ((start (point))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
373 (too-large (>= (save-excursion
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
374 (forward-sexp 1)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
375 (current-column))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
376 fill-column))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
377 (indent-info (get func lisp-indent-function)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
378 (down-list 1)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
379 ;; skip over function name
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
380 (forward-sexp 1)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
381 (cond
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
382 ((memq func '(let let*)) (pp-internal-let))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
383
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
384 ((eq func 'cond) (pp-internal-cond))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
385
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
386 ((memq func '(if while with-output-to-temp-buffer catch block))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
387 (pp-internal-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
388 (pp-internal-body 't))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
389
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
390 ((eq func 'quote) (pp-internal-quote))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
391
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
392 ((memq func '(progn
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
393 prog1 prog2
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
394 save-window-excursion
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
395 save-excursion
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
396 save-restriction))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
397 (pp-internal-body 't))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
398
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
399 ((memq func '(defun defmacro defsubst defun* defmacro*))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
400 (pp-internal-def))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
401
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
402 ((eq func 'loop) (pp-internal-loop))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
403
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
404 ('t (pp-internal-body too-large)))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
405
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
406 (defun pp-internal-def ()
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
407 (forward-sexp 1) ; skip name
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
408 (if (looking-at " nil") ; replace nil by ()
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
409 (replace-match " ()")
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
410 (forward-sexp 1))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
411 (if (looking-at " \"")
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
412 ;; comment string. Replace all escaped linefeeds by real ones
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
413 (let ((limit (save-excursion (forward-sexp 1) (point-marker))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
414 (newline-and-indent)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
415 (while (re-search-forward "\\\\n" limit t)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
416 (replace-match "\n" nil nil))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
417 (goto-char limit)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
418 (pp-internal-body 't))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
419
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
420 (defun pp-internal-list ()
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
421 "Pretty print a list or a vector.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
422 Point must be on the open paren."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
423 (let ((too-large (>= (save-excursion
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
424 (forward-sexp 1)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
425 (current-column))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
426 fill-column)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
427 (down-list 1)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
428 (pp-internal-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
429 (pp-internal-body too-large)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
430
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
431 (defun pp-internal-body (&optional force-indent)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
432 "Prety print a body of sexp. Stop after reaching a `)'. If argument
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
433 FORCE-INDENT is non-nil, break line after each sexpression of the
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
434 body."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
435 (skip-chars-forward " \n\t")
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
436 (let (ch-class)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
437 ;; while not closing paren
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
438 (while (/= (setq ch-class (char-syntax (following-char))) ?\))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
439 (if force-indent (newline-and-indent))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
440 (pp-internal-sexp))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
441 (up-list 1)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
442
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
443 (defun pp-internal-loop ()
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
444 "Prety print a loop body. Stop after reaching a `)'.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
445 Line breaks are done before the following keywords: "
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
446 (forward-sexp 1)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
447 (skip-chars-forward " \n\t")
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
448 (let (ch-class)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
449 ;; while not closing paren
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
450 (while (/= (setq ch-class (char-syntax (following-char))) ?\))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
451 (if (not (looking-at "for\\|repeat\\|with\\|while\\|until\\|always\\|never\\|thereis\\|collect\\|append\\|nconc\\|sum\\|count\\|maximize\\|minimize\\|if\\|when\\|else\\|unless\\|do\\W\\|initially\\|finally\\|return\\|named"))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
452 (pp-internal-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
453 (newline-and-indent)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
454 (forward-sexp 1))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
455 (skip-chars-forward " \n\t"))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
456 (up-list 1)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
457
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
458 (defun pp-internal-body-list ()
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
459 (let ((too-large (>= (save-excursion
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
460 (forward-sexp 1)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
461 (current-column))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
462 fill-column))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
463 ch-class)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
464 (down-list 1)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
465 (pp-internal-sexp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
466 (while (/= (setq ch-class (char-syntax (following-char))) ?\))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
467 (if too-large (newline-and-indent))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
468 (pp-internal-sexp))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
469 (up-list 1)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
470
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
471 (defun pp-internal-lambda ()
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
472 (forward-sexp 1) ; arguments
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
473 (pp-internal-body 't))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
474
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
475 (defun pp-internal-let ()
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
476 "Pretty print a let-like form.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
477 Cursor is behind funtion symbol."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
478 (down-list 1)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
479 (while (not (= (following-char) ?\)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
480 (if (= (following-char) ?\()
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
481 (pp-internal-body-list)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
482 (forward-sexp 1))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
483 (if (not (= (following-char) ?\)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
484 (newline-and-indent)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
485 (up-list 1)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
486 (pp-internal-body 't))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
487
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
488 (defun pp-internal-cond ()
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
489 "Pretty print a cond-like form.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
490 Cursor is behind funtion symbol."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
491 (skip-chars-forward " \n\t")
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
492 (while (not (= (following-char) ?\)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
493 (pp-internal-body-list)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
494 (if (not (= (following-char) ?\)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
495 (newline-and-indent)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
496 (up-list 1))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
497
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
498
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
499 (defun pp-internal-quote ()
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
500 "Pretty print a quoted list.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
501 Cursor is behind the symbol quote."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
502 (skip-chars-forward " \n\t")
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
503 (let ((end (point)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
504 (backward-sexp 1)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
505 (delete-region (point) end)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
506 (up-list -1)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
507 (setq end (point))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
508 (forward-sexp 1)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
509 (delete-char -1)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
510 (goto-char end)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
511 (delete-char 1)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
512 (insert "'")
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
513 (if (= (char-syntax (following-char)) ?\()
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
514 ;; don't print it as sexp, because it could be (let ... ) or
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
515 ;; (cond ... ) or whatever.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
516 (pp-internal-list)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
517 (pp-internal-sexp))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
518
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
519
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
520 ;; Stolen form Dave Gillespies cl-extra.el
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
521 (defun pp-macroexpand-all (form &optional env)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
522 "Expand all macro calls through a Lisp FORM.
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
523 This also does some trivial optimizations to make the form prettier."
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
524 (setq form (macroexpand form env))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
525 (cond
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
526 ((not (consp form)) form)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
527 ((memq (car form) '(let let*))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
528 (if (null (nth 1 form))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
529 (pp-macroexpand-all (cons 'progn (cdr (cdr form))) env)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
530 (cons (car form)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
531 (cons (pp-macroexpand-lets (nth 1 form) env)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
532 (pp-macroexpand-body (cdr (cdr form)) env)))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
533 ((eq (car form) 'cond)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
534 (cons (car form)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
535 (mapcar (function (lambda (x) (pp-macroexpand-body x env)))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
536 (cdr form))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
537 ((eq (car form) 'condition-case)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
538 (cons (car form)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
539 (cons (nth 1 form)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
540 (cons (pp-macroexpand-all (nth 2 form) env)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
541 (pp-macroexpand-lets
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
542 (cdr (cdr (cdr form))) env)))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
543 ((memq (car form) '(quote function))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
544 (if (eq (car-safe (nth 1 form)) 'lambda)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
545 (list (car form)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
546 (cons 'lambda
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
547 (cons (car (cdr (car (cdr form))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
548 (pp-macroexpand-body
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
549 (cdr (cdr (car (cdr form)))) env))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
550 form))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
551 ((memq (car form) '(defun defmacro))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
552 (cons (car form)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
553 (cons (nth 1 form)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
554 (pp-macroexpand-body (cdr (cdr form)) env))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
555 ((and (eq (car form) 'progn) (not (cdr (cdr form))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
556 (pp-macroexpand-all (nth 1 form) env))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
557 (t
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
558 (cons (car form) (pp-macroexpand-body (cdr form) env)))))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
559
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
560 (defun pp-macroexpand-body (body &optional env)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
561 (mapcar (function (lambda (x) (pp-macroexpand-all x env))) body))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
562
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
563 (defun pp-macroexpand-lets (list &optional env)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
564 (mapcar (function
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
565 (lambda (x)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
566 (if (consp x) (cons (car x) (pp-macroexpand-body (cdr x) env))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
567 x))) list))
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
568
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
569 (run-hooks 'pp-load-hook)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
570 (provide 'pp)
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
571
bcdc7deadc19 Import from CVS: tag r19-15b7
cvs
parents:
diff changeset
572 ;; end pp.el