(define-slime-contrib slime-indentation
"cl-indent.el as a slime-contrib module"
(:swank-dependencies swank-indentation)
(:on-load (run-hooks 'cl-indent:load-hook)))
(defun slime-handle-indentation-update (alist)
"Update Lisp indent information for slime-indentation.el.
ALIST is a list of (SYMBOL-NAME . INDENT-SPEC) of proposed indentation
settings for `common-lisp-indent-function'. The appropriate property
is setup, unless the user already set one explicitly."
(dolist (info alist)
(let ((symbol (intern (car info)))
(indent (cdr info)))
(define-cl-indent (cons symbol
(etypecase indent
(number (list indent))
(cons (labels ((walk (indent)
(etypecase indent
((or number null) indent)
(cons (cons (walk (car indent))
(walk (cdr indent))))
(string (intern (downcase indent))))))
(list (walk indent))))
(string (intern (downcase indent))))))
(run-hook-with-args 'slime-indentation-update-hooks symbol indent))))
(defun cl-indent ()
"Switch on Common Lisp indentation for the current buffer.
May also be used as hook function, e.g., in lisp-mode-hook.
If you want to do use this indentation for all Lisp buffers, incl.
Emacs Lisp code, simply eval
(setq lisp-indent-function 'cl-indent:function)
You might want to do this in some setup file, e.g., in ~/.emacs ."
(interactive)
(make-local-variable 'lisp-indent-function)
(setq lisp-indent-function 'cl-indent:function))
(defvar cl-indent::maximum-backtracking 3
"Maximum depth to backtrack out from a sublist for structured indentation.
If this variable is 0, no backtracking will occur and forms such as flet
may not be correctly indented.")
(defvar cl-indent:tag-indentation 1
"*Indentation of tags relative to containing list.
This variable is used by the function cl-indent:tagbody.")
(defvar cl-indent:tag-body-indentation 3
"*Indentation of non-tagged lines relative to containing list.
This variable is used by the function cl-indent:tagbody to indent normal
lines (lines without tags).
The indentation is relative to the indentation of the parenthesis enclosing
he special form. If the value is t, the body of tags will be indented
as a block at the same indentation as the first s-expression following
the tag. In this case, any forms before the first tag are indented
by lisp-body-indent.")
(defun common-lisp-indent-function (indent-point state)
"Old name of #'cl-indent:function."
(cl-indent:function indent-point state))
(make-obsolete #'common-lisp-indent-function #'cl-indent:function)
(defun cl-indent:function (indent-point state)
"Compute the indentation of the current line of Common Lisp code.
INDENT-POINT is the current point. STATE is the result of a
#'parse-partial-sexp from the start of the current function to the
start of the line this function was called.
The indentation is determined by the expressions point is in.
When this function is called, the column of point may be used as the
normal indentation. Therefore we call this position _normal
point_. Actually, if the first element of the current expression is a
list, it's at the start of this element. Otherwise it's at the start
of first expression on the same line as the last complete expression.
Within a quoted list or a non-form list, all subsequent lines are
indented to the column directly after the opening parenthesis. Quoted
lists are those that are prefixed with ?\`, ?\', or ?\#. Note that the
quote must be immediately in front of the opening parenthesis. I.e.,
if you want to use automatic code indentation in a macro expansion
formulated with a backquoted list, add a blank between the backquote
and the expansion form.
Within a list form, the indentation is determined by the indentation
method associated to the form symbol. (See #'cl-indent::method.)
** If the indentation method is nil, the form is assumed to be a
function call, arguments are aligned beneath each other if the first
argument was written behind the function symbol, otherwise they're
aligned below the function symbol.
** If the indentation method is a symbol, a function must be bound to
that symbol that will compute the current indentation. Such a function
is named an _indentation function_ and is called with 5 arguments:
(1) PATH is a list of numbers, the path from the top-level form to
the current structural element (the first element is number 0).
E.g., `foo' has a path of (0 3 1) in `((a b c (d foo) f) g)'.
(2) STATE is passed.
(3) INDENT-POINT is passed.
(4) SEXP-COLUMN is the column where the innermost form starts.
(5) NORMAL-INDENT is the column of normal point.
** If the indentation method is a list, this list specifies the form
structure and the indentation of each substructure. The possible list
structure and elements are described in #'cl-indent::form-method.
** If the indentation method is the number $n$, the first $n$
arguments are _distinguished arguments_; they are indented by 4
spaces. Further arguments are indented by lisp-body-indent. That's
roughly equivalent to '(4 4 ... &body)' with $n$ 4s.
** Furthermore values as described for #'lisp-indent-function may be
used for upward compatibility."
(let ((normal-indent (current-column)))
(let ((depth 0)
(path ())
calculated
(last-point indent-point)
(containing-form-start (elt state 1))
sexp-column)
(goto-char containing-form-start)
(setq sexp-column (current-column))
(while (and (not calculated)
(< depth cl-indent::maximum-backtracking))
(let ((containing-sexp (point)))
(forward-char 1)
(parse-partial-sexp (point) indent-point 1 t)
(let (tem function method)
(if (not (looking-at "\\sw\\|\\s_"))
(setq function nil method nil)
(setq tem (point))
(forward-sexp 1)
(setq function (downcase (buffer-substring tem (point))))
(goto-char tem)
(setq tem (intern-soft function)
method (get tem 'cl-indent:method))
(cond ((and (null method)
(string-match ":[^:]+" function))
(setq function (substring function
(1+ (match-beginning 0)))
method (get (intern-soft function)
'cl-indent:method)))
((and (null method))
(setq method (get tem 'lisp-indent-function)))))
(let ((n 0))
(if (< (point) indent-point)
(while (condition-case ()
(progn
(forward-sexp 1)
(if (>= (point) indent-point)
nil
(parse-partial-sexp (point)
indent-point 1 t)
(setq n (1+ n))
t))
(error nil))))
(setq path (cons n path)))
(cond ((null function))
((null method)
(if (null (cdr path))
(setq method (cond ((string-match "\\`def"
function)
'(4 (&whole 4 &rest 1) &body))
((string-match "\\`\\(with\\|do\\)-"
function)
'(4 &body))))))
((eq method 'defun)
(setq method '(4 (&whole 4 &rest 1) &body))))
(cond ((and (eql (char-after (1- containing-sexp)) ?\')
(not (eql (char-after (- containing-sexp 2)) ?\#)))
(setq calculated (1+ sexp-column)))
((eql (char-after (1- containing-sexp)) ?\#)
(setq calculated (1+ sexp-column)))
((null method))
((integerp method)
(setq calculated (cond ((cdr path)
normal-indent)
((<= (car path) method)
(list (+ sexp-column 4)
containing-form-start))
((= (car path) (1+ method))
(+ sexp-column lisp-body-indent))
(t
normal-indent))))
((symbolp method)
(setq calculated (funcall method
path state indent-point
sexp-column normal-indent)))
(t
(setq calculated (cl-indent::form-method
method path state indent-point
sexp-column normal-indent)))))
(goto-char containing-sexp)
(setq last-point containing-sexp)
(if (not calculated)
(condition-case ()
(progn (backward-up-list 1)
(setq depth (1+ depth)))
(error (setq depth cl-indent::maximum-backtracking))))))
calculated)))
(defun cl-indent::normal (state)
"Compute normal indentation according to STATE and current position."
(let ((normal-point (point))
(current-sexp (elt state 1)))
(if (and (= (1+ current-sexp) normal-point)
(looking-at "\\s("))
(let ((last-sexp (elt state 2)))
(goto-char last-sexp)
(beginning-of-line)
(parse-partial-sexp (point) last-sexp 0 t)
(backward-prefix-chars)
(if (> (point) current-sexp)
(current-column)
(goto-char normal-point)
(forward-sexp 1)
(parse-partial-sexp (point) last-sexp 0 t)
(current-column)))
(current-column))))
(defun cl-indent::bad-method (m)
(error "%s has a badly-formed indentation method: %s"
function m))
(defun cl-indent::form-method (method path state indent-point
sexp-column normal-indent)
"Compute the current indentation according to METHOD.
The other arguments are those of an indentation function, see
#'cl-indent:function for further explanation.
METHOD is a list that specifies the indentation of a form:
method-list-spec : '(' method-list ')'
method-list : method * method-finish ?
method : indent-spec
| method-sublist
<< the subform must be a list that's indented
as specified >>
indent-spec : Number | Symbol | 'nil'
<< indent this subform $Number spaces or compute its
indentation by the indentation function bound to
Symbol. 'nil' tells to use normal function
indentation. >>
method-finish : '&rest' method
<< indent the rest of this form as specified by
method. >>
| '&body'
<< equivalent to `(&rest ,lisp-body-indent).
I.e., Indent all following forms by
lisp-body-indent spaces. >>
method-sublist : '(' '&whole' indent-spec method-list ')'
<< This whole subform has a basic indentation, as
specified by indent-spec. The indentations from
method-list are added to this basic indentation. >>
FIXME (-js): Maybe only list structures up to a depth of
'cl-indent::maximum-backtracking are supported. Have to analyze the
code for this. If that's the case this variable should be a constant.
"
(catch 'exit
(let ((p path)
(containing-form-start (elt state 1))
n tem)
(while p
(if (not (consp method)) (cl-indent::bad-method method))
(setq n (1- (car p))
p (cdr p))
(while n
(setq tem (car method))
(cl-indent::check-method tem method)
(cond ((eq tem '&body)
(throw 'exit
(if (null p)
(+ sexp-column lisp-body-indent)
normal-indent)))
((eq tem '&rest)
(setf method (list (second method))
n 0))
((> n 0)
(setq n (1- n)
method (cdr method))
(if (< n 0)
(throw 'exit normal-indent)))
((eq tem 'nil)
(throw 'exit (list normal-indent containing-form-start)))
((integerp tem)
(throw 'exit
(if (null p)
(list (+ sexp-column tem) containing-form-start)
normal-indent)))
((symbolp tem)
(throw 'exit
(funcall tem path state indent-point
sexp-column normal-indent)))
(t
(if (not (null p))
(setq method (cdr (cdr tem))
n nil)
(setq tem (car (cdr tem)))
(throw 'exit
(cond ((eq tem 'nil)
(list normal-indent
containing-form-start))
((integerp tem)
(list (+ sexp-column tem)
containing-form-start))
(t
(funcall tem path state indent-point
sexp-column normal-indent))))))))))))
(defun cl-indent::check-method (tem method)
"Check validity of one indentation method element.
TEM is that indentation method and METHOD is the rest of the method list."
(if (eq tem 'nil)
t
(if (and (eq tem '&body)
(null (cdr method)))
t
(if (and (eq tem '&rest)
(consp (cdr method))
(null (cdr (cdr method))))
t
(if (integerp tem)
t
(if (and (consp tem)
(eq (car tem) '&whole)
(or (symbolp (car (cdr tem)))
(integerp (car (cdr tem)))))
t
(if (and (symbolp tem)
(null (cdr method)))
t
(cl-indent::bad-method method))))))))
(defun cl-indent:indent-tagbody (path state indent-point
sexp-column normal-indent)
(if (not (null (cdr path)))
normal-indent
(save-excursion
(goto-char indent-point)
(beginning-of-line)
(skip-chars-forward " \t")
(list (cond ((looking-at "\\sw\\|\\s_")
(+ sexp-column cl-indent:tag-indentation))
((integerp cl-indent:tag-body-indentation)
(+ sexp-column cl-indent:tag-body-indentation))
((eq cl-indent:tag-body-indentation 't)
(condition-case ()
(progn (backward-sexp 1) (current-column))
(error (1+ sexp-column))))
(t (+ sexp-column lisp-body-indent)))
(elt state 1)
))))
(defun cl-indent:indent-do (path state indent-point
sexp-column normal-indent)
(let ((cl-indent:tag-body-indentation lisp-body-indent))
(funcall #'cl-indent:indent-tagbody
path state indent-point sexp-column normal-indent)))
(defun cl-indent:indent-function-lambda-hack (path state indent-point
sexp-column normal-indent)
(if (or (cdr path)
(> (car path) 3))
normal-indent
(condition-case ()
(save-excursion
(backward-up-list 2)
(forward-char 1)
(if (looking-at "\\(lisp:+\\)?function\\(\\Sw\\|\\S_\\)")
(+ lisp-body-indent -1 (current-column))
(+ sexp-column lisp-body-indent)))
(error (+ sexp-column lisp-body-indent)))))
(defun cl-indent:indent-defmethod (path state indent-point
sexp-column normal-indent)
(let* ((combined (if (and (>= (car path) 3)
(null (cdr path)))
(save-excursion
(goto-char (second state))
(forward-char)
(forward-sexp)
(forward-sexp)
(forward-sexp)
(backward-sexp)
(if (looking-at ":")
t
nil))
nil))
(method (if combined
'(4 4 (&whole 4 &rest 1) &body)
'(4 (&whole 4 &rest 1) &body))))
(funcall #'cl-indent::form-method
method
path state indent-point sexp-column normal-indent)))
(defun cl-indent:indent-defgeneric (path state indent-point
sexp-column normal-indent)
(let ((method '(4 4 &rest 2)))
(when (= 2 (length path))
(ignore-errors
(save-excursion
(save-match-data
(let ((case-fold-search t))
(goto-char (second state))
(down-list)
(skip-chars-forward " \t\n")
(when (looking-at ":method\\W")
(forward-sexp)
(forward-sexp)
(backward-sexp)
(setq method (if (looking-at ":")
'(4 (&whole 4 &rest 1) &body)
'((&whole 4 &rest 1) &body))
path (cdr path)))
(when (looking-at ":method-combination\\W")
(setq method '(4 &rest 2)
path (cdr path))))))))
(funcall #'cl-indent::form-method
method
path state indent-point sexp-column normal-indent)))
(defun cl-indent::line-number ()
"Compatability implementation of emacs23's line-number-at-pos."
(cond
((fboundp 'line-number-at-pos)
(line-number-at-pos))
((fboundp 'line-number)
(line-number nil t))
((fboundp 'count-lines)
(count-lines (point-min) (point)))
(t
(error "Don't know how to count the number of lines from the start of the (narrowed) buffer to point."))))
(defun cl-indent:indent-cond (path state indent-point sexp-column normal-indent)
"Handle indentation of cond.
Cond is either (&rest (&whole 2 1 &rest 1)) or (&rest (&whole 6 1
&rest 1)) depending on whether the first caluse is or isn't on
the same line as the cond symbol.
So if we have:
(cond (a b)
|
we line up the clauses after the cond symbol (6 space of
indentation). wherease if we have:
(cond
(a b)
|)
we line up the clauses two space past the form's indentation."
(let (cond-line-number first-clause-line-number method here)
(save-excursion
(save-restriction
(narrow-to-region (save-excursion
(backward-up-list)
(point))
(point))
(setf here (point))
(backward-up-list)
(setf cond-line-number (cl-indent::line-number))
(down-list)
(forward-sexp 1)
(setf first-clause-line-number
(progn
(if (= 1 (first path))
(goto-char here)
(forward-sexp 1)
(backward-sexp 1))
(cl-indent::line-number)))))
(cl-indent::form-method
(if (= cond-line-number first-clause-line-number)
'(&rest (&whole 6 &rest 1))
'(&rest (&whole 2 &rest 1)))
path state indent-point sexp-column normal-indent)))
(defun cl-indent::method (function)
"Returns the indentation method associated to FUNCTION (a string).
The indentation method is looked for subsequently as follows:
(1) An indentation method is searched by #'cl-indent::get-method.
(2) If FUNCTION is from a specific package, the package prefix is
discarded and the indentation method from that FUNCTION name is
used.
(4) If FUNCTION starts with 'def', the indentation method \"defun\" is used.
(5) If FUNCTION starts with 'while-' or 'do-', the indentation method
1 (i.e., one distinguished argument) is used.
If the method determined that way is a string, it's replaced by the
current indentation method of the symbol named by that string."
(let ((method
(cond ((cl-indent::get-method function))
((string-match ":[^:]+" function)
(cl-indent::method (substring function
(1+ (match-beginning 0)))))
((string-match "\\`def" function) "defun")
((string-match "\\`\\(with\\|do\\)-" function) 1))))
(if (stringp method)
(cl-indent::method method)
method)))
(defvar cl-indent:local-methods nil
"*Alist of source-local indentation methods.
Is typically set in a `Local Variables' section.")
(make-variable-buffer-local 'cl-indent:local-methods)
(defvar cl-indent:mode-methods nil
"*Name of hash table with indentation methods for the current buffer.
Is typically set for a mode, during mode setup or in a mode hook.")
(make-variable-buffer-local 'cl-indent:mode-methods)
(defun cl-indent::get-method (function)
"Retrieves an indentation method that is stored for FUNCTION (a string).
(1) Indentation methods may be specified for the current source file,
as an alist that's bound to cl-indent:local-methods . The alist
car is the function symbol, the cdr is the indentation method.
(2) Mode-specific indentation methods are stored in a hash table. The
name of that hash table is bound to cl-indent:mode-methods .
(3) Global indentation methods are stored as the value of the
property 'cl-indent:method. If there is no such property, the
property 'lisp-indent-function is checked, too, for compatibility."
(let ((symbol (intern-soft function)))
(or (cdr (assq symbol cl-indent:local-methods))
(and cl-indent:mode-methods
(gethash symbol (symbol-value cl-indent:mode-methods)))
(get symbol 'cl-indent:method)
(get symbol 'lisp-indent-function))))
(defun cl-indent-parse-state-depth (parse-state)
(car parse-state))
(defun cl-indent-parse-state-start (parse-state)
(car (cdr parse-state)))
(defun cl-indent-parse-state-prev (parse-state)
(car (cdr (cdr parse-state))))
(defvar cl-indent-body-introducing-loop-macro-keyword
"do\\|finally\\|initially\\|doing\\|collect\\|collecting\\|append\\|appending"
"Regexp matching loop macro keywords which introduce body-forms")
(defvar cl-indent-prefix-loop-macro-keyword
"and\\|else"
"Regexp matching loop macro keywords which are prefixes")
(defvar cl-indent-clause-joining-loop-macro-keyword
"and"
"Regexp matching 'and', and anything else there ever comes to be
like it ...")
(defvar cl-indent-indented-loop-macro-keyword
"into\\|by\\|upto\\|downto\\|above\\|below\\|on\\|in\\|being\\|=\\|first\\|then\\|from\\|to"
"Regexp matching keywords introducing loop subclauses. Always indented two")
(defvar cl-indent-indenting-loop-macro-keyword
"when\\|unless\\|if"
"Regexp matching keywords introducing conditional clauses.
Cause subsequent clauses to be indented")
(defvar cl-indent-loop-macro-else-keyword "else")
(defun cl-indent::indent-loop-macro
(path parse-state indent-point sexp-column normal-indent)
(list (cl-indent-indent-loop-macro-1 parse-state indent-point)
(cl-indent-parse-state-start parse-state)))
(defun cl-indent-indent-loop-macro-1 (parse-state indent-point)
(catch 'return-indentation
(save-excursion
(goto-char (cl-indent-parse-state-start parse-state))
(let ((loop-start-column (current-column)))
(cl-indent-loop-advance-past-keyword-on-line)
(if (eolp)
(progn
(forward-line 1)
(end-of-line)
(if (<= indent-point (point))
(throw 'return-indentation (+ 2 loop-start-column)))
(back-to-indentation)))
(let* ((case-fold-search t)
(loop-macro-first-clause (point))
(previous-expression-start (cl-indent-parse-state-prev parse-state))
(default-value (current-column))
(loop-body-p nil)
(loop-body-indentation nil)
(indented-clause-indentation (+ 2 default-value)))
(goto-char previous-expression-start)
(if (looking-at cl-indent-body-introducing-loop-macro-keyword)
(let ((keyword-position (current-column)))
(setq loop-body-p t)
(setq loop-body-indentation
(if (cl-indent-loop-advance-past-keyword-on-line)
(current-column)
(back-to-indentation)
(if (/= (current-column) keyword-position)
(+ 2 (current-column))
(- keyword-position 3)))))
(back-to-indentation)
(if (< (point) loop-macro-first-clause)
(goto-char loop-macro-first-clause))
(let ((exit nil))
(while (and (null exit)
(looking-at cl-indent-prefix-loop-macro-keyword))
(if (null (cl-indent-loop-advance-past-keyword-on-line))
(progn (setq exit t)
(back-to-indentation)))))
(cond
((looking-at "(")
(setq loop-body-p t)
(setq loop-body-indentation (current-column)))
((looking-at cl-indent-body-introducing-loop-macro-keyword)
(setq loop-body-p t)
(cl-indent-loop-advance-past-keyword-on-line)
(setq loop-body-indentation (current-column)))
(t
(setq loop-body-p nil)
(if (or (looking-at cl-indent-indenting-loop-macro-keyword)
(looking-at cl-indent-prefix-loop-macro-keyword))
(setq default-value (+ 2 (current-column))))
(setq indented-clause-indentation (+ 2 (current-column)))
(goto-char previous-expression-start)
(setq loop-body-indentation (current-column)))))
(goto-char indent-point)
(back-to-indentation)
(cond
((looking-at "(")
loop-body-indentation)
((or (eolp) (looking-at ";"))
(if loop-body-p
loop-body-indentation
default-value))
((looking-at cl-indent-indented-loop-macro-keyword)
indented-clause-indentation)
((looking-at cl-indent-clause-joining-loop-macro-keyword)
(let ((stolen-indent-column nil))
(forward-line -1)
(while (and (null stolen-indent-column)
(> (point) loop-macro-first-clause))
(back-to-indentation)
(if (and (< (current-column) loop-body-indentation)
(looking-at "\\sw"))
(progn
(if (looking-at cl-indent-loop-macro-else-keyword)
(cl-indent-loop-advance-past-keyword-on-line))
(setq stolen-indent-column
(current-column)))
(forward-line -1)))
(if stolen-indent-column
stolen-indent-column
default-value)))
(t default-value)))))))
(defun cl-indent-loop-advance-past-keyword-on-line ()
(forward-word 1)
(block move-forward
(while (and (looking-at "\\s-") (not (eolp)))
(forward-char 1)
(when (looking-at "\\s<")
(while (and (not (looking-at "\\s>")) (not (eolp)))
(forward-char 1)))))
(if (eolp)
nil
(current-column)))
(defun define-cl-indent (spec &optional mode-methods)
"Define the cl-indent specification SPEC, maybe mode-specific.
The car of SPEC is the symbol for which the indentation shall be specified.
If the cdr is a symbol, then this symbol shall be indented like
the other symbol is indented _currently_ (i.e., eager evaluation is
used, not lazy evaluation).
Otherwise the cadr is taken as the indentation method. Check
#'cl-indent:function for documentation about indentation methods. Note
further that #'cl-indent::method interprets indentation methods that
are strings as aliases, i.e., the indentation method of the string is
looked up and returned (lazy evaluation).
The optional argument MODE-METHODS may be bound to a hash table
where this (presumedly mode-specific) indentation method shall be
stored."
(let* ((symbol (car spec))
(indent (cdr spec))
(method (if (symbolp indent)
(let ((cl-indent:mode-methods (and mode-methods
'mode-methods)))
(cl-indent::method (symbol-name indent)))
(car indent))))
(if mode-methods
(puthash symbol method mode-methods)
(put symbol 'cl-indent:method method))))
(mapcar #'define-cl-indent
'((block 1)
(case (4 &rest (&whole 2 &rest 3)))
(ccase . case) (ecase . case)
(typecase . case) (etypecase . case) (ctypecase . case)
(handler-bind . let)
(handler-case (4 &rest (&whole 2 4 &rest 2)))
(catch 1)
(cond cl-indent:indent-cond)
(defvar (4 2 2))
(defconstant . defvar) (defparameter . defvar)
(defclass (6 6 (&whole 2 &rest 1) &rest 2))
(define-modify-macro
(4 &body))
(defsetf (4 (&whole 4 &rest 1) 4 &body))
(defun (4 (&whole 4 &rest 1) &body))
(defmacro . defun) (define-setf-method . defun) (deftype . defun)
(defgeneric cl-indent:indent-defgeneric)
(defmethod cl-indent:indent-defmethod)
(defstruct ((&whole 4 &rest (&whole 2 &rest 1))
&rest (&whole 2 &rest 1)))
(destructuring-bind
((&whole 6 &rest 1) 4 &body))
(do ((&whole 4 &rest (&whole 1 &rest 2))
(&whole 4 &rest 3)
&rest cl-indent:indent-do))
(do* . do)
(do-all-symbols (4 &body))
(do-symbols (4 &body))
(do-external-symbols (4 &body))
(dolist ((&whole 4 2 1) &body))
(dotimes . dolist)
(eval-when 1)
(flet ((&whole 4 &rest (&whole 1 (&whole 4 &rest 1) &body))
&body))
(labels . flet) (macrolet . flet)
(if (&rest 4))
(lambda ((&whole 4 &rest 1)
&rest cl-indent:indent-function-lambda-hack))
(let ((&whole 4 &rest (&whole 1 1 2)) &body))
(let* . let) (compiler-let . let)
(locally 1)
(loop cl-indent::indent-loop-macro)
(multiple-value-bind
((&whole 6 &rest 1) 4 &body))
(multiple-value-call
(4 &body))
(multiple-value-list 1)
(multiple-value-prog1 1)
(multiple-value-setq
(4 2))
(print-unreadable-object 1)
(prog ((&whole 4 &rest 1) &rest cl-indent:indent-tagbody))
(prog* . prog)
(prog1 1)
(prog2 2)
(progn 0)
(progv (4 4 &body))
(restart-case . handler-case)
(return 0)
(return-from (nil &body))
(tagbody cl-indent:indent-tagbody)
(throw 1)
(unless 1)
(unwind-protect
(5 &body))
(values 0)
(when 1)
(with-accessors (6 4 &body))
(with-compilation-unit (4 &body))
(with-hash-table-iterator (4 &body))
(with-output-to-string (4 &body))
(with-input-from-string . with-output-to-string)
(with-open-file (4 &body))
(with-open-stream . with-open-file)
(with-package-iterator (4 &body))
(with-simple-restart (4 &body))
(with-slots (6 4 &body))))
(provide 'slime-indentation)