(defun macro-declaration-function (macro decl)
"Process a declaration found in a macro definition.
This is set as the value of the variable `macro-declaration-function'.
MACRO is the name of the macro being defined.
DECL is a list `(declare ...)' containing the declarations.
The return value of this function is not used."
(let (d)
(while (setq decl (cdr decl))
(setq d (car decl))
(cond ((and (consp d) (eq (car d) 'indent))
(put macro 'lisp-indent-function (car (cdr d))))
((and (consp d) (eq (car d) 'debug))
(put macro 'edebug-form-spec (car (cdr d))))
((and (consp d) (eq (car d) 'doc-string))
(put macro 'doc-string-elt (car (cdr d))))
(t
(message "Unknown declaration %s" d))))))
(setq macro-declaration-function 'macro-declaration-function)
(fset 'inline 'progn)
(put 'inline 'lisp-indent-function 0)
(defmacro defsubst (name arglist &rest body)
"Define an inline function. The syntax is just like that of `defun'."
(declare (debug defun))
(or (memq (get name 'byte-optimizer)
'(nil byte-compile-inline-expand))
(error "`%s' is a primitive" name))
`(prog1
(defun ,name ,arglist ,@body)
(eval-and-compile
(put ',name 'byte-optimizer 'byte-compile-inline-expand))))
(defun make-obsolete (obsolete-name current-name &optional when)
"Make the byte-compiler warn that OBSOLETE-NAME is obsolete.
The warning will say that CURRENT-NAME should be used instead.
If CURRENT-NAME is a string, that is the `use instead' message.
If provided, WHEN should be a string indicating when the function
was first made obsolete, for example a date or a release number."
(interactive "aMake function obsolete: \nxObsoletion replacement: ")
(let ((handler (get obsolete-name 'byte-compile)))
(if (eq 'byte-compile-obsolete handler)
(setq handler (nth 1 (get obsolete-name 'byte-obsolete-info)))
(put obsolete-name 'byte-compile 'byte-compile-obsolete))
(put obsolete-name 'byte-obsolete-info (list current-name handler when)))
obsolete-name)
(defmacro define-obsolete-function-alias (obsolete-name current-name
&optional when docstring)
"Set OBSOLETE-NAME's function definition to CURRENT-NAME and mark it obsolete.
\(define-obsolete-function-alias 'old-fun 'new-fun \"22.1\" \"old-fun's doc.\")
is equivalent to the following two lines of code:
\(defalias 'old-fun 'new-fun \"old-fun's doc.\")
\(make-obsolete 'old-fun 'new-fun \"22.1\")
See the docstrings of `defalias' and `make-obsolete' for more details."
(declare (doc-string 4))
`(progn
(defalias ,obsolete-name ,current-name ,docstring)
(make-obsolete ,obsolete-name ,current-name ,when)))
(defun make-obsolete-variable (obsolete-name current-name &optional when)
"Make the byte-compiler warn that OBSOLETE-NAME is obsolete.
The warning will say that CURRENT-NAME should be used instead.
If CURRENT-NAME is a string, that is the `use instead' message.
If provided, WHEN should be a string indicating when the variable
was first made obsolete, for example a date or a release number."
(interactive
(list
(let ((str (completing-read "Make variable obsolete: " obarray 'boundp t)))
(if (equal str "") (error ""))
(intern str))
(car (read-from-string (read-string "Obsoletion replacement: ")))))
(put obsolete-name 'byte-obsolete-variable (cons current-name when))
obsolete-name)
(defmacro define-obsolete-variable-alias (obsolete-name current-name
&optional when docstring)
"Make OBSOLETE-NAME a variable alias for CURRENT-NAME and mark it obsolete.
\(define-obsolete-variable-alias 'old-var 'new-var \"22.1\" \"old-var's doc.\")
is equivalent to the following two lines of code:
\(defvaralias 'old-var 'new-var \"old-var's doc.\")
\(make-obsolete-variable 'old-var 'new-var \"22.1\")
See the docstrings of `defvaralias' and `make-obsolete-variable' or
Info node `(elisp)Variable Aliases' for more details."
(declare (doc-string 4))
`(progn
(defvaralias ,obsolete-name ,current-name ,docstring)
(make-obsolete-variable ,obsolete-name ,current-name ,when)))
(defmacro dont-compile (&rest body)
"Like `progn', but the body always runs interpreted (not compiled).
If you think you need this, you're probably making a mistake somewhere."
(declare (debug t) (indent 0))
(list 'eval (list 'quote (if (cdr body) (cons 'progn body) (car body)))))
(defmacro eval-when-compile (&rest body)
"Like `progn', but evaluates the body at compile time if you're compiling.
Thus, the result of the body appears to the compiler as a quoted constant.
In interpreted code, this is entirely equivalent to `progn'."
(declare (debug t) (indent 0))
(cons 'progn body))
(defmacro eval-and-compile (&rest body)
"Like `progn', but evaluates the body at compile time and at load time."
(declare (debug t) (indent 0))
(cons 'progn body))
(put 'with-no-warnings 'lisp-indent-function 0)
(defun with-no-warnings (&rest body)
"Like `progn', but prevents compiler warnings in the body."
(car (last body)))