Hi, Derek,
Very useful, thanks! Yours, Christian Derek Feichtinger writes: > Hi, > > On Mon, Oct 12 2020, Eric S Fraga <e.fr...@ucl.ac.uk> wrote: > >> On Monday, 12 Oct 2020 at 10:22, Christian Moe wrote: >>> I think I was thinking about adding mode flags for unit computations, >>> like in the imagined example above (`$3=$2+$1;u'), similar to what has >>> been done for duration computations. >> >> This would be very useful, actually. I use embedded calc all the time >> with units; being able to use some of the same expressions in a table >> would be highly welcome. > > The functions that one can use in calc formulas can be extended using > the 'defmath' lisp command. I paste here from my notes (not about > monetary units, but easily adapted): > > +++++++++++++++++++++++++++++++ > Defining a new calc function for unit conversion with defmath > #+BEGIN_SRC emacs-lisp > (defmath uconv (expr target-units &optional pure) > (math-convert-units expr target-units pure)) > #+END_SRC > > #+RESULTS: > : calcFunc-uconv > > | km | ft | > |--------+--------------| > | 2.5 km | 8202.0997 ft | > #+TBLFM: $2=uconv($1, ft) > > Using the units from the table header (if the 3rd arg is given to > uconv, the output is stripped of the unit): > > | km | ft | > |-----+-----------| > | 2.5 | 8202.0997 | > #+TBLFM: $2 = uconv($1 * @<$1, @<$2, t) > > The standard calc function usimplify also works for this use > case: > > | km | ft | > |-----+-----------| > | 2.5 | 8202.0997 | > #+TBLFM: $2 = usimplify($1 * @<$1 / @<$2) > > A lisp equivalent of the above > #+begin_src elisp > (calc-eval "usimplify(2.5 km / ft)") > #+end_src > > #+RESULTS: > : 8202.09973753 > > Let's define a function that converts to base units > #+begin_src elisp > (defmath ustd (expr) (math-simplify-units (math-to-standard-units expr > nil))) > #+end_src > > #+RESULTS: > : calcFunc-ustd > > | distance | time | speed | std unit speed | speed in ft/s | > |----------+--------+-------------+------------------+------------------| > | 3 km | 2.5 hr | 1.2 km / hr | 0.33333333 m / s | 1.0936133 ft / s | > #+TBLFM: @2$3=$1/$2::@2$4=ustd($3)::@2$5=uconv($-1, ft/s) > ++++++++++++++++++++++++++++++++++++