Function: calc-convert-units

calc-convert-units is an autoloaded, interactive and byte-compiled function defined in calc-units.el.gz.

Signature

(calc-convert-units &optional OLD-UNITS NEW-UNITS)

Key Bindings

Source Code

;; Defined in /usr/src/emacs/lisp/calc/calc-units.el.gz
(defun calc-convert-units (&optional old-units new-units)
  (interactive)
  (calc-slow-wrapper
   (let ((expr (calc-top-n 1))
	 (uoldname nil)
         (unitscancel nil)
         (nouold nil)
         units
         defunits)
     (if (or (not (math-units-in-expr-p expr t))
             (setq unitscancel (and
                                (if (get 'calc-allow-units-as-numbers 'saved-value)
                                    (car (get 'calc-allow-units-as-numbers 'saved-value))
                                  calc-allow-units-as-numbers)
                                (eq (math-get-standard-units expr) 1))))
       (let ((uold (or old-units
		       (progn
			 (setq uoldname
                               (if unitscancel
                                   (read-string
                                    "(The expression is unitless when simplified) Old Units: ")
                                 (read-string "Old units: ")))
			 (if (equal uoldname "")
			     (progn
                               (setq nouold unitscancel)
			       (setq uoldname "1")
			       1)
			   (if (string-match "\\` */" uoldname)
			       (setq uoldname (concat "1" uoldname)))
			   (math-read-expr uoldname))))))
         (unless (math-units-in-expr-p uold t)
           (error "No units specified"))
	 (when (eq (car-safe uold) 'error)
	   (error "Bad format in units expression: %s" (nth 1 uold)))
	 (setq expr (math-mul expr uold))))
     (setq defunits (math-get-default-units expr))
     (unless new-units
       (setq new-units
             (read-string (format-prompt
                           (if (and uoldname (not nouold))
                               (concat "Old units: "
                                       uoldname
                                       ", new units")
                             "New units")
                           defunits)))
       (if (and
            (string= new-units "")
            defunits)
           (setq new-units defunits)))
     (when (string-match "\\` */" new-units)
       (setq new-units (concat "1" new-units)))
     (setq units (math-read-expr new-units))
     (when (eq (car-safe units) 'error)
       (error "Bad format in units expression: %s" (nth 2 units)))
     (if calc-ensure-consistent-units
         (math-check-unit-consistency expr units))
     (let ((unew (math-units-in-expr-p units t))
           (std (and (eq (car-safe units) 'var)
                     (assq (nth 1 units) math-standard-units-systems)))
           (comp (eq (car-safe units) '+)))
       (unless (or unew std)
         (error "No units specified"))
       (let* ((noold (and uoldname (not (equal uoldname "1"))))
              (res
               (if std
                   (math-simplify-units (math-to-standard-units expr (nth 1 std)))
                 (math-convert-units expr units noold))))
         (unless std
           (math-put-default-units (if noold units res) (if comp units)))
         (calc-enter-result 1 "cvun" res))))))