Function: byte-opt--nary-comparison

byte-opt--nary-comparison is a byte-compiled function defined in byte-opt.el.gz.

Signature

(byte-opt--nary-comparison FORM)

Documentation

Optimize n-ary comparisons such as =, < etc.

Source Code

;; Defined in /usr/src/emacs/lisp/emacs-lisp/byte-opt.el.gz
(defun byte-opt--nary-comparison (form)
  "Optimize n-ary comparisons such as `=', `<' etc."
  (let ((nargs (length (cdr form))))
    (cond
     ((= nargs 1)
      `(progn ,(cadr form) t))
     ((>= nargs 3)
      ;; At least 3 arguments: transform to N-1 binary comparisons,
      ;; since those have their own byte-ops which are particularly
      ;; fast for fixnums.
      (let* ((op (car form))
             (bindings nil)
             (rev-args nil))
        (if (memq nil (mapcar #'macroexp-copyable-p (cddr form)))
            ;; At least one arg beyond the first is non-constant non-variable:
            ;; create temporaries for all args to guard against side-effects.
            ;; The optimizer will eliminate trivial bindings later.
            (let ((i 1))
              (dolist (arg (cdr form))
                (let ((var (make-symbol (format "arg%d" i))))
                  (push var rev-args)
                  (push (list var arg) bindings)
                  (setq i (1+ i)))))
          ;; All args beyond the first are copyable: no temporary variables
          ;; required.
          (setq rev-args (reverse (cdr form))))
        (let ((prev (car rev-args))
              (exprs nil))
          (dolist (arg (cdr rev-args))
            (push (list op arg prev) exprs)
            (setq prev arg))
          (let ((and-expr (cons 'and exprs)))
            (if bindings
                (list 'let (nreverse bindings) and-expr)
              and-expr)))))
     (t form))))