emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] /srv/bzr/emacs/emacs-24 r111111: * emacs-lisp/byte-run.el


From: Andreas Schwab
Subject: [Emacs-diffs] /srv/bzr/emacs/emacs-24 r111111: * emacs-lisp/byte-run.el (defmacro): Use same argument parsing as
Date: Mon, 31 Dec 2012 22:53:33 +0100
User-agent: Bazaar (2.5.0)

------------------------------------------------------------
revno: 111111
committer: Andreas Schwab <address@hidden>
branch nick: emacs
timestamp: Mon 2012-12-31 22:53:33 +0100
message:
  * 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.
modified:
  lisp/ChangeLog
  lisp/emacs-lisp/byte-run.el
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2012-12-31 21:28:33 +0000
+++ b/lisp/ChangeLog    2012-12-31 21:53:33 +0000
@@ -1,3 +1,9 @@
+2012-12-31  Andreas Schwab  <address@hidden>
+
+       * 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  <address@hidden>
 
        * eshell/em-cmpl.el (eshell-pcomplete):

=== modified file 'lisp/emacs-lisp/byte-run.el'
--- a/lisp/emacs-lisp/byte-run.el       2012-12-31 19:15:32 +0000
+++ b/lisp/emacs-lisp/byte-run.el       2012-12-31 21:53:33 +0000
@@ -117,7 +117,7 @@
 (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 @@
 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 @@
   (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))))


reply via email to

[Prev in Thread] Current Thread [Next in Thread]