Function: byte-optimize-minus

byte-optimize-minus is a byte-compiled function defined in byte-opt.el.gz.

Signature

(byte-optimize-minus FORM)

Source Code

;; Defined in /usr/src/emacs/lisp/emacs-lisp/byte-opt.el.gz
(defun byte-optimize-minus (form)
  (let ((args (cdr form)))
    (if (and (cdr args)
             (null (cdr (setq args (byte-opt--arith-reduce
                                    #'- (car args) (cdr args)))))
             (numberp (car args)))
        ;; The entire argument list reduced to a constant; return it.
        (car args)
      ;; Remove non-leading zeros, except for (- x 0).
      (when (memq 0 (cdr args))
        (setq args (cons (car args) (or (remq 0 (cdr args)) (list 0)))))
      (cond
       ;; (- x 1) --> (1- x)
       ((equal (cdr args) '(1))
        (list '1- (car args)))
       ;; (- x -1) --> (1+ x)
       ((equal (cdr args) '(-1))
        (list '1+ (car args)))
       ;; (- n) -> -n, where n and -n are constant numbers.
       ;; This must be done separately since byte-opt--arith-reduce
       ;; is not applied to (- n).
       ((and (null (cdr args))
             (numberp (car args)))
        (- (car args)))
       ;; (- x y z) -> (- (- x y) z)
       ((= (length args) 3)
        `(- ,(byte-optimize-minus `(- ,(car args) ,(cadr args))) ,@(cddr args)))
       ;; not further optimized
       ((equal args (cdr form)) form)
       (t (cons '- args))))))