From 7c3fb76fc9b1ef672911c3385590fe620cae67e9 Mon Sep 17 00:00:00 2001 From: Jay Belanger Date: Wed, 30 Jan 2013 08:14:27 -0600 Subject: [PATCH] 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. --- lisp/ChangeLog | 6 +++ lisp/calc/calc-units.el | 90 +++++++++++++++++++++-------------------- 2 files changed, 52 insertions(+), 44 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 348df715c70..997b0067d74 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2013-01-30 Jay Belanger + + * 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. + 2013-01-30 Michael Albinus * net/tramp.el (tramp-process-connection-type): Fix docstring. 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") -- 2.39.2