summaryrefslogtreecommitdiff
path: root/lisp/calc/calc-units.el
diff options
context:
space:
mode:
authorJay Belanger <jay.p.belanger@gmail.com>2013-01-30 08:14:27 -0600
committerJay Belanger <jay.p.belanger@gmail.com>2013-01-30 08:14:27 -0600
commit7c3fb76fc9b1ef672911c3385590fe620cae67e9 (patch)
treecc737a34e248a43b47ff797853dce12075904224 /lisp/calc/calc-units.el
parentf0a9dee778a08283d067642278144fe01ee62d45 (diff)
downloademacs-7c3fb76fc9b1ef672911c3385590fe620cae67e9.tar.gz
calc-units.el (math-default-units-table): Remove initial value.
(calc-convert-units): Treat expressions where all the units cancel as if they didn't have units.
Diffstat (limited to 'lisp/calc/calc-units.el')
-rw-r--r--lisp/calc/calc-units.el90
1 files changed, 46 insertions, 44 deletions
diff --git a/lisp/calc/calc-units.el b/lisp/calc/calc-units.el
index a3d037ee042..72d51d9241c 100644
--- a/lisp/calc/calc-units.el
+++ b/lisp/calc/calc-units.el
@@ -404,7 +404,7 @@ If EXPR is nil, return nil."
(math-composition-to-string cexpr))))))
(defvar math-default-units-table
- #s(hash-table test equal data (1 (1)))
+ (make-hash-table :test 'equal)
"A table storing previously converted units.")
(defun math-get-default-units (expr)
@@ -442,13 +442,19 @@ If COMP or STD is non-nil, put that in the units table instead."
(calc-slow-wrapper
(let ((expr (calc-top-n 1))
(uoldname nil)
+ (unitscancel nil)
unew
units
defunits)
- (unless (math-units-in-expr-p expr t)
+ (if (or (not (math-units-in-expr-p expr t))
+ (setq unitscancel (eq (math-get-standard-units expr) 1)))
(let ((uold (or old-units
(progn
- (setq uoldname (read-string "Old units: "))
+ (setq uoldname
+ (if unitscancel
+ (read-string
+ "(The expression is unitless when simplified) Old Units: ")
+ (read-string "Old units: ")))
(if (equal uoldname "")
(progn
(setq uoldname "1")
@@ -460,47 +466,43 @@ If COMP or STD is non-nil, put that in the units table instead."
(error "Bad format in units expression: %s" (nth 1 uold)))
(setq expr (math-mul expr uold))))
(setq defunits (math-get-default-units expr))
- (if (equal defunits "1")
- (progn
- (calc-enter-result 1 "cvun" (math-simplify-units expr))
- (message "All units in expression cancel"))
- (unless new-units
- (setq new-units
- (read-string (concat
- (if uoldname
- (concat "Old units: "
- uoldname
- ", new units")
- "New units")
- (if defunits
- (concat
- " (default "
- 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 ((res
- (if std
- (math-simplify-units (math-to-standard-units expr (nth 1 std)))
- (math-convert-units expr units (and uoldname (not (equal uoldname "1")))))))
- (math-put-default-units res (if comp units))
- (calc-enter-result 1 "cvun" res)))))))
+ (unless new-units
+ (setq new-units
+ (read-string (concat
+ (if uoldname
+ (concat "Old units: "
+ uoldname
+ ", new units")
+ "New units")
+ (if defunits
+ (concat
+ " (default "
+ 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 ((res
+ (if std
+ (math-simplify-units (math-to-standard-units expr (nth 1 std)))
+ (math-convert-units expr units (and uoldname (not (equal uoldname "1")))))))
+ (math-put-default-units res (if comp units))
+ (calc-enter-result 1 "cvun" res))))))
(defun calc-autorange-units (arg)
(interactive "P")