annotate lisp/emacs-lisp/cl-macs.el @ 51010:f79532778159

Rewrote the local minor mode so that it can be sticky as well and made sticky the default. Reimplemented the global minor mode. Updated the commentary section to document these changes. (hl-line-sticky-flag): New user option. (hl-line-overlay): Made it buffer-local and gave it a docstring. (global-hl-line-overlay): New variable. (hl-line-mode): Rewritten to use `hl-line-sticky-flag'. (hl-line-highlight): Rewritten to use `hl-line-sticky-flag'. (hl-line-unhighlight): Updated docstring. (global-hl-line-mode): Implemented directly so that is does not depend on `hl-line-mode' any more. (global-hl-line-highlight, global-hl-line-unhighlight): New functions.
author Lute Kamstra <lute@gnu.org>
date Thu, 15 May 2003 13:21:23 +0000
parents bb29b3dba5ac
children a44b585395b5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16057
a74507d555ba Turn on byte-compile-dynamic.
Richard M. Stallman <rms@gnu.org>
parents: 15030
diff changeset
1 ;;; cl-macs.el --- Common Lisp macros -*-byte-compile-dynamic: t;-*-
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3 ;; Copyright (C) 1993 Free Software Foundation, Inc.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5 ;; Author: Dave Gillespie <daveg@synaptics.com>
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
6 ;; Version: 2.02
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7 ;; Keywords: extensions
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9 ;; This file is part of GNU Emacs.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
691a28818487 entered into RCS
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: 7942
diff changeset
13 ;; the Free Software Foundation; either version 2, or (at your option)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 ;; any later version.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19 ;; GNU General Public License for more details.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20
691a28818487 entered into RCS
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.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25
7942
bc5dccc5375f Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 4355
diff changeset
26 ;;; Commentary:
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
28 ;; These are extensions to Emacs Lisp that provide a degree of
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
29 ;; Common Lisp compatibility, beyond what is already built-in
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
30 ;; in Emacs Lisp.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31 ;;
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
32 ;; This package was written by Dave Gillespie; it is a complete
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
33 ;; rewrite of Cesar Quiroz's original cl.el package of December 1986.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34 ;;
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
35 ;; Bug reports, comments, and suggestions are welcome!
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37 ;; This file contains the portions of the Common Lisp extensions
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38 ;; package which should be autoloaded, but need only be present
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39 ;; if the compiler or interpreter is used---this file is not
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40 ;; necessary for executing compiled code.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
42 ;; See cl.el for Change Log.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44
7942
bc5dccc5375f Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 4355
diff changeset
45 ;;; Code:
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
47 (or (memq 'cl-19 features)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
48 (error "Tried to load `cl-macs' before `cl'!"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
49
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
51 (defmacro cl-pop2 (place)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
52 (list 'prog1 (list 'car (list 'cdr place))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
53 (list 'setq place (list 'cdr (list 'cdr place)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
54 (put 'cl-pop2 'edebug-form-spec 'edebug-sexps)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
55
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
56 (defvar cl-optimize-safety)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
57 (defvar cl-optimize-speed)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
58
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
59
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60 ;;; This kludge allows macros which use cl-transform-function-property
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
61 ;;; to be called at compile-time.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
62
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
63 (require
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
64 (progn
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
65 (or (fboundp 'cl-transform-function-property)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
66 (defalias 'cl-transform-function-property
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
67 (function (lambda (n p f)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
68 (list 'put (list 'quote n) (list 'quote p)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
69 (list 'function (cons 'lambda f)))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
70 (car (or features (setq features (list 'cl-kludge))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
71
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
72
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
73 ;;; Initialization.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
74
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
75 (defvar cl-old-bc-file-form nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
76
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
77 (defun cl-compile-time-init ()
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
78 (run-hooks 'cl-hack-bytecomp-hook))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
79
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
80
48550
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
81 ;;; Some predicates for analyzing Lisp forms. These are used by various
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
82 ;;; macro expanders to optimize the results in certain common cases.
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
83
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
84 (defconst cl-simple-funcs '(car cdr nth aref elt if and or + - 1+ 1- min max
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
85 car-safe cdr-safe progn prog1 prog2))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
86 (defconst cl-safe-funcs '(* / % length memq list vector vectorp
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
87 < > <= >= = error))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
88
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
89 ;;; Check if no side effects, and executes quickly.
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
90 (defun cl-simple-expr-p (x &optional size)
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
91 (or size (setq size 10))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
92 (if (and (consp x) (not (memq (car x) '(quote function function*))))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
93 (and (symbolp (car x))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
94 (or (memq (car x) cl-simple-funcs)
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
95 (get (car x) 'side-effect-free))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
96 (progn
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
97 (setq size (1- size))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
98 (while (and (setq x (cdr x))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
99 (setq size (cl-simple-expr-p (car x) size))))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
100 (and (null x) (>= size 0) size)))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
101 (and (> size 0) (1- size))))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
102
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
103 (defun cl-simple-exprs-p (xs)
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
104 (while (and xs (cl-simple-expr-p (car xs)))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
105 (setq xs (cdr xs)))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
106 (not xs))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
107
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
108 ;;; Check if no side effects.
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
109 (defun cl-safe-expr-p (x)
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
110 (or (not (and (consp x) (not (memq (car x) '(quote function function*)))))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
111 (and (symbolp (car x))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
112 (or (memq (car x) cl-simple-funcs)
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
113 (memq (car x) cl-safe-funcs)
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
114 (get (car x) 'side-effect-free))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
115 (progn
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
116 (while (and (setq x (cdr x)) (cl-safe-expr-p (car x))))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
117 (null x)))))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
118
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
119 ;;; Check if constant (i.e., no side effects or dependencies).
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
120 (defun cl-const-expr-p (x)
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
121 (cond ((consp x)
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
122 (or (eq (car x) 'quote)
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
123 (and (memq (car x) '(function function*))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
124 (or (symbolp (nth 1 x))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
125 (and (eq (car-safe (nth 1 x)) 'lambda) 'func)))))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
126 ((symbolp x) (and (memq x '(nil t)) t))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
127 (t t)))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
128
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
129 (defun cl-const-exprs-p (xs)
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
130 (while (and xs (cl-const-expr-p (car xs)))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
131 (setq xs (cdr xs)))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
132 (not xs))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
133
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
134 (defun cl-const-expr-val (x)
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
135 (and (eq (cl-const-expr-p x) t) (if (consp x) (nth 1 x) x)))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
136
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
137 (defun cl-expr-access-order (x v)
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
138 (if (cl-const-expr-p x) v
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
139 (if (consp x)
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
140 (progn
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
141 (while (setq x (cdr x)) (setq v (cl-expr-access-order (car x) v)))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
142 v)
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
143 (if (eq x (car v)) (cdr v) '(t)))))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
144
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
145 ;;; Count number of times X refers to Y. Return nil for 0 times.
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
146 (defun cl-expr-contains (x y)
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
147 (cond ((equal y x) 1)
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
148 ((and (consp x) (not (memq (car-safe x) '(quote function function*))))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
149 (let ((sum 0))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
150 (while x
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
151 (setq sum (+ sum (or (cl-expr-contains (pop x) y) 0))))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
152 (and (> sum 0) sum)))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
153 (t nil)))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
154
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
155 (defun cl-expr-contains-any (x y)
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
156 (while (and y (not (cl-expr-contains x (car y)))) (pop y))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
157 y)
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
158
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
159 ;;; Check whether X may depend on any of the symbols in Y.
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
160 (defun cl-expr-depends-p (x y)
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
161 (and (not (cl-const-expr-p x))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
162 (or (not (cl-safe-expr-p x)) (cl-expr-contains-any x y))))
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
163
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164 ;;; Symbols.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
165
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
166 (defvar *gensym-counter*)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
167 (defun gensym (&optional arg)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168 "Generate a new uninterned symbol.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169 The name is made by appending a number to PREFIX, default \"G\"."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
170 (let ((prefix (if (stringp arg) arg "G"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171 (num (if (integerp arg) arg
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172 (prog1 *gensym-counter*
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
173 (setq *gensym-counter* (1+ *gensym-counter*))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
174 (make-symbol (format "%s%d" prefix num))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
176 (defun gentemp (&optional arg)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
177 "Generate a new interned symbol with a unique name.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
178 The name is made by appending a number to PREFIX, default \"G\"."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
179 (let ((prefix (if (stringp arg) arg "G"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
180 name)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
181 (while (intern-soft (setq name (format "%s%d" prefix *gensym-counter*)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182 (setq *gensym-counter* (1+ *gensym-counter*)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
183 (intern name)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186 ;;; Program structure.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 (defmacro defun* (name args &rest body)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
189 "Define NAME as a function.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 Like normal `defun', except ARGLIST allows full Common Lisp conventions,
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
191 and BODY is implicitly surrounded by (block NAME ...).
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
192
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
193 \(fn NAME ARGLIST [DOCSTRING] BODY...)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194 (let* ((res (cl-transform-lambda (cons args body) name))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 (form (list* 'defun name (cdr res))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 (if (car res) (list 'progn (car res) form) form)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 (defmacro defmacro* (name args &rest body)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
199 "Define NAME as a macro.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200 Like normal `defmacro', except ARGLIST allows full Common Lisp conventions,
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
201 and BODY is implicitly surrounded by (block NAME ...).
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
202
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
203 \(fn NAME ARGLIST [DOCSTRING] BODY...)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204 (let* ((res (cl-transform-lambda (cons args body) name))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 (form (list* 'defmacro name (cdr res))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206 (if (car res) (list 'progn (car res) form) form)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208 (defmacro function* (func)
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
209 "Introduce a function.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 Like normal `function', except that if argument is a lambda form, its
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 ARGLIST allows full Common Lisp conventions."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212 (if (eq (car-safe func) 'lambda)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 (let* ((res (cl-transform-lambda (cdr func) 'cl-none))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 (form (list 'function (cons 'lambda (cdr res)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 (if (car res) (list 'progn (car res) form) form))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
216 (list 'function func)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
218 (defun cl-transform-function-property (func prop form)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
219 (let ((res (cl-transform-lambda form func)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
220 (append '(progn) (cdr (cdr (car res)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
221 (list (list 'put (list 'quote func) (list 'quote prop)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
222 (list 'function (cons 'lambda (cdr res))))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
223
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
224 (defconst lambda-list-keywords
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
225 '(&optional &rest &key &allow-other-keys &aux &whole &body &environment))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
226
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
227 (defvar cl-macro-environment nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
228 (defvar bind-block) (defvar bind-defs) (defvar bind-enquote)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
229 (defvar bind-inits) (defvar bind-lets) (defvar bind-forms)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
230
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
231 (defun cl-transform-lambda (form bind-block)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
232 (let* ((args (car form)) (body (cdr form)) (orig-args args)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
233 (bind-defs nil) (bind-enquote nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
234 (bind-inits nil) (bind-lets nil) (bind-forms nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
235 (header nil) (simple-args nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
236 (while (or (stringp (car body)) (eq (car-safe (car body)) 'interactive))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
237 (push (pop body) header))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238 (setq args (if (listp args) (copy-list args) (list '&rest args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 (let ((p (last args))) (if (cdr p) (setcdr p (list '&rest (cdr p)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 (if (setq bind-defs (cadr (memq '&cl-defs args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241 (setq args (delq '&cl-defs (delq bind-defs args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
242 bind-defs (cadr bind-defs)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243 (if (setq bind-enquote (memq '&cl-quote args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244 (setq args (delq '&cl-quote args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245 (if (memq '&whole args) (error "&whole not currently implemented"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246 (let* ((p (memq '&environment args)) (v (cadr p)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247 (if p (setq args (nconc (delq (car p) (delq v args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 (list '&aux (list v 'cl-macro-environment))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 (while (and args (symbolp (car args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
250 (not (memq (car args) '(nil &rest &body &key &aux)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251 (not (and (eq (car args) '&optional)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252 (or bind-defs (consp (cadr args))))))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
253 (push (pop args) simple-args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
254 (or (eq bind-block 'cl-none)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
255 (setq body (list (list* 'block bind-block body))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
256 (if (null args)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
257 (list* nil (nreverse simple-args) (nconc (nreverse header) body))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
258 (if (memq '&optional simple-args) (push '&optional args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
259 (cl-do-arglist args nil (- (length simple-args)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260 (if (memq '&optional simple-args) 1 0)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261 (setq bind-lets (nreverse bind-lets))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
262 (list* (and bind-inits (list* 'eval-when '(compile load eval)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
263 (nreverse bind-inits)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264 (nconc (nreverse simple-args)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
265 (list '&rest (car (pop bind-lets))))
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
266 (nconc (let ((hdr (nreverse header)))
48550
cbc642547375 Move `predicates for analyzing Lisp
Dave Love <fx@gnu.org>
parents: 47665
diff changeset
267 (require 'help-fns)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
268 (cons (help-add-fundoc-usage
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
269 (if (stringp (car hdr)) (pop hdr)) orig-args)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
270 hdr))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
271 (list (nconc (list 'let* bind-lets)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
272 (nreverse bind-forms) body)))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274 (defun cl-do-arglist (args expr &optional num) ; uses bind-*
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
275 (if (nlistp args)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
276 (if (or (memq args lambda-list-keywords) (not (symbolp args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
277 (error "Invalid argument name: %s" args)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
278 (push (list args expr) bind-lets))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
279 (setq args (copy-list args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280 (let ((p (last args))) (if (cdr p) (setcdr p (list '&rest (cdr p)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
281 (let ((p (memq '&body args))) (if p (setcar p '&rest)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282 (if (memq '&environment args) (error "&environment used incorrectly"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283 (let ((save-args args)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284 (restarg (memq '&rest args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 (safety (if (cl-compiling-file) cl-optimize-safety 3))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 (keys nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 (laterarg nil) (exactarg nil) minarg)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 (or num (setq num 0))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 (if (listp (cadr restarg))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290 (setq restarg (gensym "--rest--"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291 (setq restarg (cadr restarg)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
292 (push (list restarg expr) bind-lets)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293 (if (eq (car args) '&whole)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
294 (push (list (cl-pop2 args) restarg) bind-lets))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295 (let ((p args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 (setq minarg restarg)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 (while (and p (not (memq (car p) lambda-list-keywords)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298 (or (eq p args) (setq minarg (list 'cdr minarg)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299 (setq p (cdr p)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300 (if (memq (car p) '(nil &aux))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
301 (setq minarg (list '= (list 'length restarg)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
302 (length (ldiff args p)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
303 exactarg (not (eq args p)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
304 (while (and args (not (memq (car args) lambda-list-keywords)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
305 (let ((poparg (list (if (or (cdr args) (not exactarg)) 'pop 'car)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
306 restarg)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307 (cl-do-arglist
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
308 (pop args)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309 (if (or laterarg (= safety 0)) poparg
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310 (list 'if minarg poparg
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311 (list 'signal '(quote wrong-number-of-arguments)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
312 (list 'list (and (not (eq bind-block 'cl-none))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 (list 'quote bind-block))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 (list 'length restarg)))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
315 (setq num (1+ num) laterarg t))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
316 (while (and (eq (car args) '&optional) (pop args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
317 (while (and args (not (memq (car args) lambda-list-keywords)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
318 (let ((arg (pop args)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319 (or (consp arg) (setq arg (list arg)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
320 (if (cddr arg) (cl-do-arglist (nth 2 arg) (list 'and restarg t)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321 (let ((def (if (cdr arg) (nth 1 arg)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
322 (or (car bind-defs)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
323 (nth 1 (assq (car arg) bind-defs)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
324 (poparg (list 'pop restarg)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325 (and def bind-enquote (setq def (list 'quote def)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
326 (cl-do-arglist (car arg)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
327 (if def (list 'if restarg poparg def) poparg))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
328 (setq num (1+ num))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
329 (if (eq (car args) '&rest)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
330 (let ((arg (cl-pop2 args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
331 (if (consp arg) (cl-do-arglist arg restarg)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
332 (or (eq (car args) '&key) (= safety 0) exactarg
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
333 (push (list 'if restarg
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
334 (list 'signal '(quote wrong-number-of-arguments)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
335 (list 'list
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
336 (and (not (eq bind-block 'cl-none))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
337 (list 'quote bind-block))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
338 (list '+ num (list 'length restarg)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339 bind-forms)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
340 (while (and (eq (car args) '&key) (pop args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 (while (and args (not (memq (car args) lambda-list-keywords)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
342 (let ((arg (pop args)))
38259
f4336b326ad3 (cl-do-arglist): Revert change of
Gerd Moellmann <gerd@gnu.org>
parents: 32490
diff changeset
343 (or (consp arg) (setq arg (list arg)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 (let* ((karg (if (consp (car arg)) (caar arg)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345 (intern (format ":%s" (car arg)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
346 (varg (if (consp (car arg)) (cadar arg) (car arg)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 (def (if (cdr arg) (cadr arg)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 (or (car bind-defs) (cadr (assq varg bind-defs)))))
38259
f4336b326ad3 (cl-do-arglist): Revert change of
Gerd Moellmann <gerd@gnu.org>
parents: 32490
diff changeset
349 (look (list 'memq (list 'quote karg) restarg)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350 (and def bind-enquote (setq def (list 'quote def)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
351 (if (cddr arg)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
352 (let* ((temp (or (nth 2 arg) (gensym)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353 (val (list 'car (list 'cdr temp))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354 (cl-do-arglist temp look)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
355 (cl-do-arglist varg
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
356 (list 'if temp
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
357 (list 'prog1 val (list 'setq temp t))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
358 def)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
359 (cl-do-arglist
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
360 varg
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
361 (list 'car
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
362 (list 'cdr
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
363 (if (null def)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
364 look
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
365 (list 'or look
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
366 (if (eq (cl-const-expr-p def) t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
367 (list
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
368 'quote
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
369 (list nil (cl-const-expr-val def)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
370 (list 'list nil def))))))))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
371 (push karg keys)))))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
372 (setq keys (nreverse keys))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
373 (or (and (eq (car args) '&allow-other-keys) (pop args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374 (null keys) (= safety 0)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
375 (let* ((var (gensym "--keys--"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
376 (allow '(:allow-other-keys))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377 (check (list
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378 'while var
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379 (list
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 'cond
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 (list (list 'memq (list 'car var)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 (list 'quote (append keys allow)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 (list 'setq var (list 'cdr (list 'cdr var))))
38259
f4336b326ad3 (cl-do-arglist): Revert change of
Gerd Moellmann <gerd@gnu.org>
parents: 32490
diff changeset
384 (list (list 'car
f4336b326ad3 (cl-do-arglist): Revert change of
Gerd Moellmann <gerd@gnu.org>
parents: 32490
diff changeset
385 (list 'cdr
f4336b326ad3 (cl-do-arglist): Revert change of
Gerd Moellmann <gerd@gnu.org>
parents: 32490
diff changeset
386 (list 'memq (cons 'quote allow)
f4336b326ad3 (cl-do-arglist): Revert change of
Gerd Moellmann <gerd@gnu.org>
parents: 32490
diff changeset
387 restarg)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388 (list 'setq var nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389 (list t
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 (list
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 'error
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392 (format "Keyword argument %%s not one of %s"
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393 keys)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394 (list 'car var)))))))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
395 (push (list 'let (list (list var restarg)) check) bind-forms)))
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
396 (while (and (eq (car args) '&aux) (pop args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397 (while (and args (not (memq (car args) lambda-list-keywords)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
398 (if (consp (car args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
399 (if (and bind-enquote (cadar args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
400 (cl-do-arglist (caar args)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
401 (list 'quote (cadr (pop args))))
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
402 (cl-do-arglist (caar args) (cadr (pop args))))
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
403 (cl-do-arglist (pop args) nil))))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
404 (if args (error "Malformed argument list %s" save-args)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
405
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
406 (defun cl-arglist-args (args)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407 (if (nlistp args) (list args)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
408 (let ((res nil) (kind nil) arg)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
409 (while (consp args)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
410 (setq arg (pop args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
411 (if (memq arg lambda-list-keywords) (setq kind arg)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
412 (if (eq arg '&cl-defs) (pop args)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413 (and (consp arg) kind (setq arg (car arg)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
414 (and (consp arg) (cdr arg) (eq kind '&key) (setq arg (cadr arg)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
415 (setq res (nconc res (cl-arglist-args arg))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
416 (nconc res (and args (list args))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
417
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
418 (defmacro destructuring-bind (args expr &rest body)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
419 (let* ((bind-lets nil) (bind-forms nil) (bind-inits nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
420 (bind-defs nil) (bind-block 'cl-none))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
421 (cl-do-arglist (or args '(&aux)) expr)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
422 (append '(progn) bind-inits
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
423 (list (nconc (list 'let* (nreverse bind-lets))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424 (nreverse bind-forms) body)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
425
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
426
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
427 ;;; The `eval-when' form.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
428
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
429 (defvar cl-not-toplevel nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
430
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431 (defmacro eval-when (when &rest body)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
432 "Control when BODY is evaluated.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
433 If `compile' is in WHEN, BODY is evaluated when compiled at top-level.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
434 If `load' is in WHEN, BODY is evaluated when loaded after top-level compile.
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
435 If `eval' is in WHEN, BODY is evaluated when interpreted or at non-top-level.
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
436
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
437 \(fn (WHEN...) BODY...)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
438 (if (and (fboundp 'cl-compiling-file) (cl-compiling-file)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
439 (not cl-not-toplevel) (not (boundp 'for-effect))) ; horrible kludge
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
440 (let ((comp (or (memq 'compile when) (memq :compile-toplevel when)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
441 (cl-not-toplevel t))
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
442 (if (or (memq 'load when) (memq :load-toplevel when))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
443 (if comp (cons 'progn (mapcar 'cl-compile-time-too body))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
444 (list* 'if nil nil body))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
445 (progn (if comp (eval (cons 'progn body))) nil)))
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
446 (and (or (memq 'eval when) (memq :execute when))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
447 (cons 'progn body))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
448
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
449 (defun cl-compile-time-too (form)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
450 (or (and (symbolp (car-safe form)) (get (car-safe form) 'byte-hunk-handler))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
451 (setq form (macroexpand
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
452 form (cons '(eval-when) byte-compile-macro-environment))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
453 (cond ((eq (car-safe form) 'progn)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
454 (cons 'progn (mapcar 'cl-compile-time-too (cdr form))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
455 ((eq (car-safe form) 'eval-when)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
456 (let ((when (nth 1 form)))
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
457 (if (or (memq 'eval when) (memq :execute when))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
458 (list* 'eval-when (cons 'compile when) (cddr form))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
459 form)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
460 (t (eval form) form)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
461
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
462 (defmacro load-time-value (form &optional read-only)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
463 "Like `progn', but evaluates the body at load time.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
464 The result of the body appears to the compiler as a quoted constant."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
465 (if (cl-compiling-file)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
466 (let* ((temp (gentemp "--cl-load-time--"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
467 (set (list 'set (list 'quote temp) form)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
468 (if (and (fboundp 'byte-compile-file-form-defmumble)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
469 (boundp 'this-kind) (boundp 'that-one))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
470 (fset 'byte-compile-file-form
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
471 (list 'lambda '(form)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
472 (list 'fset '(quote byte-compile-file-form)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
473 (list 'quote
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
474 (symbol-function 'byte-compile-file-form)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
475 (list 'byte-compile-file-form (list 'quote set))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
476 '(byte-compile-file-form form)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
477 (print set (symbol-value 'outbuffer)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
478 (list 'symbol-value (list 'quote temp)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
479 (list 'quote (eval form))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
480
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
481
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
482 ;;; Conditional control structures.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
483
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
484 (defmacro case (expr &rest clauses)
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
485 "Eval EXPR and choose from CLAUSES on that value.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
486 Each clause looks like (KEYLIST BODY...). EXPR is evaluated and compared
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
487 against each key in each KEYLIST; the corresponding BODY is evaluated.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
488 If no clause succeeds, case returns nil. A single atom may be used in
50854
bb29b3dba5ac (case, typecase): Don't quote nil and t in docstrings.
Juanma Barranquero <lekktu@gmail.com>
parents: 49687
diff changeset
489 place of a KEYLIST of one atom. A KEYLIST of t or `otherwise' is
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
490 allowed only in the final clause, and matches if no other keys match.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
491 Key values are compared by `eql'."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
492 (let* ((temp (if (cl-simple-expr-p expr 3) expr (gensym)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
493 (head-list nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
494 (body (cons
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
495 'cond
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
496 (mapcar
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
497 (function
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
498 (lambda (c)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
499 (cons (cond ((memq (car c) '(t otherwise)) t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
500 ((eq (car c) 'ecase-error-flag)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
501 (list 'error "ecase failed: %s, %s"
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
502 temp (list 'quote (reverse head-list))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
503 ((listp (car c))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
504 (setq head-list (append (car c) head-list))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
505 (list 'member* temp (list 'quote (car c))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
506 (t
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
507 (if (memq (car c) head-list)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
508 (error "Duplicate key in case: %s"
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
509 (car c)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
510 (push (car c) head-list)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
511 (list 'eql temp (list 'quote (car c)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
512 (or (cdr c) '(nil)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
513 clauses))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
514 (if (eq temp expr) body
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
515 (list 'let (list (list temp expr)) body))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
516
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
517 (defmacro ecase (expr &rest clauses)
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
518 "Like `case', but error if no case fits.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
519 `otherwise'-clauses are not allowed."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
520 (list* 'case expr (append clauses '((ecase-error-flag)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
521
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
522 (defmacro typecase (expr &rest clauses)
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
523 "Evals EXPR, chooses from CLAUSES on that value.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
524 Each clause looks like (TYPE BODY...). EXPR is evaluated and, if it
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
525 satisfies TYPE, the corresponding BODY is evaluated. If no clause succeeds,
50854
bb29b3dba5ac (case, typecase): Don't quote nil and t in docstrings.
Juanma Barranquero <lekktu@gmail.com>
parents: 49687
diff changeset
526 typecase returns nil. A TYPE of t or `otherwise' is allowed only in the
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
527 final clause, and matches if no other keys match."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
528 (let* ((temp (if (cl-simple-expr-p expr 3) expr (gensym)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
529 (type-list nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
530 (body (cons
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
531 'cond
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
532 (mapcar
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
533 (function
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
534 (lambda (c)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
535 (cons (cond ((eq (car c) 'otherwise) t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
536 ((eq (car c) 'ecase-error-flag)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
537 (list 'error "etypecase failed: %s, %s"
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
538 temp (list 'quote (reverse type-list))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
539 (t
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
540 (push (car c) type-list)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
541 (cl-make-type-test temp (car c))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
542 (or (cdr c) '(nil)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
543 clauses))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
544 (if (eq temp expr) body
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
545 (list 'let (list (list temp expr)) body))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
546
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
547 (defmacro etypecase (expr &rest clauses)
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
548 "Like `typecase', but error if no case fits.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
549 `otherwise'-clauses are not allowed."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
550 (list* 'typecase expr (append clauses '((ecase-error-flag)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
551
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
552
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
553 ;;; Blocks and exits.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
554
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
555 (defmacro block (name &rest body)
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
556 "Define a lexically-scoped block named NAME.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
557 NAME may be any symbol. Code inside the BODY forms can call `return-from'
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
558 to jump prematurely out of the block. This differs from `catch' and `throw'
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
559 in two respects: First, the NAME is an unevaluated symbol rather than a
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
560 quoted symbol or other form; and second, NAME is lexically rather than
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
561 dynamically scoped: Only references to it within BODY will work. These
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
562 references may appear inside macro expansions, but not inside functions
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
563 called from BODY."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
564 (if (cl-safe-expr-p (cons 'progn body)) (cons 'progn body)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
565 (list 'cl-block-wrapper
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
566 (list* 'catch (list 'quote (intern (format "--cl-block-%s--" name)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
567 body))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
568
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
569 (defvar cl-active-block-names nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
570
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
571 (put 'cl-block-wrapper 'byte-compile 'cl-byte-compile-block)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
572 (defun cl-byte-compile-block (cl-form)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
573 (if (fboundp 'byte-compile-form-do-effect) ; Check for optimizing compiler
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
574 (progn
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
575 (let* ((cl-entry (cons (nth 1 (nth 1 (nth 1 cl-form))) nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
576 (cl-active-block-names (cons cl-entry cl-active-block-names))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
577 (cl-body (byte-compile-top-level
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
578 (cons 'progn (cddr (nth 1 cl-form))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
579 (if (cdr cl-entry)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
580 (byte-compile-form (list 'catch (nth 1 (nth 1 cl-form)) cl-body))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
581 (byte-compile-form cl-body))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
582 (byte-compile-form (nth 1 cl-form))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
583
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
584 (put 'cl-block-throw 'byte-compile 'cl-byte-compile-throw)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
585 (defun cl-byte-compile-throw (cl-form)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
586 (let ((cl-found (assq (nth 1 (nth 1 cl-form)) cl-active-block-names)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
587 (if cl-found (setcdr cl-found t)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
588 (byte-compile-normal-call (cons 'throw (cdr cl-form))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
589
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
590 (defmacro return (&optional result)
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
591 "Return from the block named nil.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
592 This is equivalent to `(return-from nil RESULT)'."
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
593 (list 'return-from nil result))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
594
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
595 (defmacro return-from (name &optional result)
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
596 "Return from the block named NAME.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
597 This jump out to the innermost enclosing `(block NAME ...)' form,
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
598 returning RESULT from that form (or nil if RESULT is omitted).
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
599 This is compatible with Common Lisp, but note that `defun' and
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
600 `defmacro' do not create implicit blocks as they do in Common Lisp."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
601 (let ((name2 (intern (format "--cl-block-%s--" name))))
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
602 (list 'cl-block-throw (list 'quote name2) result)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
603
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
604
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
605 ;;; The "loop" macro.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
606
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
607 (defvar args) (defvar loop-accum-var) (defvar loop-accum-vars)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
608 (defvar loop-bindings) (defvar loop-body) (defvar loop-destr-temps)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
609 (defvar loop-finally) (defvar loop-finish-flag) (defvar loop-first-flag)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
610 (defvar loop-initially) (defvar loop-map-form) (defvar loop-name)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
611 (defvar loop-result) (defvar loop-result-explicit)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
612 (defvar loop-result-var) (defvar loop-steps) (defvar loop-symbol-macs)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
613
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
614 (defmacro loop (&rest args)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
615 "The Common Lisp `loop' macro.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
616 Valid clauses are:
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
617 for VAR from/upfrom/downfrom NUM to/upto/downto/above/below NUM by NUM,
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
618 for VAR in LIST by FUNC, for VAR on LIST by FUNC, for VAR = INIT then EXPR,
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
619 for VAR across ARRAY, repeat NUM, with VAR = INIT, while COND, until COND,
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
620 always COND, never COND, thereis COND, collect EXPR into VAR,
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
621 append EXPR into VAR, nconc EXPR into VAR, sum EXPR into VAR,
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
622 count EXPR into VAR, maximize EXPR into VAR, minimize EXPR into VAR,
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
623 if COND CLAUSE [and CLAUSE]... else CLAUSE [and CLAUSE...],
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
624 unless COND CLAUSE [and CLAUSE]... else CLAUSE [and CLAUSE...],
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
625 do EXPRS..., initially EXPRS..., finally EXPRS..., return EXPR,
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
626 finally return EXPR, named NAME.
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
627
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
628 \(fn CLAUSE...)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
629 (if (not (memq t (mapcar 'symbolp (delq nil (delq t (copy-list args))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
630 (list 'block nil (list* 'while t args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
631 (let ((loop-name nil) (loop-bindings nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
632 (loop-body nil) (loop-steps nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
633 (loop-result nil) (loop-result-explicit nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
634 (loop-result-var nil) (loop-finish-flag nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
635 (loop-accum-var nil) (loop-accum-vars nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
636 (loop-initially nil) (loop-finally nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
637 (loop-map-form nil) (loop-first-flag nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
638 (loop-destr-temps nil) (loop-symbol-macs nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
639 (setq args (append args '(cl-end-loop)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
640 (while (not (eq (car args) 'cl-end-loop)) (cl-parse-loop-clause))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
641 (if loop-finish-flag
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
642 (push (list (list loop-finish-flag t)) loop-bindings))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
643 (if loop-first-flag
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
644 (progn (push (list (list loop-first-flag t)) loop-bindings)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
645 (push (list 'setq loop-first-flag nil) loop-steps)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
646 (let* ((epilogue (nconc (nreverse loop-finally)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
647 (list (or loop-result-explicit loop-result))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
648 (ands (cl-loop-build-ands (nreverse loop-body)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
649 (while-body (nconc (cadr ands) (nreverse loop-steps)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
650 (body (append
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
651 (nreverse loop-initially)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
652 (list (if loop-map-form
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
653 (list 'block '--cl-finish--
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
654 (subst
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
655 (if (eq (car ands) t) while-body
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
656 (cons (list 'or (car ands)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
657 '(return-from --cl-finish--
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
658 nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
659 while-body))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
660 '--cl-map loop-map-form))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
661 (list* 'while (car ands) while-body)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
662 (if loop-finish-flag
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
663 (if (equal epilogue '(nil)) (list loop-result-var)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
664 (list (list 'if loop-finish-flag
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
665 (cons 'progn epilogue) loop-result-var)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
666 epilogue))))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
667 (if loop-result-var (push (list loop-result-var) loop-bindings))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
668 (while loop-bindings
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
669 (if (cdar loop-bindings)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
670 (setq body (list (cl-loop-let (pop loop-bindings) body t)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
671 (let ((lets nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
672 (while (and loop-bindings
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
673 (not (cdar loop-bindings)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
674 (push (car (pop loop-bindings)) lets))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
675 (setq body (list (cl-loop-let lets body nil))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
676 (if loop-symbol-macs
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
677 (setq body (list (list* 'symbol-macrolet loop-symbol-macs body))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
678 (list* 'block loop-name body)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
679
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
680 (defun cl-parse-loop-clause () ; uses args, loop-*
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
681 (let ((word (pop args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
682 (hash-types '(hash-key hash-keys hash-value hash-values))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
683 (key-types '(key-code key-codes key-seq key-seqs
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
684 key-binding key-bindings)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
685 (cond
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
686
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
687 ((null args)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
688 (error "Malformed `loop' macro"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
689
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
690 ((eq word 'named)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
691 (setq loop-name (pop args)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
692
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
693 ((eq word 'initially)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
694 (if (memq (car args) '(do doing)) (pop args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
695 (or (consp (car args)) (error "Syntax error on `initially' clause"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
696 (while (consp (car args))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
697 (push (pop args) loop-initially)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
698
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
699 ((eq word 'finally)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
700 (if (eq (car args) 'return)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
701 (setq loop-result-explicit (or (cl-pop2 args) '(quote nil)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
702 (if (memq (car args) '(do doing)) (pop args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
703 (or (consp (car args)) (error "Syntax error on `finally' clause"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
704 (if (and (eq (caar args) 'return) (null loop-name))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
705 (setq loop-result-explicit (or (nth 1 (pop args)) '(quote nil)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
706 (while (consp (car args))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
707 (push (pop args) loop-finally)))))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
708
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
709 ((memq word '(for as))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
710 (let ((loop-for-bindings nil) (loop-for-sets nil) (loop-for-steps nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
711 (ands nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
712 (while
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
713 (let ((var (or (pop args) (gensym))))
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
714 (setq word (pop args))
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
715 (if (eq word 'being) (setq word (pop args)))
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
716 (if (memq word '(the each)) (setq word (pop args)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
717 (if (memq word '(buffer buffers))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
718 (setq word 'in args (cons '(buffer-list) args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
719 (cond
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
720
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
721 ((memq word '(from downfrom upfrom to downto upto
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
722 above below by))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
723 (push word args)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
724 (if (memq (car args) '(downto above))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
725 (error "Must specify `from' value for downward loop"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
726 (let* ((down (or (eq (car args) 'downfrom)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
727 (memq (caddr args) '(downto above))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
728 (excl (or (memq (car args) '(above below))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
729 (memq (caddr args) '(above below))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
730 (start (and (memq (car args) '(from upfrom downfrom))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
731 (cl-pop2 args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
732 (end (and (memq (car args)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
733 '(to upto downto above below))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
734 (cl-pop2 args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
735 (step (and (eq (car args) 'by) (cl-pop2 args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
736 (end-var (and (not (cl-const-expr-p end)) (gensym)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
737 (step-var (and (not (cl-const-expr-p step))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
738 (gensym))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
739 (and step (numberp step) (<= step 0)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
740 (error "Loop `by' value is not positive: %s" step))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
741 (push (list var (or start 0)) loop-for-bindings)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
742 (if end-var (push (list end-var end) loop-for-bindings))
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
743 (if step-var (push (list step-var step)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
744 loop-for-bindings))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
745 (if end
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
746 (push (list
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
747 (if down (if excl '> '>=) (if excl '< '<=))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
748 var (or end-var end)) loop-body))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
749 (push (list var (list (if down '- '+) var
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
750 (or step-var step 1)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
751 loop-for-steps)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
752
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
753 ((memq word '(in in-ref on))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
754 (let* ((on (eq word 'on))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
755 (temp (if (and on (symbolp var)) var (gensym))))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
756 (push (list temp (pop args)) loop-for-bindings)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
757 (push (list 'consp temp) loop-body)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
758 (if (eq word 'in-ref)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
759 (push (list var (list 'car temp)) loop-symbol-macs)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
760 (or (eq temp var)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
761 (progn
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
762 (push (list var nil) loop-for-bindings)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
763 (push (list var (if on temp (list 'car temp)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
764 loop-for-sets))))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
765 (push (list temp
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
766 (if (eq (car args) 'by)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
767 (let ((step (cl-pop2 args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
768 (if (and (memq (car-safe step)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
769 '(quote function
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
770 function*))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
771 (symbolp (nth 1 step)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
772 (list (nth 1 step) temp)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
773 (list 'funcall step temp)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
774 (list 'cdr temp)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
775 loop-for-steps)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
776
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
777 ((eq word '=)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
778 (let* ((start (pop args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
779 (then (if (eq (car args) 'then) (cl-pop2 args) start)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
780 (push (list var nil) loop-for-bindings)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
781 (if (or ands (eq (car args) 'and))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
782 (progn
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
783 (push (list var
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
784 (list 'if
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
785 (or loop-first-flag
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
786 (setq loop-first-flag
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
787 (gensym)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
788 start var))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
789 loop-for-sets)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
790 (push (list var then) loop-for-steps))
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
791 (push (list var
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
792 (if (eq start then) start
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
793 (list 'if
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
794 (or loop-first-flag
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
795 (setq loop-first-flag (gensym)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
796 start then)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
797 loop-for-sets))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
798
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
799 ((memq word '(across across-ref))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
800 (let ((temp-vec (gensym)) (temp-idx (gensym)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
801 (push (list temp-vec (pop args)) loop-for-bindings)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
802 (push (list temp-idx -1) loop-for-bindings)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
803 (push (list '< (list 'setq temp-idx (list '1+ temp-idx))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
804 (list 'length temp-vec)) loop-body)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
805 (if (eq word 'across-ref)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
806 (push (list var (list 'aref temp-vec temp-idx))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
807 loop-symbol-macs)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
808 (push (list var nil) loop-for-bindings)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
809 (push (list var (list 'aref temp-vec temp-idx))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
810 loop-for-sets))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
811
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
812 ((memq word '(element elements))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
813 (let ((ref (or (memq (car args) '(in-ref of-ref))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
814 (and (not (memq (car args) '(in of)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
815 (error "Expected `of'"))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
816 (seq (cl-pop2 args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
817 (temp-seq (gensym))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
818 (temp-idx (if (eq (car args) 'using)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
819 (if (and (= (length (cadr args)) 2)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
820 (eq (caadr args) 'index))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
821 (cadr (cl-pop2 args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
822 (error "Bad `using' clause"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
823 (gensym))))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
824 (push (list temp-seq seq) loop-for-bindings)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
825 (push (list temp-idx 0) loop-for-bindings)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
826 (if ref
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
827 (let ((temp-len (gensym)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
828 (push (list temp-len (list 'length temp-seq))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
829 loop-for-bindings)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
830 (push (list var (list 'elt temp-seq temp-idx))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
831 loop-symbol-macs)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
832 (push (list '< temp-idx temp-len) loop-body))
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
833 (push (list var nil) loop-for-bindings)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
834 (push (list 'and temp-seq
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
835 (list 'or (list 'consp temp-seq)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
836 (list '< temp-idx
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
837 (list 'length temp-seq))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
838 loop-body)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
839 (push (list var (list 'if (list 'consp temp-seq)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
840 (list 'pop temp-seq)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
841 (list 'aref temp-seq temp-idx)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
842 loop-for-sets))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
843 (push (list temp-idx (list '1+ temp-idx))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
844 loop-for-steps)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
845
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
846 ((memq word hash-types)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
847 (or (memq (car args) '(in of)) (error "Expected `of'"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
848 (let* ((table (cl-pop2 args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
849 (other (if (eq (car args) 'using)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
850 (if (and (= (length (cadr args)) 2)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
851 (memq (caadr args) hash-types)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
852 (not (eq (caadr args) word)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
853 (cadr (cl-pop2 args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
854 (error "Bad `using' clause"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
855 (gensym))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
856 (if (memq word '(hash-value hash-values))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
857 (setq var (prog1 other (setq other var))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
858 (setq loop-map-form
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
859 (list 'maphash (list 'function
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
860 (list* 'lambda (list var other)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
861 '--cl-map)) table))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
862
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
863 ((memq word '(symbol present-symbol external-symbol
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
864 symbols present-symbols external-symbols))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
865 (let ((ob (and (memq (car args) '(in of)) (cl-pop2 args))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
866 (setq loop-map-form
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
867 (list 'mapatoms (list 'function
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
868 (list* 'lambda (list var)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
869 '--cl-map)) ob))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
870
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
871 ((memq word '(overlay overlays extent extents))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
872 (let ((buf nil) (from nil) (to nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
873 (while (memq (car args) '(in of from to))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
874 (cond ((eq (car args) 'from) (setq from (cl-pop2 args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
875 ((eq (car args) 'to) (setq to (cl-pop2 args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
876 (t (setq buf (cl-pop2 args)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
877 (setq loop-map-form
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
878 (list 'cl-map-extents
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
879 (list 'function (list 'lambda (list var (gensym))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
880 '(progn . --cl-map) nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
881 buf from to))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
882
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
883 ((memq word '(interval intervals))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
884 (let ((buf nil) (prop nil) (from nil) (to nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
885 (var1 (gensym)) (var2 (gensym)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
886 (while (memq (car args) '(in of property from to))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
887 (cond ((eq (car args) 'from) (setq from (cl-pop2 args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
888 ((eq (car args) 'to) (setq to (cl-pop2 args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
889 ((eq (car args) 'property)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
890 (setq prop (cl-pop2 args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
891 (t (setq buf (cl-pop2 args)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
892 (if (and (consp var) (symbolp (car var)) (symbolp (cdr var)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
893 (setq var1 (car var) var2 (cdr var))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
894 (push (list var (list 'cons var1 var2)) loop-for-sets))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
895 (setq loop-map-form
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
896 (list 'cl-map-intervals
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
897 (list 'function (list 'lambda (list var1 var2)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
898 '(progn . --cl-map)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
899 buf prop from to))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
900
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
901 ((memq word key-types)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
902 (or (memq (car args) '(in of)) (error "Expected `of'"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
903 (let ((map (cl-pop2 args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
904 (other (if (eq (car args) 'using)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
905 (if (and (= (length (cadr args)) 2)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
906 (memq (caadr args) key-types)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
907 (not (eq (caadr args) word)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
908 (cadr (cl-pop2 args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
909 (error "Bad `using' clause"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
910 (gensym))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
911 (if (memq word '(key-binding key-bindings))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
912 (setq var (prog1 other (setq other var))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
913 (setq loop-map-form
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
914 (list (if (memq word '(key-seq key-seqs))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
915 'cl-map-keymap-recursively 'cl-map-keymap)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
916 (list 'function (list* 'lambda (list var other)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
917 '--cl-map)) map))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
918
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
919 ((memq word '(frame frames screen screens))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
920 (let ((temp (gensym)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
921 (push (list var '(selected-frame))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
922 loop-for-bindings)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
923 (push (list temp nil) loop-for-bindings)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
924 (push (list 'prog1 (list 'not (list 'eq var temp))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
925 (list 'or temp (list 'setq temp var)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
926 loop-body)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
927 (push (list var (list 'next-frame var))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
928 loop-for-steps)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
929
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
930 ((memq word '(window windows))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
931 (let ((scr (and (memq (car args) '(in of)) (cl-pop2 args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
932 (temp (gensym)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
933 (push (list var (if scr
26940
f1998d661bc2 Remove conditional definition of eval-when-compile. Don't specify abs,
Dave Love <fx@gnu.org>
parents: 22554
diff changeset
934 (list 'frame-selected-window scr)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
935 '(selected-window)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
936 loop-for-bindings)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
937 (push (list temp nil) loop-for-bindings)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
938 (push (list 'prog1 (list 'not (list 'eq var temp))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
939 (list 'or temp (list 'setq temp var)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
940 loop-body)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
941 (push (list var (list 'next-window var)) loop-for-steps)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
942
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
943 (t
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
944 (let ((handler (and (symbolp word)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
945 (get word 'cl-loop-for-handler))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
946 (if handler
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
947 (funcall handler var)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
948 (error "Expected a `for' preposition, found %s" word)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
949 (eq (car args) 'and))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
950 (setq ands t)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
951 (pop args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
952 (if (and ands loop-for-bindings)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
953 (push (nreverse loop-for-bindings) loop-bindings)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
954 (setq loop-bindings (nconc (mapcar 'list loop-for-bindings)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
955 loop-bindings)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
956 (if loop-for-sets
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
957 (push (list 'progn
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
958 (cl-loop-let (nreverse loop-for-sets) 'setq ands)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
959 t) loop-body))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
960 (if loop-for-steps
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
961 (push (cons (if ands 'psetq 'setq)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
962 (apply 'append (nreverse loop-for-steps)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
963 loop-steps))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
964
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
965 ((eq word 'repeat)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
966 (let ((temp (gensym)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
967 (push (list (list temp (pop args))) loop-bindings)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
968 (push (list '>= (list 'setq temp (list '1- temp)) 0) loop-body)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
969
27479
2b5d9f6cdc24 (cl-parse-loop-clause): Recognize
Gerd Moellmann <gerd@gnu.org>
parents: 27382
diff changeset
970 ((memq word '(collect collecting))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
971 (let ((what (pop args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
972 (var (cl-loop-handle-accum nil 'nreverse)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
973 (if (eq var loop-accum-var)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
974 (push (list 'progn (list 'push what var) t) loop-body)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
975 (push (list 'progn
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
976 (list 'setq var (list 'nconc var (list 'list what)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
977 t) loop-body))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
978
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
979 ((memq word '(nconc nconcing append appending))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
980 (let ((what (pop args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
981 (var (cl-loop-handle-accum nil 'nreverse)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
982 (push (list 'progn
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
983 (list 'setq var
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
984 (if (eq var loop-accum-var)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
985 (list 'nconc
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
986 (list (if (memq word '(nconc nconcing))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
987 'nreverse 'reverse)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
988 what)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
989 var)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
990 (list (if (memq word '(nconc nconcing))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
991 'nconc 'append)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
992 var what))) t) loop-body)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
993
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
994 ((memq word '(concat concating))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
995 (let ((what (pop args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
996 (var (cl-loop-handle-accum "")))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
997 (push (list 'progn (list 'callf 'concat var what) t) loop-body)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
998
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
999 ((memq word '(vconcat vconcating))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1000 (let ((what (pop args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1001 (var (cl-loop-handle-accum [])))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1002 (push (list 'progn (list 'callf 'vconcat var what) t) loop-body)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1003
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1004 ((memq word '(sum summing))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1005 (let ((what (pop args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1006 (var (cl-loop-handle-accum 0)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1007 (push (list 'progn (list 'incf var what) t) loop-body)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1008
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1009 ((memq word '(count counting))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1010 (let ((what (pop args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1011 (var (cl-loop-handle-accum 0)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1012 (push (list 'progn (list 'if what (list 'incf var)) t) loop-body)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1013
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1014 ((memq word '(minimize minimizing maximize maximizing))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1015 (let* ((what (pop args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1016 (temp (if (cl-simple-expr-p what) what (gensym)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1017 (var (cl-loop-handle-accum nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1018 (func (intern (substring (symbol-name word) 0 3)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1019 (set (list 'setq var (list 'if var (list func var temp) temp))))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1020 (push (list 'progn (if (eq temp what) set
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1021 (list 'let (list (list temp what)) set))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1022 t) loop-body)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1023
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1024 ((eq word 'with)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1025 (let ((bindings nil))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1026 (while (progn (push (list (pop args)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1027 (and (eq (car args) '=) (cl-pop2 args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1028 bindings)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1029 (eq (car args) 'and))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1030 (pop args))
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1031 (push (nreverse bindings) loop-bindings)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1032
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1033 ((eq word 'while)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1034 (push (pop args) loop-body))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1035
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1036 ((eq word 'until)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1037 (push (list 'not (pop args)) loop-body))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1038
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1039 ((eq word 'always)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1040 (or loop-finish-flag (setq loop-finish-flag (gensym)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1041 (push (list 'setq loop-finish-flag (pop args)) loop-body)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1042 (setq loop-result t))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1043
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1044 ((eq word 'never)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1045 (or loop-finish-flag (setq loop-finish-flag (gensym)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1046 (push (list 'setq loop-finish-flag (list 'not (pop args)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1047 loop-body)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1048 (setq loop-result t))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1049
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1050 ((eq word 'thereis)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1051 (or loop-finish-flag (setq loop-finish-flag (gensym)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1052 (or loop-result-var (setq loop-result-var (gensym)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1053 (push (list 'setq loop-finish-flag
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1054 (list 'not (list 'setq loop-result-var (pop args))))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1055 loop-body))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1056
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1057 ((memq word '(if when unless))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1058 (let* ((cond (pop args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1059 (then (let ((loop-body nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1060 (cl-parse-loop-clause)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1061 (cl-loop-build-ands (nreverse loop-body))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1062 (else (let ((loop-body nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1063 (if (eq (car args) 'else)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1064 (progn (pop args) (cl-parse-loop-clause)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1065 (cl-loop-build-ands (nreverse loop-body))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1066 (simple (and (eq (car then) t) (eq (car else) t))))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1067 (if (eq (car args) 'end) (pop args))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1068 (if (eq word 'unless) (setq then (prog1 else (setq else then))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1069 (let ((form (cons (if simple (cons 'progn (nth 1 then)) (nth 2 then))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1070 (if simple (nth 1 else) (list (nth 2 else))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1071 (if (cl-expr-contains form 'it)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1072 (let ((temp (gensym)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1073 (push (list temp) loop-bindings)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1074 (setq form (list* 'if (list 'setq temp cond)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1075 (subst temp 'it form))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1076 (setq form (list* 'if cond form)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1077 (push (if simple (list 'progn form t) form) loop-body))))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1078
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1079 ((memq word '(do doing))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1080 (let ((body nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1081 (or (consp (car args)) (error "Syntax error on `do' clause"))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1082 (while (consp (car args)) (push (pop args) body))
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1083 (push (cons 'progn (nreverse (cons t body))) loop-body)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1084
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1085 ((eq word 'return)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1086 (or loop-finish-flag (setq loop-finish-flag (gensym)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1087 (or loop-result-var (setq loop-result-var (gensym)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1088 (push (list 'setq loop-result-var (pop args)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1089 loop-finish-flag nil) loop-body))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1090
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1091 (t
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1092 (let ((handler (and (symbolp word) (get word 'cl-loop-handler))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1093 (or handler (error "Expected a loop keyword, found %s" word))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1094 (funcall handler))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1095 (if (eq (car args) 'and)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1096 (progn (pop args) (cl-parse-loop-clause)))))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1097
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1098 (defun cl-loop-let (specs body par) ; uses loop-*
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1099 (let ((p specs) (temps nil) (new nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1100 (while (and p (or (symbolp (car-safe (car p))) (null (cadar p))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1101 (setq p (cdr p)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1102 (and par p
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1103 (progn
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1104 (setq par nil p specs)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1105 (while p
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1106 (or (cl-const-expr-p (cadar p))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1107 (let ((temp (gensym)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1108 (push (list temp (cadar p)) temps)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1109 (setcar (cdar p) temp)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1110 (setq p (cdr p)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1111 (while specs
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1112 (if (and (consp (car specs)) (listp (caar specs)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1113 (let* ((spec (caar specs)) (nspecs nil)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1114 (expr (cadr (pop specs)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1115 (temp (cdr (or (assq spec loop-destr-temps)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1116 (car (push (cons spec (or (last spec 0)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1117 (gensym)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1118 loop-destr-temps))))))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1119 (push (list temp expr) new)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1120 (while (consp spec)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1121 (push (list (pop spec)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1122 (and expr (list (if spec 'pop 'car) temp)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1123 nspecs))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1124 (setq specs (nconc (nreverse nspecs) specs)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1125 (push (pop specs) new)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1126 (if (eq body 'setq)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1127 (let ((set (cons (if par 'psetq 'setq) (apply 'nconc (nreverse new)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1128 (if temps (list 'let* (nreverse temps) set) set))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1129 (list* (if par 'let 'let*)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1130 (nconc (nreverse temps) (nreverse new)) body))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1131
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1132 (defun cl-loop-handle-accum (def &optional func) ; uses args, loop-*
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1133 (if (eq (car args) 'into)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1134 (let ((var (cl-pop2 args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1135 (or (memq var loop-accum-vars)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1136 (progn (push (list (list var def)) loop-bindings)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1137 (push var loop-accum-vars)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1138 var)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1139 (or loop-accum-var
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1140 (progn
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1141 (push (list (list (setq loop-accum-var (gensym)) def))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1142 loop-bindings)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1143 (setq loop-result (if func (list func loop-accum-var)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1144 loop-accum-var))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1145 loop-accum-var))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1146
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1147 (defun cl-loop-build-ands (clauses)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1148 (let ((ands nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1149 (body nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1150 (while clauses
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1151 (if (and (eq (car-safe (car clauses)) 'progn)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1152 (eq (car (last (car clauses))) t))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1153 (if (cdr clauses)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1154 (setq clauses (cons (nconc (butlast (car clauses))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1155 (if (eq (car-safe (cadr clauses))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1156 'progn)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1157 (cdadr clauses)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1158 (list (cadr clauses))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1159 (cddr clauses)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1160 (setq body (cdr (butlast (pop clauses)))))
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1161 (push (pop clauses) ands)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1162 (setq ands (or (nreverse ands) (list t)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1163 (list (if (cdr ands) (cons 'and ands) (car ands))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1164 body
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1165 (let ((full (if body
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1166 (append ands (list (cons 'progn (append body '(t)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1167 ands)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1168 (if (cdr full) (cons 'and full) (car full))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1169
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1170
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1171 ;;; Other iteration control structures.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1172
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1173 (defmacro do (steps endtest &rest body)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1174 "The Common Lisp `do' loop.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1175 Format is: (do ((VAR INIT [STEP])...) (END-TEST [RESULT...]) BODY...)"
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1176 (cl-expand-do-loop steps endtest body nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1177
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1178 (defmacro do* (steps endtest &rest body)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1179 "The Common Lisp `do*' loop.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1180 Format is: (do* ((VAR INIT [STEP])...) (END-TEST [RESULT...]) BODY...)"
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1181 (cl-expand-do-loop steps endtest body t))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1182
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1183 (defun cl-expand-do-loop (steps endtest body star)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1184 (list 'block nil
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1185 (list* (if star 'let* 'let)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1186 (mapcar (function (lambda (c)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1187 (if (consp c) (list (car c) (nth 1 c)) c)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1188 steps)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1189 (list* 'while (list 'not (car endtest))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1190 (append body
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1191 (let ((sets (mapcar
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1192 (function
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1193 (lambda (c)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1194 (and (consp c) (cdr (cdr c))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1195 (list (car c) (nth 2 c)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1196 steps)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1197 (setq sets (delq nil sets))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1198 (and sets
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1199 (list (cons (if (or star (not (cdr sets)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1200 'setq 'psetq)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1201 (apply 'append sets)))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1202 (or (cdr endtest) '(nil)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1203
27508
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1204 (defmacro dolist (spec &rest body)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1205 "Loop over a list.
27508
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1206 Evaluate BODY with VAR bound to each `car' from LIST, in turn.
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1207 Then evaluate RESULT to get return value, default nil.
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1208
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1209 \(fn (VAR LIST [RESULT]) BODY...)"
27508
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1210 (let ((temp (gensym "--dolist-temp--")))
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1211 (list 'block nil
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1212 (list* 'let (list (list temp (nth 1 spec)) (car spec))
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1213 (list* 'while temp (list 'setq (car spec) (list 'car temp))
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1214 (append body (list (list 'setq temp
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1215 (list 'cdr temp)))))
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1216 (if (cdr (cdr spec))
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1217 (cons (list 'setq (car spec) nil) (cdr (cdr spec)))
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1218 '(nil))))))
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1219
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1220 (defmacro dotimes (spec &rest body)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1221 "Loop a certain number of times.
27508
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1222 Evaluate BODY with VAR bound to successive integers from 0, inclusive,
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1223 to COUNT, exclusive. Then evaluate RESULT to get return value, default
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1224 nil.
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1225
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1226 \(fn (VAR COUNT [RESULT]) BODY...)"
27508
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1227 (let ((temp (gensym "--dotimes-temp--")))
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1228 (list 'block nil
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1229 (list* 'let (list (list temp (nth 1 spec)) (list (car spec) 0))
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1230 (list* 'while (list '< (car spec) temp)
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1231 (append body (list (list 'incf (car spec)))))
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1232 (or (cdr (cdr spec)) '(nil))))))
64f97cc2e021 Revert last change.
Dave Love <fx@gnu.org>
parents: 27487
diff changeset
1233
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1234 (defmacro do-symbols (spec &rest body)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1235 "Loop over all symbols.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1236 Evaluate BODY with VAR bound to each interned symbol, or to each symbol
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1237 from OBARRAY.
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1238
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1239 \(fn (VAR [OBARRAY [RESULT]]) BODY...)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1240 ;; Apparently this doesn't have an implicit block.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1241 (list 'block nil
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1242 (list 'let (list (car spec))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1243 (list* 'mapatoms
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1244 (list 'function (list* 'lambda (list (car spec)) body))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1245 (and (cadr spec) (list (cadr spec))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1246 (caddr spec))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1247
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1248 (defmacro do-all-symbols (spec &rest body)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1249 (list* 'do-symbols (list (car spec) nil (cadr spec)) body))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1250
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1251
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1252 ;;; Assignments.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1253
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1254 (defmacro psetq (&rest args)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1255 "Set SYMs to the values VALs in parallel.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1256 This is like `setq', except that all VAL forms are evaluated (in order)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1257 before assigning any symbols SYM to the corresponding values.
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1258
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1259 \(fn SYM VAL SYM VAL ...)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1260 (cons 'psetf args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1261
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1262
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1263 ;;; Binding control structures.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1264
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1265 (defmacro progv (symbols values &rest body)
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
1266 "Bind SYMBOLS to VALUES dynamically in BODY.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1267 The forms SYMBOLS and VALUES are evaluated, and must evaluate to lists.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1268 Each SYMBOL in the first list is bound to the corresponding VALUE in the
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1269 second list (or made unbound if VALUES is shorter than SYMBOLS); then the
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1270 BODY forms are executed and their result is returned. This is much like
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1271 a `let' form, except that the list of symbols can be computed at run-time."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1272 (list 'let '((cl-progv-save nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1273 (list 'unwind-protect
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1274 (list* 'progn (list 'cl-progv-before symbols values) body)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1275 '(cl-progv-after))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1276
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1277 ;;; This should really have some way to shadow 'byte-compile properties, etc.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1278 (defmacro flet (bindings &rest body)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1279 "Make temporary function defns.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1280 This is an analogue of `let' that operates on the function cell of FUNC
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1281 rather than its value cell. The FORMs are evaluated with the specified
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1282 function definitions in place, then the definitions are undone (the FUNCs
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1283 go back to their previous definitions, or lack thereof).
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1284
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1285 \(fn ((FUNC ARGLIST BODY...) ...) FORM...)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1286 (list* 'letf*
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1287 (mapcar
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1288 (function
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1289 (lambda (x)
15030
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
1290 (if (or (and (fboundp (car x))
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
1291 (eq (car-safe (symbol-function (car x))) 'macro))
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
1292 (cdr (assq (car x) cl-macro-environment)))
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
1293 (error "Use `labels', not `flet', to rebind macro names"))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1294 (let ((func (list 'function*
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1295 (list 'lambda (cadr x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1296 (list* 'block (car x) (cddr x))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1297 (if (and (cl-compiling-file)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1298 (boundp 'byte-compile-function-environment))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1299 (push (cons (car x) (eval func))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1300 byte-compile-function-environment))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1301 (list (list 'symbol-function (list 'quote (car x))) func))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1302 bindings)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1303 body))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1304
15030
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
1305 (defmacro labels (bindings &rest body)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1306 "Make temporary func bindings.
15030
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
1307 This is like `flet', except the bindings are lexical instead of dynamic.
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1308 Unlike `flet', this macro is fully compliant with the Common Lisp standard.
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1309
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1310 \(fn ((FUNC ARGLIST BODY...) ...) FORM...)"
15030
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
1311 (let ((vars nil) (sets nil) (cl-macro-environment cl-macro-environment))
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
1312 (while bindings
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
1313 (let ((var (gensym)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1314 (push var vars)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1315 (push (list 'function* (cons 'lambda (cdar bindings))) sets)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1316 (push var sets)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1317 (push (list (car (pop bindings)) 'lambda '(&rest cl-labels-args)
15030
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
1318 (list 'list* '(quote funcall) (list 'quote var)
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
1319 'cl-labels-args))
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
1320 cl-macro-environment)))
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
1321 (cl-macroexpand-all (list* 'lexical-let vars (cons (cons 'setq sets) body))
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
1322 cl-macro-environment)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1323
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1324 ;; The following ought to have a better definition for use with newer
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1325 ;; byte compilers.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1326 (defmacro macrolet (bindings &rest body)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1327 "Make temporary macro defns.
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1328 This is like `flet', but for macros instead of functions.
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1329
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1330 \(fn ((NAME ARGLIST BODY...) ...) FORM...)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1331 (if (cdr bindings)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1332 (list 'macrolet
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1333 (list (car bindings)) (list* 'macrolet (cdr bindings) body))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1334 (if (null bindings) (cons 'progn body)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1335 (let* ((name (caar bindings))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1336 (res (cl-transform-lambda (cdar bindings) name)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1337 (eval (car res))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1338 (cl-macroexpand-all (cons 'progn body)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1339 (cons (list* name 'lambda (cdr res))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1340 cl-macro-environment))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1341
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1342 (defmacro symbol-macrolet (bindings &rest body)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1343 "Make symbol macro defns.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1344 Within the body FORMs, references to the variable NAME will be replaced
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1345 by EXPANSION, and (setq NAME ...) will act like (setf EXPANSION ...).
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1346
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1347 \(fn ((NAME EXPANSION) ...) FORM...)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1348 (if (cdr bindings)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1349 (list 'symbol-macrolet
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1350 (list (car bindings)) (list* 'symbol-macrolet (cdr bindings) body))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1351 (if (null bindings) (cons 'progn body)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1352 (cl-macroexpand-all (cons 'progn body)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1353 (cons (list (symbol-name (caar bindings))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1354 (cadar bindings))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1355 cl-macro-environment)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1356
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1357 (defvar cl-closure-vars nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1358 (defmacro lexical-let (bindings &rest body)
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
1359 "Like `let', but lexically scoped.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1360 The main visible difference is that lambdas inside BODY will create
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1361 lexical closures as in Common Lisp."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1362 (let* ((cl-closure-vars cl-closure-vars)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1363 (vars (mapcar (function
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1364 (lambda (x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1365 (or (consp x) (setq x (list x)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1366 (push (gensym (format "--%s--" (car x)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1367 cl-closure-vars)
16458
738fe588008a (lexical-let): Fixed a bug involving nested
Karl Heuer <kwzh@gnu.org>
parents: 16057
diff changeset
1368 (set (car cl-closure-vars) [bad-lexical-ref])
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1369 (list (car x) (cadr x) (car cl-closure-vars))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1370 bindings))
49598
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 48720
diff changeset
1371 (ebody
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1372 (cl-macroexpand-all
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1373 (cons 'progn body)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1374 (nconc (mapcar (function (lambda (x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1375 (list (symbol-name (car x))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1376 (list 'symbol-value (caddr x))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1377 t))) vars)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1378 (list '(defun . cl-defun-expander))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1379 cl-macro-environment))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1380 (if (not (get (car (last cl-closure-vars)) 'used))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1381 (list 'let (mapcar (function (lambda (x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1382 (list (caddr x) (cadr x)))) vars)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1383 (sublis (mapcar (function (lambda (x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1384 (cons (caddr x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1385 (list 'quote (caddr x)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1386 vars)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1387 ebody))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1388 (list 'let (mapcar (function (lambda (x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1389 (list (caddr x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1390 (list 'make-symbol
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1391 (format "--%s--" (car x))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1392 vars)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1393 (apply 'append '(setf)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1394 (mapcar (function
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1395 (lambda (x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1396 (list (list 'symbol-value (caddr x)) (cadr x))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1397 vars))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1398 ebody))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1399
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1400 (defmacro lexical-let* (bindings &rest body)
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
1401 "Like `let*', but lexically scoped.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1402 The main visible difference is that lambdas inside BODY will create
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1403 lexical closures as in Common Lisp."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1404 (if (null bindings) (cons 'progn body)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1405 (setq bindings (reverse bindings))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1406 (while bindings
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1407 (setq body (list (list* 'lexical-let (list (pop bindings)) body))))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1408 (car body)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1409
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1410 (defun cl-defun-expander (func &rest rest)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1411 (list 'progn
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1412 (list 'defalias (list 'quote func)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1413 (list 'function (cons 'lambda rest)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1414 (list 'quote func)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1415
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1416
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1417 ;;; Multiple values.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1418
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1419 (defmacro multiple-value-bind (vars form &rest body)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1420 "Collect multiple return values.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1421 FORM must return a list; the BODY is then executed with the first N elements
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1422 of this list bound (`let'-style) to each of the symbols SYM in turn. This
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1423 is analogous to the Common Lisp `multiple-value-bind' macro, using lists to
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1424 simulate true multiple return values. For compatibility, (values A B C) is
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1425 a synonym for (list A B C).
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1426
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1427 \(fn (SYM SYM...) FORM BODY)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1428 (let ((temp (gensym)) (n -1))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1429 (list* 'let* (cons (list temp form)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1430 (mapcar (function
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1431 (lambda (v)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1432 (list v (list 'nth (setq n (1+ n)) temp))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1433 vars))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1434 body)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1435
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1436 (defmacro multiple-value-setq (vars form)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1437 "Collect multiple return values.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1438 FORM must return a list; the first N elements of this list are stored in
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1439 each of the symbols SYM in turn. This is analogous to the Common Lisp
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1440 `multiple-value-setq' macro, using lists to simulate true multiple return
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1441 values. For compatibility, (values A B C) is a synonym for (list A B C).
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1442
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1443 \(fn (SYM SYM...) FORM)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1444 (cond ((null vars) (list 'progn form nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1445 ((null (cdr vars)) (list 'setq (car vars) (list 'car form)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1446 (t
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1447 (let* ((temp (gensym)) (n 0))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1448 (list 'let (list (list temp form))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1449 (list 'prog1 (list 'setq (pop vars) (list 'car temp))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1450 (cons 'setq (apply 'nconc
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1451 (mapcar (function
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1452 (lambda (v)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1453 (list v (list
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1454 'nth
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1455 (setq n (1+ n))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1456 temp))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1457 vars)))))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1458
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1459
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1460 ;;; Declarations.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1461
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1462 (defmacro locally (&rest body) (cons 'progn body))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1463 (defmacro the (type form) form)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1464
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1465 (defvar cl-proclaim-history t) ; for future compilers
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1466 (defvar cl-declare-stack t) ; for future compilers
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1467
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1468 (defun cl-do-proclaim (spec hist)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1469 (and hist (listp cl-proclaim-history) (push spec cl-proclaim-history))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1470 (cond ((eq (car-safe spec) 'special)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1471 (if (boundp 'byte-compile-bound-variables)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1472 (setq byte-compile-bound-variables
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1473 (append (cdr spec) byte-compile-bound-variables))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1474
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1475 ((eq (car-safe spec) 'inline)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1476 (while (setq spec (cdr spec))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1477 (or (memq (get (car spec) 'byte-optimizer)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1478 '(nil byte-compile-inline-expand))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1479 (error "%s already has a byte-optimizer, can't make it inline"
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1480 (car spec)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1481 (put (car spec) 'byte-optimizer 'byte-compile-inline-expand)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1482
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1483 ((eq (car-safe spec) 'notinline)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1484 (while (setq spec (cdr spec))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1485 (if (eq (get (car spec) 'byte-optimizer)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1486 'byte-compile-inline-expand)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1487 (put (car spec) 'byte-optimizer nil))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1488
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1489 ((eq (car-safe spec) 'optimize)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1490 (let ((speed (assq (nth 1 (assq 'speed (cdr spec)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1491 '((0 nil) (1 t) (2 t) (3 t))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1492 (safety (assq (nth 1 (assq 'safety (cdr spec)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1493 '((0 t) (1 t) (2 t) (3 nil)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1494 (if speed (setq cl-optimize-speed (car speed)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1495 byte-optimize (nth 1 speed)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1496 (if safety (setq cl-optimize-safety (car safety)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1497 byte-compile-delete-errors (nth 1 safety)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1498
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1499 ((and (eq (car-safe spec) 'warn) (boundp 'byte-compile-warnings))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1500 (if (eq byte-compile-warnings t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1501 (setq byte-compile-warnings byte-compile-warning-types))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1502 (while (setq spec (cdr spec))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1503 (if (consp (car spec))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1504 (if (eq (cadar spec) 0)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1505 (setq byte-compile-warnings
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1506 (delq (caar spec) byte-compile-warnings))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1507 (setq byte-compile-warnings
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1508 (adjoin (caar spec) byte-compile-warnings)))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1509 nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1510
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1511 ;;; Process any proclamations made before cl-macs was loaded.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1512 (defvar cl-proclaims-deferred)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1513 (let ((p (reverse cl-proclaims-deferred)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1514 (while p (cl-do-proclaim (pop p) t))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1515 (setq cl-proclaims-deferred nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1516
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1517 (defmacro declare (&rest specs)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1518 (if (cl-compiling-file)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1519 (while specs
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1520 (if (listp cl-declare-stack) (push (car specs) cl-declare-stack))
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1521 (cl-do-proclaim (pop specs) nil)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1522 nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1523
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1524
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1525
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1526 ;;; Generalized variables.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1527
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1528 (defmacro define-setf-method (func args &rest body)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1529 "Define a `setf' method.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1530 This method shows how to handle `setf's to places of the form (NAME ARGS...).
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1531 The argument forms ARGS are bound according to ARGLIST, as if NAME were
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1532 going to be expanded as a macro, then the BODY forms are executed and must
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1533 return a list of five elements: a temporary-variables list, a value-forms
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1534 list, a store-variables list (of length one), a store-form, and an access-
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1535 form. See `defsetf' for a simpler way to define most setf-methods.
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1536
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1537 \(fn NAME ARGLIST BODY...)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1538 (append '(eval-when (compile load eval))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1539 (if (stringp (car body))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1540 (list (list 'put (list 'quote func) '(quote setf-documentation)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1541 (pop body))))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1542 (list (cl-transform-function-property
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1543 func 'setf-method (cons args body)))))
39589
f5a85ada51c9 (define-setf-expander): Make it an
Gerd Moellmann <gerd@gnu.org>
parents: 39562
diff changeset
1544 (defalias 'define-setf-expander 'define-setf-method)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1545
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1546 (defmacro defsetf (func arg1 &rest args)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1547 "(defsetf NAME FUNC): define a `setf' method.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1548 This macro is an easy-to-use substitute for `define-setf-method' that works
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1549 well for simple place forms. In the simple `defsetf' form, `setf's of
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1550 the form (setf (NAME ARGS...) VAL) are transformed to function or macro
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1551 calls of the form (FUNC ARGS... VAL). Example: (defsetf aref aset).
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1552 Alternate form: (defsetf NAME ARGLIST (STORE) BODY...).
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1553 Here, the above `setf' call is expanded by binding the argument forms ARGS
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1554 according to ARGLIST, binding the value form VAL to STORE, then executing
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1555 BODY, which must return a Lisp form that does the necessary `setf' operation.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1556 Actually, ARGLIST and STORE may be bound to temporary variables which are
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1557 introduced automatically to preserve proper execution order of the arguments.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1558 Example: (defsetf nth (n x) (v) (list 'setcar (list 'nthcdr n x) v))."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1559 (if (listp arg1)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1560 (let* ((largs nil) (largsr nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1561 (temps nil) (tempsr nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1562 (restarg nil) (rest-temps nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1563 (store-var (car (prog1 (car args) (setq args (cdr args)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1564 (store-temp (intern (format "--%s--temp--" store-var)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1565 (lets1 nil) (lets2 nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1566 (docstr nil) (p arg1))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1567 (if (stringp (car args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1568 (setq docstr (prog1 (car args) (setq args (cdr args)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1569 (while (and p (not (eq (car p) '&aux)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1570 (if (eq (car p) '&rest)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1571 (setq p (cdr p) restarg (car p))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1572 (or (memq (car p) '(&optional &key &allow-other-keys))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1573 (setq largs (cons (if (consp (car p)) (car (car p)) (car p))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1574 largs)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1575 temps (cons (intern (format "--%s--temp--" (car largs)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1576 temps))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1577 (setq p (cdr p)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1578 (setq largs (nreverse largs) temps (nreverse temps))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1579 (if restarg
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1580 (setq largsr (append largs (list restarg))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1581 rest-temps (intern (format "--%s--temp--" restarg))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1582 tempsr (append temps (list rest-temps)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1583 (setq largsr largs tempsr temps))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1584 (let ((p1 largs) (p2 temps))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1585 (while p1
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1586 (setq lets1 (cons (list (car p2)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1587 (list 'gensym (format "--%s--" (car p1))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1588 lets1)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1589 lets2 (cons (list (car p1) (car p2)) lets2)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1590 p1 (cdr p1) p2 (cdr p2))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1591 (if restarg (setq lets2 (cons (list restarg rest-temps) lets2)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1592 (append (list 'define-setf-method func arg1)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1593 (and docstr (list docstr))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1594 (list
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1595 (list 'let*
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1596 (nreverse
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1597 (cons (list store-temp
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1598 (list 'gensym (format "--%s--" store-var)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1599 (if restarg
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1600 (append
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1601 (list
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1602 (list rest-temps
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1603 (list 'mapcar '(quote gensym)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1604 restarg)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1605 lets1)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1606 lets1)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1607 (list 'list ; 'values
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1608 (cons (if restarg 'list* 'list) tempsr)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1609 (cons (if restarg 'list* 'list) largsr)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1610 (list 'list store-temp)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1611 (cons 'let*
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1612 (cons (nreverse
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1613 (cons (list store-var store-temp)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1614 lets2))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1615 args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1616 (cons (if restarg 'list* 'list)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1617 (cons (list 'quote func) tempsr)))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1618 (list 'defsetf func '(&rest args) '(store)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1619 (let ((call (list 'cons (list 'quote arg1)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1620 '(append args (list store)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1621 (if (car args)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1622 (list 'list '(quote progn) call 'store)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1623 call)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1624
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1625 ;;; Some standard place types from Common Lisp.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1626 (defsetf aref aset)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1627 (defsetf car setcar)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1628 (defsetf cdr setcdr)
27755
3a803d09d619 (caar, cadr, cdar, cddr): Add defsetfs.
Gerd Moellmann <gerd@gnu.org>
parents: 27656
diff changeset
1629 (defsetf caar (x) (val) (list 'setcar (list 'car x) val))
3a803d09d619 (caar, cadr, cdar, cddr): Add defsetfs.
Gerd Moellmann <gerd@gnu.org>
parents: 27656
diff changeset
1630 (defsetf cadr (x) (val) (list 'setcar (list 'cdr x) val))
3a803d09d619 (caar, cadr, cdar, cddr): Add defsetfs.
Gerd Moellmann <gerd@gnu.org>
parents: 27656
diff changeset
1631 (defsetf cdar (x) (val) (list 'setcdr (list 'car x) val))
3a803d09d619 (caar, cadr, cdar, cddr): Add defsetfs.
Gerd Moellmann <gerd@gnu.org>
parents: 27656
diff changeset
1632 (defsetf cddr (x) (val) (list 'setcdr (list 'cdr x) val))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1633 (defsetf elt (seq n) (store)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1634 (list 'if (list 'listp seq) (list 'setcar (list 'nthcdr n seq) store)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1635 (list 'aset seq n store)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1636 (defsetf get put)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1637 (defsetf get* (x y &optional d) (store) (list 'put x y store))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1638 (defsetf gethash (x h &optional d) (store) (list 'puthash x store h))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1639 (defsetf nth (n x) (store) (list 'setcar (list 'nthcdr n x) store))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1640 (defsetf subseq (seq start &optional end) (new)
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
1641 (list 'progn (list 'replace seq new :start1 start :end1 end) new))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1642 (defsetf symbol-function fset)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1643 (defsetf symbol-plist setplist)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1644 (defsetf symbol-value set)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1645
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1646 ;;; Various car/cdr aliases. Note that `cadr' is handled specially.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1647 (defsetf first setcar)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1648 (defsetf second (x) (store) (list 'setcar (list 'cdr x) store))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1649 (defsetf third (x) (store) (list 'setcar (list 'cddr x) store))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1650 (defsetf fourth (x) (store) (list 'setcar (list 'cdddr x) store))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1651 (defsetf fifth (x) (store) (list 'setcar (list 'nthcdr 4 x) store))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1652 (defsetf sixth (x) (store) (list 'setcar (list 'nthcdr 5 x) store))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1653 (defsetf seventh (x) (store) (list 'setcar (list 'nthcdr 6 x) store))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1654 (defsetf eighth (x) (store) (list 'setcar (list 'nthcdr 7 x) store))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1655 (defsetf ninth (x) (store) (list 'setcar (list 'nthcdr 8 x) store))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1656 (defsetf tenth (x) (store) (list 'setcar (list 'nthcdr 9 x) store))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1657 (defsetf rest setcdr)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1658
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1659 ;;; Some more Emacs-related place types.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1660 (defsetf buffer-file-name set-visited-file-name t)
22554
f7ee88b7618a (buffer-modified-p): Make defsetf handle buffer argument.
Richard M. Stallman <rms@gnu.org>
parents: 21686
diff changeset
1661 (defsetf buffer-modified-p (&optional buf) (flag)
f7ee88b7618a (buffer-modified-p): Make defsetf handle buffer argument.
Richard M. Stallman <rms@gnu.org>
parents: 21686
diff changeset
1662 (list 'with-current-buffer buf
f7ee88b7618a (buffer-modified-p): Make defsetf handle buffer argument.
Richard M. Stallman <rms@gnu.org>
parents: 21686
diff changeset
1663 (list 'set-buffer-modified-p flag)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1664 (defsetf buffer-name rename-buffer t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1665 (defsetf buffer-string () (store)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1666 (list 'progn '(erase-buffer) (list 'insert store)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1667 (defsetf buffer-substring cl-set-buffer-substring)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1668 (defsetf current-buffer set-buffer)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1669 (defsetf current-case-table set-case-table)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1670 (defsetf current-column move-to-column t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1671 (defsetf current-global-map use-global-map t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1672 (defsetf current-input-mode () (store)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1673 (list 'progn (list 'apply 'set-input-mode store) store))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1674 (defsetf current-local-map use-local-map t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1675 (defsetf current-window-configuration set-window-configuration t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1676 (defsetf default-file-modes set-default-file-modes t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1677 (defsetf default-value set-default)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1678 (defsetf documentation-property put)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1679 (defsetf extent-data set-extent-data)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1680 (defsetf extent-face set-extent-face)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1681 (defsetf extent-priority set-extent-priority)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1682 (defsetf extent-end-position (ext) (store)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1683 (list 'progn (list 'set-extent-endpoints (list 'extent-start-position ext)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1684 store) store))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1685 (defsetf extent-start-position (ext) (store)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1686 (list 'progn (list 'set-extent-endpoints store
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1687 (list 'extent-end-position ext)) store))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1688 (defsetf face-background (f &optional s) (x) (list 'set-face-background f x s))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1689 (defsetf face-background-pixmap (f &optional s) (x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1690 (list 'set-face-background-pixmap f x s))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1691 (defsetf face-font (f &optional s) (x) (list 'set-face-font f x s))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1692 (defsetf face-foreground (f &optional s) (x) (list 'set-face-foreground f x s))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1693 (defsetf face-underline-p (f &optional s) (x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1694 (list 'set-face-underline-p f x s))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1695 (defsetf file-modes set-file-modes t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1696 (defsetf frame-height set-screen-height t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1697 (defsetf frame-parameters modify-frame-parameters t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1698 (defsetf frame-visible-p cl-set-frame-visible-p)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1699 (defsetf frame-width set-screen-width t)
39562
9c9bba5b5bad (frame-parameter): Add a setf method.
Gerd Moellmann <gerd@gnu.org>
parents: 38259
diff changeset
1700 (defsetf frame-parameter set-frame-parameter)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1701 (defsetf getenv setenv t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1702 (defsetf get-register set-register)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1703 (defsetf global-key-binding global-set-key)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1704 (defsetf keymap-parent set-keymap-parent)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1705 (defsetf local-key-binding local-set-key)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1706 (defsetf mark set-mark t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1707 (defsetf mark-marker set-mark t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1708 (defsetf marker-position set-marker t)
21160
99cb527e79ba (defsetf match-data): store-match-data => set-match-data.
Richard M. Stallman <rms@gnu.org>
parents: 20750
diff changeset
1709 (defsetf match-data set-match-data t)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1710 (defsetf mouse-position (scr) (store)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1711 (list 'set-mouse-position scr (list 'car store) (list 'cadr store)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1712 (list 'cddr store)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1713 (defsetf overlay-get overlay-put)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1714 (defsetf overlay-start (ov) (store)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1715 (list 'progn (list 'move-overlay ov store (list 'overlay-end ov)) store))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1716 (defsetf overlay-end (ov) (store)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1717 (list 'progn (list 'move-overlay ov (list 'overlay-start ov) store) store))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1718 (defsetf point goto-char)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1719 (defsetf point-marker goto-char t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1720 (defsetf point-max () (store)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1721 (list 'progn (list 'narrow-to-region '(point-min) store) store))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1722 (defsetf point-min () (store)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1723 (list 'progn (list 'narrow-to-region store '(point-max)) store))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1724 (defsetf process-buffer set-process-buffer)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1725 (defsetf process-filter set-process-filter)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1726 (defsetf process-sentinel set-process-sentinel)
49687
c2ff7876bd60 (process-get): Add setf method.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49598
diff changeset
1727 (defsetf process-get process-put)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1728 (defsetf read-mouse-position (scr) (store)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1729 (list 'set-mouse-position scr (list 'car store) (list 'cdr store)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1730 (defsetf screen-height set-screen-height t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1731 (defsetf screen-width set-screen-width t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1732 (defsetf selected-window select-window)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1733 (defsetf selected-screen select-screen)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1734 (defsetf selected-frame select-frame)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1735 (defsetf standard-case-table set-standard-case-table)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1736 (defsetf syntax-table set-syntax-table)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1737 (defsetf visited-file-modtime set-visited-file-modtime t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1738 (defsetf window-buffer set-window-buffer t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1739 (defsetf window-display-table set-window-display-table t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1740 (defsetf window-dedicated-p set-window-dedicated-p t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1741 (defsetf window-height () (store)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1742 (list 'progn (list 'enlarge-window (list '- store '(window-height))) store))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1743 (defsetf window-hscroll set-window-hscroll)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1744 (defsetf window-point set-window-point)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1745 (defsetf window-start set-window-start)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1746 (defsetf window-width () (store)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1747 (list 'progn (list 'enlarge-window (list '- store '(window-width)) t) store))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1748 (defsetf x-get-cutbuffer x-store-cutbuffer t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1749 (defsetf x-get-cut-buffer x-store-cut-buffer t) ; groan.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1750 (defsetf x-get-secondary-selection x-own-secondary-selection t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1751 (defsetf x-get-selection x-own-selection t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1752
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1753 ;;; More complex setf-methods.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1754 ;;; These should take &environment arguments, but since full arglists aren't
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1755 ;;; available while compiling cl-macs, we fake it by referring to the global
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1756 ;;; variable cl-macro-environment directly.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1757
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1758 (define-setf-method apply (func arg1 &rest rest)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1759 (or (and (memq (car-safe func) '(quote function function*))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1760 (symbolp (car-safe (cdr-safe func))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1761 (error "First arg to apply in setf is not (function SYM): %s" func))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1762 (let* ((form (cons (nth 1 func) (cons arg1 rest)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1763 (method (get-setf-method form cl-macro-environment)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1764 (list (car method) (nth 1 method) (nth 2 method)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1765 (cl-setf-make-apply (nth 3 method) (cadr func) (car method))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1766 (cl-setf-make-apply (nth 4 method) (cadr func) (car method)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1767
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1768 (defun cl-setf-make-apply (form func temps)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1769 (if (eq (car form) 'progn)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1770 (list* 'progn (cl-setf-make-apply (cadr form) func temps) (cddr form))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1771 (or (equal (last form) (last temps))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1772 (error "%s is not suitable for use with setf-of-apply" func))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1773 (list* 'apply (list 'quote (car form)) (cdr form))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1774
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1775 (define-setf-method nthcdr (n place)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1776 (let ((method (get-setf-method place cl-macro-environment))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1777 (n-temp (gensym "--nthcdr-n--"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1778 (store-temp (gensym "--nthcdr-store--")))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1779 (list (cons n-temp (car method))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1780 (cons n (nth 1 method))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1781 (list store-temp)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1782 (list 'let (list (list (car (nth 2 method))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1783 (list 'cl-set-nthcdr n-temp (nth 4 method)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1784 store-temp)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1785 (nth 3 method) store-temp)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1786 (list 'nthcdr n-temp (nth 4 method)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1787
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1788 (define-setf-method getf (place tag &optional def)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1789 (let ((method (get-setf-method place cl-macro-environment))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1790 (tag-temp (gensym "--getf-tag--"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1791 (def-temp (gensym "--getf-def--"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1792 (store-temp (gensym "--getf-store--")))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1793 (list (append (car method) (list tag-temp def-temp))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1794 (append (nth 1 method) (list tag def))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1795 (list store-temp)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1796 (list 'let (list (list (car (nth 2 method))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1797 (list 'cl-set-getf (nth 4 method)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1798 tag-temp store-temp)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1799 (nth 3 method) store-temp)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1800 (list 'getf (nth 4 method) tag-temp def-temp))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1801
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1802 (define-setf-method substring (place from &optional to)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1803 (let ((method (get-setf-method place cl-macro-environment))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1804 (from-temp (gensym "--substring-from--"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1805 (to-temp (gensym "--substring-to--"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1806 (store-temp (gensym "--substring-store--")))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1807 (list (append (car method) (list from-temp to-temp))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1808 (append (nth 1 method) (list from to))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1809 (list store-temp)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1810 (list 'let (list (list (car (nth 2 method))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1811 (list 'cl-set-substring (nth 4 method)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1812 from-temp to-temp store-temp)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1813 (nth 3 method) store-temp)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1814 (list 'substring (nth 4 method) from-temp to-temp))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1815
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1816 ;;; Getting and optimizing setf-methods.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1817 (defun get-setf-method (place &optional env)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1818 "Return a list of five values describing the setf-method for PLACE.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1819 PLACE may be any Lisp form which can appear as the PLACE argument to
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1820 a macro like `setf' or `incf'."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1821 (if (symbolp place)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1822 (let ((temp (gensym "--setf--")))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1823 (list nil nil (list temp) (list 'setq place temp) place))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1824 (or (and (symbolp (car place))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1825 (let* ((func (car place))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1826 (name (symbol-name func))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1827 (method (get func 'setf-method))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1828 (case-fold-search nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1829 (or (and method
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1830 (let ((cl-macro-environment env))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1831 (setq method (apply method (cdr place))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1832 (if (and (consp method) (= (length method) 5))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1833 method
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1834 (error "Setf-method for %s returns malformed method"
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1835 func)))
13066
9caf0cd95acf (get-setf-method): Protect caller's match-data from string-match.
Erik Naggum <erik@naggum.no>
parents: 12244
diff changeset
1836 (and (save-match-data
9caf0cd95acf (get-setf-method): Protect caller's match-data from string-match.
Erik Naggum <erik@naggum.no>
parents: 12244
diff changeset
1837 (string-match "\\`c[ad][ad][ad]?[ad]?r\\'" name))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1838 (get-setf-method (compiler-macroexpand place)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1839 (and (eq func 'edebug-after)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1840 (get-setf-method (nth (1- (length place)) place)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1841 env)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1842 (if (eq place (setq place (macroexpand place env)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1843 (if (and (symbolp (car place)) (fboundp (car place))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1844 (symbolp (symbol-function (car place))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1845 (get-setf-method (cons (symbol-function (car place))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1846 (cdr place)) env)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1847 (error "No setf-method known for %s" (car place)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1848 (get-setf-method place env)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1849
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1850 (defun cl-setf-do-modify (place opt-expr)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1851 (let* ((method (get-setf-method place cl-macro-environment))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1852 (temps (car method)) (values (nth 1 method))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1853 (lets nil) (subs nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1854 (optimize (and (not (eq opt-expr 'no-opt))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1855 (or (and (not (eq opt-expr 'unsafe))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1856 (cl-safe-expr-p opt-expr))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1857 (cl-setf-simple-store-p (car (nth 2 method))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1858 (nth 3 method)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1859 (simple (and optimize (consp place) (cl-simple-exprs-p (cdr place)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1860 (while values
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1861 (if (or simple (cl-const-expr-p (car values)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1862 (push (cons (pop temps) (pop values)) subs)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1863 (push (list (pop temps) (pop values)) lets)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1864 (list (nreverse lets)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1865 (cons (car (nth 2 method)) (sublis subs (nth 3 method)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1866 (sublis subs (nth 4 method)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1867
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1868 (defun cl-setf-do-store (spec val)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1869 (let ((sym (car spec))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1870 (form (cdr spec)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1871 (if (or (cl-const-expr-p val)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1872 (and (cl-simple-expr-p val) (eq (cl-expr-contains form sym) 1))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1873 (cl-setf-simple-store-p sym form))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1874 (subst val sym form)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1875 (list 'let (list (list sym val)) form))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1876
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1877 (defun cl-setf-simple-store-p (sym form)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1878 (and (consp form) (eq (cl-expr-contains form sym) 1)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1879 (eq (nth (1- (length form)) form) sym)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1880 (symbolp (car form)) (fboundp (car form))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1881 (not (eq (car-safe (symbol-function (car form))) 'macro))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1882
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1883 ;;; The standard modify macros.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1884 (defmacro setf (&rest args)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1885 "Set each PLACE to the value of its VAL.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1886 This is a generalized version of `setq'; the PLACEs may be symbolic
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1887 references such as (car x) or (aref x i), as well as plain symbols.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1888 For example, (setf (cadar x) y) is equivalent to (setcar (cdar x) y).
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1889 The return value is the last VAL in the list.
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1890
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1891 \(fn PLACE VAL PLACE VAL ...)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1892 (if (cdr (cdr args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1893 (let ((sets nil))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1894 (while args (push (list 'setf (pop args) (pop args)) sets))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1895 (cons 'progn (nreverse sets)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1896 (if (symbolp (car args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1897 (and args (cons 'setq args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1898 (let* ((method (cl-setf-do-modify (car args) (nth 1 args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1899 (store (cl-setf-do-store (nth 1 method) (nth 1 args))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1900 (if (car method) (list 'let* (car method) store) store)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1901
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1902 (defmacro psetf (&rest args)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1903 "Set PLACEs to the values VALs in parallel.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1904 This is like `setf', except that all VAL forms are evaluated (in order)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1905 before assigning any PLACEs to the corresponding values.
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1906
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1907 \(fn PLACE VAL PLACE VAL ...)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1908 (let ((p args) (simple t) (vars nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1909 (while p
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1910 (if (or (not (symbolp (car p))) (cl-expr-depends-p (nth 1 p) vars))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1911 (setq simple nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1912 (if (memq (car p) vars)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1913 (error "Destination duplicated in psetf: %s" (car p)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1914 (push (pop p) vars)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1915 (or p (error "Odd number of arguments to psetf"))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1916 (pop p))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1917 (if simple
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1918 (list 'progn (cons 'setf args) nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1919 (setq args (reverse args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1920 (let ((expr (list 'setf (cadr args) (car args))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1921 (while (setq args (cddr args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1922 (setq expr (list 'setf (cadr args) (list 'prog1 (car args) expr))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1923 (list 'progn expr nil)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1924
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1925 (defun cl-do-pop (place)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1926 (if (cl-simple-expr-p place)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1927 (list 'prog1 (list 'car place) (list 'setf place (list 'cdr place)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1928 (let* ((method (cl-setf-do-modify place t))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1929 (temp (gensym "--pop--")))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1930 (list 'let*
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1931 (append (car method)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1932 (list (list temp (nth 2 method))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1933 (list 'prog1
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1934 (list 'car temp)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1935 (cl-setf-do-store (nth 1 method) (list 'cdr temp)))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1936
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1937 (defmacro remf (place tag)
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
1938 "Remove TAG from property list PLACE.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1939 PLACE may be a symbol, or any generalized variable allowed by `setf'.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1940 The form returns true if TAG was found and removed, nil otherwise."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1941 (let* ((method (cl-setf-do-modify place t))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1942 (tag-temp (and (not (cl-const-expr-p tag)) (gensym "--remf-tag--")))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1943 (val-temp (and (not (cl-simple-expr-p place))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1944 (gensym "--remf-place--")))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1945 (ttag (or tag-temp tag))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1946 (tval (or val-temp (nth 2 method))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1947 (list 'let*
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1948 (append (car method)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1949 (and val-temp (list (list val-temp (nth 2 method))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1950 (and tag-temp (list (list tag-temp tag))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1951 (list 'if (list 'eq ttag (list 'car tval))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1952 (list 'progn
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1953 (cl-setf-do-store (nth 1 method) (list 'cddr tval))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1954 t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1955 (list 'cl-do-remf tval ttag)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1956
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1957 (defmacro shiftf (place &rest args)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1958 "Shift left among PLACEs.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1959 Example: (shiftf A B C) sets A to B, B to C, and returns the old A.
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1960 Each PLACE may be a symbol, or any generalized variable allowed by `setf'.
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1961
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1962 \(fn PLACE PLACE... VAL)"
41695
73a58db610c2 (shiftf): Fix more. Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41693
diff changeset
1963 (cond
73a58db610c2 (shiftf): Fix more. Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41693
diff changeset
1964 ((null args) place)
73a58db610c2 (shiftf): Fix more. Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41693
diff changeset
1965 ((symbolp place) `(prog1 ,place (setq ,place (shiftf ,@args))))
73a58db610c2 (shiftf): Fix more. Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41693
diff changeset
1966 (t
73a58db610c2 (shiftf): Fix more. Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41693
diff changeset
1967 (let ((method (cl-setf-do-modify place 'unsafe)))
73a58db610c2 (shiftf): Fix more. Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41693
diff changeset
1968 `(let* ,(car method)
73a58db610c2 (shiftf): Fix more. Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41693
diff changeset
1969 (prog1 ,(nth 2 method)
73a58db610c2 (shiftf): Fix more. Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41693
diff changeset
1970 ,(cl-setf-do-store (nth 1 method) `(shiftf ,@args))))))))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1971
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1972 (defmacro rotatef (&rest args)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1973 "Rotate left among PLACEs.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1974 Example: (rotatef A B C) sets A to B, B to C, and C to A. It returns nil.
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1975 Each PLACE may be a symbol, or any generalized variable allowed by `setf'.
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1976
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1977 \(fn PLACE...)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1978 (if (not (memq nil (mapcar 'symbolp args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1979 (and (cdr args)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1980 (let ((sets nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1981 (first (car args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1982 (while (cdr args)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1983 (setq sets (nconc sets (list (pop args) (car args)))))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1984 (nconc (list 'psetf) sets (list (car args) first))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1985 (let* ((places (reverse args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1986 (temp (gensym "--rotatef--"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1987 (form temp))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1988 (while (cdr places)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1989 (let ((method (cl-setf-do-modify (pop places) 'unsafe)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1990 (setq form (list 'let* (car method)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1991 (list 'prog1 (nth 2 method)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1992 (cl-setf-do-store (nth 1 method) form))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1993 (let ((method (cl-setf-do-modify (car places) 'unsafe)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1994 (list 'let* (append (car method) (list (list temp (nth 2 method))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1995 (cl-setf-do-store (nth 1 method) form) nil)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1996
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1997 (defmacro letf (bindings &rest body)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
1998 "Temporarily bind to PLACEs.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1999 This is the analogue of `let', but with generalized variables (in the
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2000 sense of `setf') for the PLACEs. Each PLACE is set to the corresponding
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2001 VALUE, then the BODY forms are executed. On exit, either normally or
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2002 because of a `throw' or error, the PLACEs are set back to their original
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2003 values. Note that this macro is *not* available in Common Lisp.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2004 As a special case, if `(PLACE)' is used instead of `(PLACE VALUE)',
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2005 the PLACE is not modified before executing BODY.
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2006
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2007 \(fn ((PLACE VALUE) ...) BODY...)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2008 (if (and (not (cdr bindings)) (cdar bindings) (symbolp (caar bindings)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2009 (list* 'let bindings body)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2010 (let ((lets nil) (sets nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2011 (unsets nil) (rev (reverse bindings)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2012 (while rev
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2013 (let* ((place (if (symbolp (caar rev))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2014 (list 'symbol-value (list 'quote (caar rev)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2015 (caar rev)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2016 (value (cadar rev))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2017 (method (cl-setf-do-modify place 'no-opt))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2018 (save (gensym "--letf-save--"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2019 (bound (and (memq (car place) '(symbol-value symbol-function))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2020 (gensym "--letf-bound--")))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2021 (temp (and (not (cl-const-expr-p value)) (cdr bindings)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2022 (gensym "--letf-val--"))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2023 (setq lets (nconc (car method)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2024 (if bound
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2025 (list (list bound
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2026 (list (if (eq (car place)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2027 'symbol-value)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2028 'boundp 'fboundp)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2029 (nth 1 (nth 2 method))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2030 (list save (list 'and bound
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2031 (nth 2 method))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2032 (list (list save (nth 2 method))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2033 (and temp (list (list temp value)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2034 lets)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2035 body (list
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2036 (list 'unwind-protect
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2037 (cons 'progn
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2038 (if (cdr (car rev))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2039 (cons (cl-setf-do-store (nth 1 method)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2040 (or temp value))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2041 body)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2042 body))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2043 (if bound
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2044 (list 'if bound
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2045 (cl-setf-do-store (nth 1 method) save)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2046 (list (if (eq (car place) 'symbol-value)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2047 'makunbound 'fmakunbound)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2048 (nth 1 (nth 2 method))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2049 (cl-setf-do-store (nth 1 method) save))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2050 rev (cdr rev))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2051 (list* 'let* lets body))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2052
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2053 (defmacro letf* (bindings &rest body)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2054 "Temporarily bind to PLACEs.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2055 This is the analogue of `let*', but with generalized variables (in the
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2056 sense of `setf') for the PLACEs. Each PLACE is set to the corresponding
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2057 VALUE, then the BODY forms are executed. On exit, either normally or
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2058 because of a `throw' or error, the PLACEs are set back to their original
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2059 values. Note that this macro is *not* available in Common Lisp.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2060 As a special case, if `(PLACE)' is used instead of `(PLACE VALUE)',
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2061 the PLACE is not modified before executing BODY.
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2062
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2063 \(fn ((PLACE VALUE) ...) BODY...)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2064 (if (null bindings)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2065 (cons 'progn body)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2066 (setq bindings (reverse bindings))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2067 (while bindings
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2068 (setq body (list (list* 'letf (list (pop bindings)) body))))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2069 (car body)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2070
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2071 (defmacro callf (func place &rest args)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2072 "Set PLACE to (FUNC PLACE ARGS...).
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2073 FUNC should be an unquoted function name. PLACE may be a symbol,
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2074 or any generalized variable allowed by `setf'.
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2075
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2076 \(fn FUNC PLACE ARGS...)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2077 (let* ((method (cl-setf-do-modify place (cons 'list args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2078 (rargs (cons (nth 2 method) args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2079 (list 'let* (car method)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2080 (cl-setf-do-store (nth 1 method)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2081 (if (symbolp func) (cons func rargs)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2082 (list* 'funcall (list 'function func)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2083 rargs))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2084
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2085 (defmacro callf2 (func arg1 place &rest args)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2086 "Set PLACE to (FUNC ARG1 PLACE ARGS...).
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2087 Like `callf', but PLACE is the second argument of FUNC, not the first.
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2088
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2089 \(fn FUNC ARG1 PLACE ARGS...)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2090 (if (and (cl-safe-expr-p arg1) (cl-simple-expr-p place) (symbolp func))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2091 (list 'setf place (list* func arg1 place args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2092 (let* ((method (cl-setf-do-modify place (cons 'list args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2093 (temp (and (not (cl-const-expr-p arg1)) (gensym "--arg1--")))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2094 (rargs (list* (or temp arg1) (nth 2 method) args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2095 (list 'let* (append (and temp (list (list temp arg1))) (car method))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2096 (cl-setf-do-store (nth 1 method)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2097 (if (symbolp func) (cons func rargs)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2098 (list* 'funcall (list 'function func)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2099 rargs)))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2100
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2101 (defmacro define-modify-macro (name arglist func &optional doc)
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
2102 "Define a `setf'-like modify macro.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2103 If NAME is called, it combines its PLACE argument with the other arguments
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2104 from ARGLIST using FUNC: (define-modify-macro incf (&optional (n 1)) +)"
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2105 (if (memq '&key arglist) (error "&key not allowed in define-modify-macro"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2106 (let ((place (gensym "--place--")))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2107 (list 'defmacro* name (cons place arglist) doc
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2108 (list* (if (memq '&rest arglist) 'list* 'list)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2109 '(quote callf) (list 'quote func) place
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2110 (cl-arglist-args arglist)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2111
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2112
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2113 ;;; Structures.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2114
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2115 (defmacro defstruct (struct &rest descs)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2116 "Define a struct type.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2117 This macro defines a new Lisp data type called NAME, which contains data
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2118 stored in SLOTs. This defines a `make-NAME' constructor, a `copy-NAME'
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2119 copier, a `NAME-p' predicate, and setf-able `NAME-SLOT' accessors.
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2120
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2121 \(fn (NAME OPTIONS...) (SLOT SLOT-OPTS...)...)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2122 (let* ((name (if (consp struct) (car struct) struct))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2123 (opts (cdr-safe struct))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2124 (slots nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2125 (defaults nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2126 (conc-name (concat (symbol-name name) "-"))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2127 (constructor (intern (format "make-%s" name)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2128 (constrs nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2129 (copier (intern (format "copy-%s" name)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2130 (predicate (intern (format "%s-p" name)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2131 (print-func nil) (print-auto nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2132 (safety (if (cl-compiling-file) cl-optimize-safety 3))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2133 (include nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2134 (tag (intern (format "cl-struct-%s" name)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2135 (tag-symbol (intern (format "cl-struct-%s-tags" name)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2136 (include-descs nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2137 (side-eff nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2138 (type nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2139 (named nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2140 (forms nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2141 pred-form pred-check)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2142 (if (stringp (car descs))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2143 (push (list 'put (list 'quote name) '(quote structure-documentation)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2144 (pop descs)) forms))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2145 (setq descs (cons '(cl-tag-slot)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2146 (mapcar (function (lambda (x) (if (consp x) x (list x))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2147 descs)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2148 (while opts
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2149 (let ((opt (if (consp (car opts)) (caar opts) (car opts)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2150 (args (cdr-safe (pop opts))))
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
2151 (cond ((eq opt :conc-name)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2152 (if args
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2153 (setq conc-name (if (car args)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2154 (symbol-name (car args)) ""))))
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
2155 ((eq opt :constructor)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2156 (if (cdr args)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2157 (push args constrs)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2158 (if args (setq constructor (car args)))))
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
2159 ((eq opt :copier)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2160 (if args (setq copier (car args))))
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
2161 ((eq opt :predicate)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2162 (if args (setq predicate (car args))))
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
2163 ((eq opt :include)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2164 (setq include (car args)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2165 include-descs (mapcar (function
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2166 (lambda (x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2167 (if (consp x) x (list x))))
15030
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
2168 (cdr args))))
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
2169 ((eq opt :print-function)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2170 (setq print-func (car args)))
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
2171 ((eq opt :type)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2172 (setq type (car args)))
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
2173 ((eq opt :named)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2174 (setq named t))
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
2175 ((eq opt :initial-offset)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2176 (setq descs (nconc (make-list (car args) '(cl-skip-slot))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2177 descs)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2178 (t
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2179 (error "Slot option %s unrecognized" opt)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2180 (if print-func
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2181 (setq print-func (list 'progn
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2182 (list 'funcall (list 'function print-func)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2183 'cl-x 'cl-s 'cl-n) t))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2184 (or type (and include (not (get include 'cl-struct-print)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2185 (setq print-auto t
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2186 print-func (and (or (not (or include type)) (null print-func))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2187 (list 'progn
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2188 (list 'princ (format "#S(%s" name)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2189 'cl-s))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2190 (if include
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2191 (let ((inc-type (get include 'cl-struct-type))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2192 (old-descs (get include 'cl-struct-slots)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2193 (or inc-type (error "%s is not a struct name" include))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2194 (and type (not (eq (car inc-type) type))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2195 (error ":type disagrees with :include for %s" name))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2196 (while include-descs
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2197 (setcar (memq (or (assq (caar include-descs) old-descs)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2198 (error "No slot %s in included struct %s"
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2199 (caar include-descs) include))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2200 old-descs)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2201 (pop include-descs)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2202 (setq descs (append old-descs (delq (assq 'cl-tag-slot descs) descs))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2203 type (car inc-type)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2204 named (assq 'cl-tag-slot descs))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2205 (if (cadr inc-type) (setq tag name named t))
15030
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
2206 (let ((incl include))
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
2207 (while incl
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2208 (push (list 'pushnew (list 'quote tag)
15030
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
2209 (intern (format "cl-struct-%s-tags" incl)))
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
2210 forms)
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
2211 (setq incl (get incl 'cl-struct-include)))))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2212 (if type
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2213 (progn
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2214 (or (memq type '(vector list))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2215 (error "Illegal :type specifier: %s" type))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2216 (if named (setq tag name)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2217 (setq type 'vector named 'true)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2218 (or named (setq descs (delq (assq 'cl-tag-slot descs) descs)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2219 (push (list 'defvar tag-symbol) forms)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2220 (setq pred-form (and named
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2221 (let ((pos (- (length descs)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2222 (length (memq (assq 'cl-tag-slot descs)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2223 descs)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2224 (if (eq type 'vector)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2225 (list 'and '(vectorp cl-x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2226 (list '>= '(length cl-x) (length descs))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2227 (list 'memq (list 'aref 'cl-x pos)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2228 tag-symbol))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2229 (if (= pos 0)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2230 (list 'memq '(car-safe cl-x) tag-symbol)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2231 (list 'and '(consp cl-x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2232 (list 'memq (list 'nth pos 'cl-x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2233 tag-symbol))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2234 pred-check (and pred-form (> safety 0)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2235 (if (and (eq (caadr pred-form) 'vectorp)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2236 (= safety 1))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2237 (cons 'and (cdddr pred-form)) pred-form)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2238 (let ((pos 0) (descp descs))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2239 (while descp
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2240 (let* ((desc (pop descp))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2241 (slot (car desc)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2242 (if (memq slot '(cl-tag-slot cl-skip-slot))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2243 (progn
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2244 (push nil slots)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2245 (push (and (eq slot 'cl-tag-slot) (list 'quote tag))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2246 defaults))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2247 (if (assq slot descp)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2248 (error "Duplicate slots named %s in %s" slot name))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2249 (let ((accessor (intern (format "%s%s" conc-name slot))))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2250 (push slot slots)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2251 (push (nth 1 desc) defaults)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2252 (push (list*
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2253 'defsubst* accessor '(cl-x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2254 (append
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2255 (and pred-check
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2256 (list (list 'or pred-check
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2257 (list 'error
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2258 (format "%s accessing a non-%s"
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2259 accessor name)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2260 'cl-x))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2261 (list (if (eq type 'vector) (list 'aref 'cl-x pos)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2262 (if (= pos 0) '(car cl-x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2263 (list 'nth pos 'cl-x)))))) forms)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2264 (push (cons accessor t) side-eff)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2265 (push (list 'define-setf-method accessor '(cl-x)
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
2266 (if (cadr (memq :read-only (cddr desc)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2267 (list 'error (format "%s is a read-only slot"
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2268 accessor))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2269 (list 'cl-struct-setf-expander 'cl-x
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2270 (list 'quote name) (list 'quote accessor)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2271 (and pred-check (list 'quote pred-check))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2272 pos)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2273 forms)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2274 (if print-auto
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2275 (nconc print-func
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2276 (list (list 'princ (format " %s" slot) 'cl-s)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2277 (list 'prin1 (list accessor 'cl-x) 'cl-s)))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2278 (setq pos (1+ pos))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2279 (setq slots (nreverse slots)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2280 defaults (nreverse defaults))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2281 (and predicate pred-form
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2282 (progn (push (list 'defsubst* predicate '(cl-x)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2283 (if (eq (car pred-form) 'and)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2284 (append pred-form '(t))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2285 (list 'and pred-form t))) forms)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2286 (push (cons predicate 'error-free) side-eff)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2287 (and copier
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2288 (progn (push (list 'defun copier '(x) '(copy-sequence x)) forms)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2289 (push (cons copier t) side-eff)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2290 (if constructor
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2291 (push (list constructor
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2292 (cons '&key (delq nil (copy-sequence slots))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2293 constrs))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2294 (while constrs
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2295 (let* ((name (caar constrs))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2296 (args (cadr (pop constrs)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2297 (anames (cl-arglist-args args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2298 (make (mapcar* (function (lambda (s d) (if (memq s anames) s d)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2299 slots defaults)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2300 (push (list 'defsubst* name
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2301 (list* '&cl-defs (list 'quote (cons nil descs)) args)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2302 (cons type make)) forms)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2303 (if (cl-safe-expr-p (cons 'progn (mapcar 'second descs)))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2304 (push (cons name t) side-eff))))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2305 (if print-auto (nconc print-func (list '(princ ")" cl-s) t)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2306 (if print-func
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2307 (push (list 'push
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2308 (list 'function
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2309 (list 'lambda '(cl-x cl-s cl-n)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2310 (list 'and pred-form print-func)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2311 'custom-print-functions) forms))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2312 (push (list 'setq tag-symbol (list 'list (list 'quote tag))) forms)
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2313 (push (list* 'eval-when '(compile load eval)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2314 (list 'put (list 'quote name) '(quote cl-struct-slots)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2315 (list 'quote descs))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2316 (list 'put (list 'quote name) '(quote cl-struct-type)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2317 (list 'quote (list type (eq named t))))
15030
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
2318 (list 'put (list 'quote name) '(quote cl-struct-include)
257fd294d7cb (defstruct): Treat multi-nested :include properly.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
2319 (list 'quote include))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2320 (list 'put (list 'quote name) '(quote cl-struct-print)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2321 print-auto)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2322 (mapcar (function (lambda (x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2323 (list 'put (list 'quote (car x))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2324 '(quote side-effect-free)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2325 (list 'quote (cdr x)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2326 side-eff))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2327 forms)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2328 (cons 'progn (nreverse (cons (list 'quote name) forms)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2329
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2330 (defun cl-struct-setf-expander (x name accessor pred-form pos)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2331 (let* ((temp (gensym "--x--")) (store (gensym "--store--")))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2332 (list (list temp) (list x) (list store)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2333 (append '(progn)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2334 (and pred-form
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2335 (list (list 'or (subst temp 'cl-x pred-form)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2336 (list 'error
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2337 (format
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2338 "%s storing a non-%s" accessor name)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2339 temp))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2340 (list (if (eq (car (get name 'cl-struct-type)) 'vector)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2341 (list 'aset temp pos store)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2342 (list 'setcar
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2343 (if (<= pos 5)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2344 (let ((xx temp))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2345 (while (>= (setq pos (1- pos)) 0)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2346 (setq xx (list 'cdr xx)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2347 xx)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2348 (list 'nthcdr pos temp))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2349 store))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2350 (list accessor temp))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2351
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2352
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2353 ;;; Types and assertions.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2354
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
2355 (defmacro deftype (name arglist &rest body)
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
2356 "Define NAME as a new data type.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2357 The type name can then be used in `typecase', `check-type', etc."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2358 (list 'eval-when '(compile load eval)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2359 (cl-transform-function-property
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
2360 name 'cl-deftype-handler (cons (list* '&cl-defs ''('*) arglist) body))))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2361
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2362 (defun cl-make-type-test (val type)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2363 (if (symbolp type)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2364 (cond ((get type 'cl-deftype-handler)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2365 (cl-make-type-test val (funcall (get type 'cl-deftype-handler))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2366 ((memq type '(nil t)) type)
41693
fce351ce81cf (shiftf): Fix the fast case so
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39589
diff changeset
2367 ((eq type 'null) `(null ,val))
fce351ce81cf (shiftf): Fix the fast case so
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39589
diff changeset
2368 ((eq type 'float) `(floatp-safe ,val))
fce351ce81cf (shiftf): Fix the fast case so
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39589
diff changeset
2369 ((eq type 'real) `(numberp ,val))
fce351ce81cf (shiftf): Fix the fast case so
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39589
diff changeset
2370 ((eq type 'fixnum) `(integerp ,val))
fce351ce81cf (shiftf): Fix the fast case so
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39589
diff changeset
2371 ;; FIXME: Should `character' accept things like ?\C-\M-a ? -stef
41699
b0754865d85c (cl-make-type-test): Fix paren typo.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41695
diff changeset
2372 ((memq type '(character string-char)) `(char-valid-p ,val))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2373 (t
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2374 (let* ((name (symbol-name type))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2375 (namep (intern (concat name "p"))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2376 (if (fboundp namep) (list namep val)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2377 (list (intern (concat name "-p")) val)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2378 (cond ((get (car type) 'cl-deftype-handler)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2379 (cl-make-type-test val (apply (get (car type) 'cl-deftype-handler)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2380 (cdr type))))
41693
fce351ce81cf (shiftf): Fix the fast case so
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39589
diff changeset
2381 ((memq (car type) '(integer float real number))
fce351ce81cf (shiftf): Fix the fast case so
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39589
diff changeset
2382 (delq t (and (cl-make-type-test val (car type))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2383 (if (memq (cadr type) '(* nil)) t
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2384 (if (consp (cadr type)) (list '> val (caadr type))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2385 (list '>= val (cadr type))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2386 (if (memq (caddr type) '(* nil)) t
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2387 (if (consp (caddr type)) (list '< val (caaddr type))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2388 (list '<= val (caddr type)))))))
41693
fce351ce81cf (shiftf): Fix the fast case so
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39589
diff changeset
2389 ((memq (car type) '(and or not))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2390 (cons (car type)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2391 (mapcar (function (lambda (x) (cl-make-type-test val x)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2392 (cdr type))))
41693
fce351ce81cf (shiftf): Fix the fast case so
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39589
diff changeset
2393 ((memq (car type) '(member member*))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2394 (list 'and (list 'member* val (list 'quote (cdr type))) t))
41693
fce351ce81cf (shiftf): Fix the fast case so
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39589
diff changeset
2395 ((eq (car type) 'satisfies) (list (cadr type) val))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2396 (t (error "Bad type spec: %s" type)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2397
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2398 (defun typep (val type) ; See compiler macro below.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2399 "Check that OBJECT is of type TYPE.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2400 TYPE is a Common Lisp-style type specifier."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2401 (eval (cl-make-type-test 'val type)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2402
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2403 (defmacro check-type (form type &optional string)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2404 "Verify that FORM is of type TYPE; signal an error if not.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2405 STRING is an optional description of the desired type."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2406 (and (or (not (cl-compiling-file))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2407 (< cl-optimize-speed 3) (= cl-optimize-safety 3))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2408 (let* ((temp (if (cl-simple-expr-p form 3) form (gensym)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2409 (body (list 'or (cl-make-type-test temp type)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2410 (list 'signal '(quote wrong-type-argument)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2411 (list 'list (or string (list 'quote type))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2412 temp (list 'quote form))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2413 (if (eq temp form) (list 'progn body nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2414 (list 'let (list (list temp form)) body nil)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2415
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2416 (defmacro assert (form &optional show-args string &rest args)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2417 "Verify that FORM returns non-nil; signal an error if not.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2418 Second arg SHOW-ARGS means to include arguments of FORM in message.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2419 Other args STRING and ARGS... are arguments to be passed to `error'.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2420 They are not evaluated unless the assertion fails. If STRING is
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2421 omitted, a default message listing FORM itself is used."
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2422 (and (or (not (cl-compiling-file))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2423 (< cl-optimize-speed 3) (= cl-optimize-safety 3))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2424 (let ((sargs (and show-args (delq nil (mapcar
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2425 (function
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2426 (lambda (x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2427 (and (not (cl-const-expr-p x))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2428 x))) (cdr form))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2429 (list 'progn
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2430 (list 'or form
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2431 (if string
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2432 (list* 'error string (append sargs args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2433 (list 'signal '(quote cl-assertion-failed)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2434 (list* 'list (list 'quote form) sargs))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2435 nil))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2436
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2437 (defmacro ignore-errors (&rest body)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2438 "Execute FORMS; if an error occurs, return nil.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2439 Otherwise, return result of last FORM."
39562
9c9bba5b5bad (frame-parameter): Add a setf method.
Gerd Moellmann <gerd@gnu.org>
parents: 38259
diff changeset
2440 `(condition-case nil (progn ,@body) (error nil)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2441
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2442
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2443 ;;; Compiler macros.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2444
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2445 (defmacro define-compiler-macro (func args &rest body)
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
2446 "Define a compiler-only macro.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2447 This is like `defmacro', but macro expansion occurs only if the call to
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2448 FUNC is compiled (i.e., not interpreted). Compiler macros should be used
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2449 for optimizing the way calls to FUNC are compiled; the form returned by
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2450 BODY should do the same thing as a call to the normal function called
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2451 FUNC, though possibly more efficiently. Note that, like regular macros,
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2452 compiler macros are expanded repeatedly until no further expansions are
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2453 possible. Unlike regular macros, BODY can decide to \"punt\" and leave the
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2454 original function call alone by declaring an initial `&whole foo' parameter
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2455 and then returning foo."
20750
df2745fa6999 (define-compiler-macro): Handle empty arglist.
Richard M. Stallman <rms@gnu.org>
parents: 19919
diff changeset
2456 (let ((p args) (res nil))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2457 (while (consp p) (push (pop p) res))
20750
df2745fa6999 (define-compiler-macro): Handle empty arglist.
Richard M. Stallman <rms@gnu.org>
parents: 19919
diff changeset
2458 (setq args (nconc (nreverse res) (and p (list '&rest p)))))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2459 (list 'eval-when '(compile load eval)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2460 (cl-transform-function-property
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2461 func 'cl-compiler-macro
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2462 (cons (if (memq '&whole args) (delq '&whole args)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2463 (cons '--cl-whole-arg-- args)) body))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2464 (list 'or (list 'get (list 'quote func) '(quote byte-compile))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2465 (list 'put (list 'quote func) '(quote byte-compile)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2466 '(quote cl-byte-compile-compiler-macro)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2467
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2468 (defun compiler-macroexpand (form)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2469 (while
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2470 (let ((func (car-safe form)) (handler nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2471 (while (and (symbolp func)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2472 (not (setq handler (get func 'cl-compiler-macro)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2473 (fboundp func)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2474 (or (not (eq (car-safe (symbol-function func)) 'autoload))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2475 (load (nth 1 (symbol-function func)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2476 (setq func (symbol-function func)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2477 (and handler
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2478 (not (eq form (setq form (apply handler form (cdr form))))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2479 form)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2480
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2481 (defun cl-byte-compile-compiler-macro (form)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2482 (if (eq form (setq form (compiler-macroexpand form)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2483 (byte-compile-normal-call form)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2484 (byte-compile-form form)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2485
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2486 (defmacro defsubst* (name args &rest body)
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2487 "Define NAME as a function.
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2488 Like `defun', except the function is automatically declared `inline',
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2489 ARGLIST allows full Common Lisp conventions, and BODY is implicitly
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2490 surrounded by (block NAME ...).
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2491
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2492 \(fn NAME ARGLIST [DOCSTRING] BODY...)"
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2493 (let* ((argns (cl-arglist-args args)) (p argns)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2494 (pbody (cons 'progn body))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2495 (unsafe (not (cl-safe-expr-p pbody))))
47665
3cb92730a3fb Use the new usage-in-docstring syntax.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42206
diff changeset
2496 (while (and p (eq (cl-expr-contains args (car p)) 1)) (pop p))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2497 (list 'progn
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2498 (if p nil ; give up if defaults refer to earlier args
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2499 (list 'define-compiler-macro name
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2500 (list* '&whole 'cl-whole '&cl-quote args)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2501 (list* 'cl-defsubst-expand (list 'quote argns)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2502 (list 'quote (list* 'block name body))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2503 (not (or unsafe (cl-expr-access-order pbody argns)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2504 (and (memq '&key args) 'cl-whole) unsafe argns)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2505 (list* 'defun* name args body))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2506
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2507 (defun cl-defsubst-expand (argns body simple whole unsafe &rest argvs)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2508 (if (and whole (not (cl-safe-expr-p (cons 'progn argvs)))) whole
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2509 (if (cl-simple-exprs-p argvs) (setq simple t))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2510 (let ((lets (delq nil
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2511 (mapcar* (function
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2512 (lambda (argn argv)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2513 (if (or simple (cl-const-expr-p argv))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2514 (progn (setq body (subst argv argn body))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2515 (and unsafe (list argn argv)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2516 (list argn argv))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2517 argns argvs))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2518 (if lets (list 'let lets body) body))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2519
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2520
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2521 ;;; Compile-time optimizations for some functions defined in this package.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2522 ;;; Note that cl.el arranges to force cl-macs to be loaded at compile-time,
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2523 ;;; mainly to make sure these macros will be present.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2524
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2525 (put 'eql 'byte-compile nil)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2526 (define-compiler-macro eql (&whole form a b)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2527 (cond ((eq (cl-const-expr-p a) t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2528 (let ((val (cl-const-expr-val a)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2529 (if (and (numberp val) (not (integerp val)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2530 (list 'equal a b)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2531 (list 'eq a b))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2532 ((eq (cl-const-expr-p b) t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2533 (let ((val (cl-const-expr-val b)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2534 (if (and (numberp val) (not (integerp val)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2535 (list 'equal a b)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2536 (list 'eq a b))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2537 ((cl-simple-expr-p a 5)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2538 (list 'if (list 'numberp a)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2539 (list 'equal a b)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2540 (list 'eq a b)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2541 ((and (cl-safe-expr-p a)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2542 (cl-simple-expr-p b 5))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2543 (list 'if (list 'numberp b)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2544 (list 'equal a b)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2545 (list 'eq a b)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2546 (t form)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2547
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2548 (define-compiler-macro member* (&whole form a list &rest keys)
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
2549 (let ((test (and (= (length keys) 2) (eq (car keys) :test)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2550 (cl-const-expr-val (nth 1 keys)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2551 (cond ((eq test 'eq) (list 'memq a list))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2552 ((eq test 'equal) (list 'member a list))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2553 ((or (null keys) (eq test 'eql))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2554 (if (eq (cl-const-expr-p a) t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2555 (list (if (floatp-safe (cl-const-expr-val a)) 'member 'memq)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2556 a list)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2557 (if (eq (cl-const-expr-p list) t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2558 (let ((p (cl-const-expr-val list)) (mb nil) (mq nil))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2559 (if (not (cdr p))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2560 (and p (list 'eql a (list 'quote (car p))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2561 (while p
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2562 (if (floatp-safe (car p)) (setq mb t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2563 (or (integerp (car p)) (symbolp (car p)) (setq mq t)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2564 (setq p (cdr p)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2565 (if (not mb) (list 'memq a list)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2566 (if (not mq) (list 'member a list) form))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2567 form)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2568 (t form))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2569
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2570 (define-compiler-macro assoc* (&whole form a list &rest keys)
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
2571 (let ((test (and (= (length keys) 2) (eq (car keys) :test)
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2572 (cl-const-expr-val (nth 1 keys)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2573 (cond ((eq test 'eq) (list 'assq a list))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2574 ((eq test 'equal) (list 'assoc a list))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2575 ((and (eq (cl-const-expr-p a) t) (or (null keys) (eq test 'eql)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2576 (if (floatp-safe (cl-const-expr-val a))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2577 (list 'assoc a list) (list 'assq a list)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2578 (t form))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2579
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2580 (define-compiler-macro adjoin (&whole form a list &rest keys)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2581 (if (and (cl-simple-expr-p a) (cl-simple-expr-p list)
28824
add63b27c709 Doc fixes; mainly avoid duplicating arg
Dave Love <fx@gnu.org>
parents: 28178
diff changeset
2582 (not (memq :key keys)))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2583 (list 'if (list* 'member* a list keys) list (list 'cons a list))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2584 form))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2585
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2586 (define-compiler-macro list* (arg &rest others)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2587 (let* ((args (reverse (cons arg others)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2588 (form (car args)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2589 (while (setq args (cdr args))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2590 (setq form (list 'cons (car args) form)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2591 form))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2592
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2593 (define-compiler-macro get* (sym prop &optional def)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2594 (if def
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2595 (list 'getf (list 'symbol-plist sym) prop def)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2596 (list 'get sym prop)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2597
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2598 (define-compiler-macro typep (&whole form val type)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2599 (if (cl-const-expr-p type)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2600 (let ((res (cl-make-type-test val (cl-const-expr-val type))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2601 (if (or (memq (cl-expr-contains res val) '(nil 1))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2602 (cl-simple-expr-p val)) res
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2603 (let ((temp (gensym)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2604 (list 'let (list (list temp val)) (subst temp val res)))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2605 form))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2606
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2607
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2608 (mapcar (function
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2609 (lambda (y)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2610 (put (car y) 'side-effect-free t)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2611 (put (car y) 'byte-compile 'cl-byte-compile-compiler-macro)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2612 (put (car y) 'cl-compiler-macro
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2613 (list 'lambda '(w x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2614 (if (symbolp (cadr y))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2615 (list 'list (list 'quote (cadr y))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2616 (list 'list (list 'quote (caddr y)) 'x))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2617 (cons 'list (cdr y)))))))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2618 '((first 'car x) (second 'cadr x) (third 'caddr x) (fourth 'cadddr x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2619 (fifth 'nth 4 x) (sixth 'nth 5 x) (seventh 'nth 6 x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2620 (eighth 'nth 7 x) (ninth 'nth 8 x) (tenth 'nth 9 x)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2621 (rest 'cdr x) (endp 'null x) (plusp '> x 0) (minusp '< x 0)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2622 (caaar car caar) (caadr car cadr) (cadar car cdar)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2623 (caddr car cddr) (cdaar cdr caar) (cdadr cdr cadr)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2624 (cddar cdr cdar) (cdddr cdr cddr) (caaaar car caaar)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2625 (caaadr car caadr) (caadar car cadar) (caaddr car caddr)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2626 (cadaar car cdaar) (cadadr car cdadr) (caddar car cddar)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2627 (cadddr car cdddr) (cdaaar cdr caaar) (cdaadr cdr caadr)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2628 (cdadar cdr cadar) (cdaddr cdr caddr) (cddaar cdr cdaar)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2629 (cddadr cdr cdadr) (cdddar cdr cddar) (cddddr cdr cdddr) ))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2630
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2631 ;;; Things that are inline.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2632 (proclaim '(inline floatp-safe acons map concatenate notany notevery
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2633 cl-set-elt revappend nreconc gethash))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2634
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2635 ;;; Things that are side-effect-free.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2636 (mapcar (function (lambda (x) (put x 'side-effect-free t)))
26940
f1998d661bc2 Remove conditional definition of eval-when-compile. Don't specify abs,
Dave Love <fx@gnu.org>
parents: 22554
diff changeset
2637 '(oddp evenp signum last butlast ldiff pairlis gcd lcm
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2638 isqrt floor* ceiling* truncate* round* mod* rem* subseq
26940
f1998d661bc2 Remove conditional definition of eval-when-compile. Don't specify abs,
Dave Love <fx@gnu.org>
parents: 22554
diff changeset
2639 list-length get* getf))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2640
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2641 ;;; Things that are side-effect-and-error-free.
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2642 (mapcar (function (lambda (x) (put x 'side-effect-free 'error-free)))
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2643 '(eql floatp-safe list* subst acons equalp random-state-p
26940
f1998d661bc2 Remove conditional definition of eval-when-compile. Don't specify abs,
Dave Love <fx@gnu.org>
parents: 22554
diff changeset
2644 copy-tree sublis))
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2645
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2646
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2647 (run-hooks 'cl-macs-load-hook)
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2648
48720
9f27d033e1a7 Add local variable list to turn off cl-function warnings.
Richard M. Stallman <rms@gnu.org>
parents: 48550
diff changeset
2649 ;;; Local variables:
9f27d033e1a7 Add local variable list to turn off cl-function warnings.
Richard M. Stallman <rms@gnu.org>
parents: 48550
diff changeset
2650 ;;; byte-compile-warnings: (redefine callargs free-vars unresolved obsolete noruntime)
9f27d033e1a7 Add local variable list to turn off cl-function warnings.
Richard M. Stallman <rms@gnu.org>
parents: 48550
diff changeset
2651 ;;; End:
9f27d033e1a7 Add local variable list to turn off cl-function warnings.
Richard M. Stallman <rms@gnu.org>
parents: 48550
diff changeset
2652
4355
691a28818487 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2653 ;;; cl-macs.el ends here