* emacs-lisp/byte-run.el (defmacro): Use same argument parsing as
defun. Don't check for DECL if DOCSTRING isn't a string. (defun): Likewise.
This commit is contained in:
parent
5ee1772e2c
commit
5cebef2d18
2 changed files with 41 additions and 28 deletions
|
@ -1,3 +1,9 @@
|
|||
2012-12-31 Andreas Schwab <schwab@linux-m68k.org>
|
||||
|
||||
* emacs-lisp/byte-run.el (defmacro): Use same argument parsing as
|
||||
defun. Don't check for DECL if DOCSTRING isn't a string.
|
||||
(defun): Likewise.
|
||||
|
||||
2012-12-31 Glenn Morris <rgm@gnu.org>
|
||||
|
||||
* eshell/em-cmpl.el (eshell-pcomplete):
|
||||
|
|
|
@ -117,7 +117,7 @@ and the VALUES and should return the code to use to set this property.")
|
|||
(defalias 'defmacro
|
||||
(cons
|
||||
'macro
|
||||
#'(lambda (name arglist &optional docstring decl &rest body)
|
||||
#'(lambda (name arglist &optional docstring &rest body)
|
||||
"Define NAME as a macro.
|
||||
When the macro is called, as in (NAME ARGS...),
|
||||
the function (lambda ARGLIST BODY...) is applied to
|
||||
|
@ -126,32 +126,38 @@ and the result should be a form to be evaluated instead of the original.
|
|||
DECL is a declaration, optional, of the form (declare DECLS...) where
|
||||
DECLS is a list of elements of the form (PROP . VALUES). These are
|
||||
interpreted according to `macro-declarations-alist'.
|
||||
The return value is undefined."
|
||||
(if (stringp docstring) nil
|
||||
(setq body (cons decl body))
|
||||
(setq decl docstring)
|
||||
(setq docstring nil))
|
||||
(if (or (null decl) (eq 'declare (car-safe decl))) nil
|
||||
(setq body (cons decl body))
|
||||
(setq decl nil))
|
||||
(if (null body) (setq body '(nil)))
|
||||
(if docstring (setq body (cons docstring body)))
|
||||
;; Can't use backquote because it's not defined yet!
|
||||
(let* ((fun (list 'function (cons 'lambda (cons arglist body))))
|
||||
(def (list 'defalias
|
||||
(list 'quote name)
|
||||
(list 'cons ''macro fun)))
|
||||
(declarations
|
||||
(mapcar
|
||||
#'(lambda (x)
|
||||
(let ((f (cdr (assq (car x) macro-declarations-alist))))
|
||||
(if f (apply (car f) name arglist (cdr x))
|
||||
(message "Warning: Unknown macro property %S in %S"
|
||||
(car x) name))))
|
||||
(cdr decl))))
|
||||
(if declarations
|
||||
(cons 'prog1 (cons def declarations))
|
||||
def)))))
|
||||
The return value is undefined.
|
||||
|
||||
\(fn NAME ARGLIST &optional DOCSTRING DECL &rest BODY)"
|
||||
;; We can't just have `decl' as an &optional argument, because we need
|
||||
;; to distinguish
|
||||
;; (defmacro foo (arg) (bar) nil)
|
||||
;; from
|
||||
;; (defmacro foo (arg) (bar)).
|
||||
(let ((decls (cond
|
||||
((eq (car-safe docstring) 'declare)
|
||||
(prog1 (cdr docstring) (setq docstring nil)))
|
||||
((and (stringp docstring)
|
||||
(eq (car-safe (car body)) 'declare))
|
||||
(prog1 (cdr (car body)) (setq body (cdr body)))))))
|
||||
(if docstring (setq body (cons docstring body))
|
||||
(if (null body) (setq body '(nil))))
|
||||
;; Can't use backquote because it's not defined yet!
|
||||
(let* ((fun (list 'function (cons 'lambda (cons arglist body))))
|
||||
(def (list 'defalias
|
||||
(list 'quote name)
|
||||
(list 'cons ''macro fun)))
|
||||
(declarations
|
||||
(mapcar
|
||||
#'(lambda (x)
|
||||
(let ((f (cdr (assq (car x) macro-declarations-alist))))
|
||||
(if f (apply (car f) name arglist (cdr x))
|
||||
(message "Warning: Unknown macro property %S in %S"
|
||||
(car x) name))))
|
||||
decls)))
|
||||
(if declarations
|
||||
(cons 'prog1 (cons def declarations))
|
||||
def))))))
|
||||
|
||||
;; Now that we defined defmacro we can use it!
|
||||
(defmacro defun (name arglist &optional docstring &rest body)
|
||||
|
@ -173,7 +179,8 @@ The return value is undefined.
|
|||
(let ((decls (cond
|
||||
((eq (car-safe docstring) 'declare)
|
||||
(prog1 (cdr docstring) (setq docstring nil)))
|
||||
((eq (car-safe (car body)) 'declare)
|
||||
((and (stringp docstring)
|
||||
(eq (car-safe (car body)) 'declare))
|
||||
(prog1 (cdr (car body)) (setq body (cdr body)))))))
|
||||
(if docstring (setq body (cons docstring body))
|
||||
(if (null body) (setq body '(nil))))
|
||||
|
|
Loading…
Add table
Reference in a new issue