]> code.delx.au - gnu-emacs/blobdiff - lisp/emacs-lisp/backquote.el
Port report-emacs-bug to deterministic builds
[gnu-emacs] / lisp / emacs-lisp / backquote.el
index 6e0361196de8e169608fe0f6a700f3584fae58a6..12bd8dae08cdd5999b09770c59ab200c0ca2a687 100644 (file)
@@ -1,10 +1,10 @@
 ;;; backquote.el --- implement the ` Lisp construct
 
-;; Copyright (C) 1990, 1992, 1994, 2001-2014 Free Software Foundation,
+;; Copyright (C) 1990, 1992, 1994, 2001-2015 Free Software Foundation,
 ;; Inc.
 
 ;; Author: Rick Sladkey <jrs@world.std.com>
-;; Maintainer: FSF
+;; Maintainer: emacs-devel@gnu.org
 ;; Keywords: extensions, internal
 ;; Package: emacs
 
@@ -43,7 +43,7 @@
 (defun backquote-list*-function (first &rest list)
   "Like `list' but the last argument is the tail of the new list.
 
-For example (backquote-list* 'a 'b 'c) => (a b . c)"
+For example (backquote-list* \\='a \\='b \\='c) => (a b . c)"
   ;; The recursive solution is much nicer:
   ;; (if list (cons first (apply 'backquote-list*-function list)) first))
   ;; but Emacs is not very good at efficiently processing recursion.
@@ -60,7 +60,7 @@ For example (backquote-list* 'a 'b 'c) => (a b . c)"
 (defmacro backquote-list*-macro (first &rest list)
   "Like `list' but the last argument is the tail of the new list.
 
-For example (backquote-list* 'a 'b 'c) => (a b . c)"
+For example (backquote-list* \\='a \\='b \\='c) => (a b . c)"
   ;; The recursive solution is much nicer:
   ;; (if list (list 'cons first (cons 'backquote-list*-macro list)) first))
   ;; but Emacs is not very good at efficiently processing such things.
@@ -99,9 +99,9 @@ places where expressions are evaluated and inserted or spliced in.
 For example:
 
 b              => (ba bb bc)           ; assume b has this value
-`(a b c)       => (a b c)              ; backquote acts like quote
-`(a ,b c)      => (a (ba bb bc) c)     ; insert the value of b
-`(a ,@b c)     => (a ba bb bc c)       ; splice in the value of b
+\\=`(a b c)       => (a b c)           ; backquote acts like quote
+\\=`(a ,b c)      => (a (ba bb bc) c)  ; insert the value of b
+\\=`(a ,@b c)     => (a ba bb bc c)    ; splice in the value of b
 
 Vectors work just like lists.  Nested backquotes are permitted."
   (cdr (backquote-process structure)))
@@ -120,9 +120,7 @@ Vectors work just like lists.  Nested backquotes are permitted."
 This simply recurses through the body."
   (let ((exp (backquote-listify (list (cons 0 (list 'quote (car s))))
                                 (backquote-process (cdr s) level))))
-    (if (eq (car-safe exp) 'quote)
-        (cons 0 (list 'quote s))
-      (cons 1 exp))))
+    (cons (if (eq (car-safe exp) 'quote) 0 1) exp)))
 
 (defun backquote-process (s &optional level)
   "Process the body of a backquote.
@@ -148,16 +146,19 @@ LEVEL is only used internally and indicates the nesting level:
                 (t
                  (list 'apply '(function vector) (cdr n))))))))
    ((atom s)
+    ;; FIXME: Use macroexp-quote!
     (cons 0 (if (or (null s) (eq s t) (not (symbolp s)))
                s
              (list 'quote s))))
    ((eq (car s) backquote-unquote-symbol)
     (if (<= level 0)
-        (if (> (length s) 2)
-            ;; We could support it with: (cons 2 `(list . ,(cdr s)))
-            ;; But let's not encourage such uses.
-            (error "Multiple args to , are not supported: %S" s)
-          (cons 1 (nth 1 s)))
+        (cond
+         ((> (length s) 2)
+          ;; We could support it with: (cons 2 `(list . ,(cdr s)))
+          ;; But let's not encourage such uses.
+          (error "Multiple args to , are not supported: %S" s))
+         (t (cons (if (eq (car-safe (nth 1 s)) 'quote) 0 1)
+                  (nth 1 s))))
       (backquote-delay-process s (1- level))))
    ((eq (car s) backquote-splice-symbol)
     (if (<= level 0)
@@ -215,9 +216,7 @@ LEVEL is only used internally and indicates the nesting level:
       ;; Tack on any initial elements.
       (if firstlist
          (setq expression (backquote-listify firstlist (cons 1 expression))))
-      (if (eq (car-safe expression) 'quote)
-         (cons 0 (list 'quote s))
-       (cons 1 expression))))))
+      (cons (if (eq (car-safe expression) 'quote) 0 1) expression)))))
 
 ;; backquote-listify takes (tag . structure) pairs from backquote-process
 ;; and decides between append, list, backquote-list*, and cons depending