annotate lisp/emacs-lisp/backquote.el @ 55434:f88632e54afb

2004-05-08 John Wiegley <johnw@newartisans.com> * iswitchb.el (iswitchb-use-virtual-buffers): Added support for "virtual buffers" (off by default), which makes it possible to switch to the buffers of recently files. When a buffer name search fails, and this option is on, iswitchb will look at the list of recently visited files, and permit matching against those names. When the user hits RET on a match, it will revisit that file. (iswitchb-read-buffer): Added two optional arguments, which makes isearchb.el possible. (iswitchb-completions, iswitchb-set-matches, iswitchb-prev-match, iswitchb-next-match): Added support for virtual buffers.
author John Wiegley <johnw@newartisans.com>
date Sat, 08 May 2004 13:00:52 +0000
parents 3c18d4160cc6
children 18a818a2ee7c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15261
bd56cdc4d07b Fixed up initial line
Erik Naggum <erik@naggum.no>
parents: 14169
diff changeset
1 ;;; backquote.el --- implement the ` Lisp construct
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13337
diff changeset
2
54494
3c18d4160cc6 (backquote-list*-macro): Use nreverse.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
3 ;; Copyright (C) 1990, 92, 1994, 2001, 2004 Free Software Foundation, Inc.
845
213978acbc1e entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 811
diff changeset
4
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
5 ;; Author: Rick Sladkey <jrs@world.std.com>
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
6 ;; Maintainer: FSF
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
7 ;; Keywords: extensions, internal
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 662
diff changeset
8
13337
84acc3adcd63 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 12606
diff changeset
9 ;; This file is part of GNU Emacs.
181
a587d037d637 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10
a587d037d637 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
a587d037d637 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
12244
ac7375e60931 Update GPL to version 2.
Karl Heuer <kwzh@gnu.org>
parents: 11687
diff changeset
13 ;; the Free Software Foundation; either version 2, or (at your option)
181
a587d037d637 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 ;; any later version.
a587d037d637 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15
a587d037d637 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
a587d037d637 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
a587d037d637 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a587d037d637 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19 ;; GNU General Public License for more details.
a587d037d637 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20
a587d037d637 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13337
diff changeset
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13337
diff changeset
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13337
diff changeset
24 ;; Boston, MA 02111-1307, USA.
181
a587d037d637 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25
13337
84acc3adcd63 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 12606
diff changeset
26 ;;; Commentary:
181
a587d037d637 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27
48172
ce9e21650e0c Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 39085
diff changeset
28 ;; When the Lisp reader sees `(...), it generates (\` (...)).
ce9e21650e0c Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 39085
diff changeset
29 ;; When it sees ,... inside such a backquote form, it generates (\, ...).
ce9e21650e0c Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 39085
diff changeset
30 ;; For ,@... it generates (\,@ ...).
ce9e21650e0c Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 39085
diff changeset
31
6224
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
32 ;; This backquote will generate calls to the backquote-list* form.
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
33 ;; Both a function version and a macro version are included.
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
34 ;; The macro version is used by default because it is faster
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
35 ;; and needs no run-time support. It should really be a subr.
181
a587d037d637 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 662
diff changeset
37 ;;; Code:
181
a587d037d637 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38
584
4cd7543be581 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 340
diff changeset
39 (provide 'backquote)
4cd7543be581 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 340
diff changeset
40
6224
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
41 ;; function and macro versions of backquote-list*
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
42
6224
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
43 (defun backquote-list*-function (first &rest list)
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
44 "Like `list' but the last argument is the tail of the new list.
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
45
6224
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
46 For example (backquote-list* 'a 'b 'c) => (a b . c)"
54494
3c18d4160cc6 (backquote-list*-macro): Use nreverse.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
47 ;; The recursive solution is much nicer:
3c18d4160cc6 (backquote-list*-macro): Use nreverse.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
48 ;; (if list (cons first (apply 'backquote-list*-function list)) first))
3c18d4160cc6 (backquote-list*-macro): Use nreverse.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
49 ;; but Emacs is not very good at efficiently processing recursion.
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
50 (if list
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
51 (let* ((rest list) (newlist (cons first nil)) (last newlist))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
52 (while (cdr rest)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
53 (setcdr last (cons (car rest) nil))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
54 (setq last (cdr last)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
55 rest (cdr rest)))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
56 (setcdr last (car rest))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
57 newlist)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
58 first))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
59
6224
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
60 (defmacro backquote-list*-macro (first &rest list)
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
61 "Like `list' but the last argument is the tail of the new list.
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
62
6224
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
63 For example (backquote-list* 'a 'b 'c) => (a b . c)"
54494
3c18d4160cc6 (backquote-list*-macro): Use nreverse.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
64 ;; The recursive solution is much nicer:
3c18d4160cc6 (backquote-list*-macro): Use nreverse.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
65 ;; (if list (list 'cons first (cons 'backquote-list*-macro list)) first))
3c18d4160cc6 (backquote-list*-macro): Use nreverse.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
66 ;; but Emacs is not very good at efficiently processing such things.
3c18d4160cc6 (backquote-list*-macro): Use nreverse.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
67 (setq list (nreverse (cons first list))
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
68 first (car list)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
69 list (cdr list))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
70 (if list
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
71 (let* ((second (car list))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
72 (rest (cdr list))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
73 (newlist (list 'cons second first)))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
74 (while rest
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
75 (setq newlist (list 'cons (car rest) newlist)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
76 rest (cdr rest)))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
77 newlist)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
78 first))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
79
7369
cc6d237a7c7e (backquote-backquote-symbol): Don't autoload defvar.
Richard M. Stallman <rms@gnu.org>
parents: 7299
diff changeset
80 (defalias 'backquote-list* (symbol-function 'backquote-list*-macro))
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
81
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
82 ;; A few advertised variables that control which symbols are used
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
83 ;; to represent the backquote, unquote, and splice operations.
27243
069b39c07c8d Remove inappropriate customization (allowing custom.el to use
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
84 (defconst backquote-backquote-symbol '\`
39085
97bb42866d17 (backquote-backquote-symbol)
Gerd Moellmann <gerd@gnu.org>
parents: 38412
diff changeset
85 "Symbol used to represent a backquote or nested backquote.")
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
86
27243
069b39c07c8d Remove inappropriate customization (allowing custom.el to use
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
87 (defconst backquote-unquote-symbol ',
39085
97bb42866d17 (backquote-backquote-symbol)
Gerd Moellmann <gerd@gnu.org>
parents: 38412
diff changeset
88 "Symbol used to represent an unquote inside a backquote.")
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
89
27243
069b39c07c8d Remove inappropriate customization (allowing custom.el to use
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
90 (defconst backquote-splice-symbol ',@
39085
97bb42866d17 (backquote-backquote-symbol)
Gerd Moellmann <gerd@gnu.org>
parents: 38412
diff changeset
91 "Symbol used to represent a splice inside a backquote.")
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
92
7299
44c38d99d3c4 (backquote): Add autoloads.
Richard M. Stallman <rms@gnu.org>
parents: 7298
diff changeset
93 ;;;###autoload
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
94 (defmacro backquote (arg)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
95 "Argument STRUCTURE describes a template to build.
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
96
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
97 The whole structure acts as if it were quoted except for certain
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
98 places where expressions are evaluated and inserted or spliced in.
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
99
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
100 For example:
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
101
11687
14c5ed91e3d0 ('\`): Use backslash for reading the backquote.
Richard M. Stallman <rms@gnu.org>
parents: 8209
diff changeset
102 b => (ba bb bc) ; assume b has this value
14c5ed91e3d0 ('\`): Use backslash for reading the backquote.
Richard M. Stallman <rms@gnu.org>
parents: 8209
diff changeset
103 `(a b c) => (a b c) ; backquote acts like quote
12606
410385a28fb8 (backquote): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 12244
diff changeset
104 `(a ,b c) => (a (ba bb bc) c) ; insert the value of b
410385a28fb8 (backquote): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 12244
diff changeset
105 `(a ,@b c) => (a ba bb bc c) ; splice in the value of b
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
106
6224
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
107 Vectors work just like lists. Nested backquotes are permitted."
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
108 (cdr (backquote-process arg)))
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
109
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
110 ;; GNU Emacs has no reader macros
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
111
7299
44c38d99d3c4 (backquote): Add autoloads.
Richard M. Stallman <rms@gnu.org>
parents: 7298
diff changeset
112 ;;;###autoload
11687
14c5ed91e3d0 ('\`): Use backslash for reading the backquote.
Richard M. Stallman <rms@gnu.org>
parents: 8209
diff changeset
113 (defalias '\` (symbol-function 'backquote))
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
114
6224
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
115 ;; backquote-process returns a dotted-pair of a tag (0, 1, or 2) and
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
116 ;; the backquote-processed structure. 0 => the structure is
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
117 ;; constant, 1 => to be unquoted, 2 => to be spliced in.
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
118 ;; The top-level backquote macro just discards the tag.
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
119
6224
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
120 (defun backquote-process (s)
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
121 (cond
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
122 ((vectorp s)
6224
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
123 (let ((n (backquote-process (append s ()))))
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
124 (if (= (car n) 0)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
125 (cons 0 s)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
126 (cons 1 (cond
38028
a5aad5623acc (backquote-process): Handle `[,@SYMBOL].
Richard M. Stallman <rms@gnu.org>
parents: 27243
diff changeset
127 ((not (listp (cdr n)))
a5aad5623acc (backquote-process): Handle `[,@SYMBOL].
Richard M. Stallman <rms@gnu.org>
parents: 27243
diff changeset
128 (list 'vconcat (cdr n)))
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
129 ((eq (nth 1 n) 'list)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
130 (cons 'vector (nthcdr 2 n)))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
131 ((eq (nth 1 n) 'append)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
132 (cons 'vconcat (nthcdr 2 n)))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
133 (t
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
134 (list 'apply '(function vector) (cdr n))))))))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
135 ((atom s)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
136 (cons 0 (if (or (null s) (eq s t) (not (symbolp s)))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
137 s
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
138 (list 'quote s))))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
139 ((eq (car s) backquote-unquote-symbol)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
140 (cons 1 (nth 1 s)))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
141 ((eq (car s) backquote-splice-symbol)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
142 (cons 2 (nth 1 s)))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
143 ((eq (car s) backquote-backquote-symbol)
6224
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
144 (backquote-process (cdr (backquote-process (nth 1 s)))))
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
145 (t
6835
922626d0570d (backquote-process): Don't crash if ultimate
Richard M. Stallman <rms@gnu.org>
parents: 6224
diff changeset
146 (let ((rest s)
922626d0570d (backquote-process): Don't crash if ultimate
Richard M. Stallman <rms@gnu.org>
parents: 6224
diff changeset
147 item firstlist list lists expression)
922626d0570d (backquote-process): Don't crash if ultimate
Richard M. Stallman <rms@gnu.org>
parents: 6224
diff changeset
148 ;; Scan this list-level, setting LISTS to a list of forms,
922626d0570d (backquote-process): Don't crash if ultimate
Richard M. Stallman <rms@gnu.org>
parents: 6224
diff changeset
149 ;; each of which produces a list of elements
922626d0570d (backquote-process): Don't crash if ultimate
Richard M. Stallman <rms@gnu.org>
parents: 6224
diff changeset
150 ;; that should go in this level.
49598
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48172
diff changeset
151 ;; The order of LISTS is backwards.
6835
922626d0570d (backquote-process): Don't crash if ultimate
Richard M. Stallman <rms@gnu.org>
parents: 6224
diff changeset
152 ;; If there are non-splicing elements (constant or variable)
922626d0570d (backquote-process): Don't crash if ultimate
Richard M. Stallman <rms@gnu.org>
parents: 6224
diff changeset
153 ;; at the beginning, put them in FIRSTLIST,
922626d0570d (backquote-process): Don't crash if ultimate
Richard M. Stallman <rms@gnu.org>
parents: 6224
diff changeset
154 ;; as a list of tagged values (TAG . FORM).
922626d0570d (backquote-process): Don't crash if ultimate
Richard M. Stallman <rms@gnu.org>
parents: 6224
diff changeset
155 ;; If there are any at the end, they go in LIST, likewise.
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
156 (while (consp rest)
6835
922626d0570d (backquote-process): Don't crash if ultimate
Richard M. Stallman <rms@gnu.org>
parents: 6224
diff changeset
157 ;; Turn . (, foo) into (,@ foo).
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
158 (if (eq (car rest) backquote-unquote-symbol)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
159 (setq rest (list (list backquote-splice-symbol (nth 1 rest)))))
6224
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
160 (setq item (backquote-process (car rest)))
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
161 (cond
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
162 ((= (car item) 2)
8007
5b6bbe9478b5 (backquote-process): Fix criterion for using FIRSTLIST.
Richard M. Stallman <rms@gnu.org>
parents: 7369
diff changeset
163 ;; Put the nonspliced items before the first spliced item
5b6bbe9478b5 (backquote-process): Fix criterion for using FIRSTLIST.
Richard M. Stallman <rms@gnu.org>
parents: 7369
diff changeset
164 ;; into FIRSTLIST.
5b6bbe9478b5 (backquote-process): Fix criterion for using FIRSTLIST.
Richard M. Stallman <rms@gnu.org>
parents: 7369
diff changeset
165 (if (null lists)
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
166 (setq firstlist list
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
167 list nil))
8007
5b6bbe9478b5 (backquote-process): Fix criterion for using FIRSTLIST.
Richard M. Stallman <rms@gnu.org>
parents: 7369
diff changeset
168 ;; Otherwise, put any preceding nonspliced items into LISTS.
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
169 (if list
6224
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
170 (setq lists (cons (backquote-listify list '(0 . nil)) lists)))
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
171 (setq lists (cons (cdr item) lists))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
172 (setq list nil))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
173 (t
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
174 (setq list (cons item list))))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
175 (setq rest (cdr rest)))
6835
922626d0570d (backquote-process): Don't crash if ultimate
Richard M. Stallman <rms@gnu.org>
parents: 6224
diff changeset
176 ;; Handle nonsplicing final elements, and the tail of the list
922626d0570d (backquote-process): Don't crash if ultimate
Richard M. Stallman <rms@gnu.org>
parents: 6224
diff changeset
177 ;; (which remains in REST).
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
178 (if (or rest list)
6224
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
179 (setq lists (cons (backquote-listify list (backquote-process rest))
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
180 lists)))
49598
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48172
diff changeset
181 ;; Turn LISTS into a form that produces the combined list.
6835
922626d0570d (backquote-process): Don't crash if ultimate
Richard M. Stallman <rms@gnu.org>
parents: 6224
diff changeset
182 (setq expression
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
183 (if (or (cdr lists)
6835
922626d0570d (backquote-process): Don't crash if ultimate
Richard M. Stallman <rms@gnu.org>
parents: 6224
diff changeset
184 (eq (car-safe (car lists)) backquote-splice-symbol))
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
185 (cons 'append (nreverse lists))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
186 (car lists)))
6835
922626d0570d (backquote-process): Don't crash if ultimate
Richard M. Stallman <rms@gnu.org>
parents: 6224
diff changeset
187 ;; Tack on any initial elements.
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
188 (if firstlist
6835
922626d0570d (backquote-process): Don't crash if ultimate
Richard M. Stallman <rms@gnu.org>
parents: 6224
diff changeset
189 (setq expression (backquote-listify firstlist (cons 1 expression))))
922626d0570d (backquote-process): Don't crash if ultimate
Richard M. Stallman <rms@gnu.org>
parents: 6224
diff changeset
190 (if (eq (car-safe expression) 'quote)
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
191 (cons 0 (list 'quote s))
6835
922626d0570d (backquote-process): Don't crash if ultimate
Richard M. Stallman <rms@gnu.org>
parents: 6224
diff changeset
192 (cons 1 expression))))))
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
193
6224
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
194 ;; backquote-listify takes (tag . structure) pairs from backquote-process
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
195 ;; and decides between append, list, backquote-list*, and cons depending
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
196 ;; on which tags are in the list.
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
197
6224
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
198 (defun backquote-listify (list old-tail)
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
199 (let ((heads nil) (tail (cdr old-tail)) (list-tail list) (item nil))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
200 (if (= (car old-tail) 0)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
201 (setq tail (eval tail)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
202 old-tail nil))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
203 (while (consp list-tail)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
204 (setq item (car list-tail))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
205 (setq list-tail (cdr list-tail))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
206 (if (or heads old-tail (/= (car item) 0))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
207 (setq heads (cons (cdr item) heads))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
208 (setq tail (cons (eval (cdr item)) tail))))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
209 (cond
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
210 (tail
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
211 (if (null old-tail)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
212 (setq tail (list 'quote tail)))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
213 (if heads
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
214 (let ((use-list* (or (cdr heads)
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
215 (and (consp (car heads))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
216 (eq (car (car heads))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
217 backquote-splice-symbol)))))
6224
a27c028e757a (backquote-listify): Renamed from bq-listify.
Richard M. Stallman <rms@gnu.org>
parents: 6223
diff changeset
218 (cons (if use-list* 'backquote-list* 'cons)
6223
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
219 (append heads (list tail))))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
220 tail))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
221 (t (cons 'list heads)))))
de6afd5ec418 Complete rewrite by Sladkey.
Richard M. Stallman <rms@gnu.org>
parents: 3591
diff changeset
222
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49598
diff changeset
223 ;;; arch-tag: 1a26206a-6b5e-4c56-8e24-2eef0f7e0e7a
38412
253f761ad37b Some fixes to follow coding conventions in files maintained by FSF.
Pavel Janík <Pavel@Janik.cz>
parents: 38028
diff changeset
224 ;;; backquote.el ends here