doc/org-manual.org: Extend table formulas Lisp form documentation

* doc/org-manual.org (Emacs Lisp forms as formulas): Be more
explicit about how fields are interpolated into the Lisp forms,
clarify the use of mode flags, and add a couple more examples.
This commit is contained in:
Daniele Nicolodi 2020-11-14 18:33:41 +01:00 committed by Kyle Meyer
parent 9a154910ed
commit b2d38a822d
1 changed files with 40 additions and 24 deletions

View File

@ -2178,38 +2178,54 @@ It is also possible to write a formula in Emacs Lisp. This can be
useful for string manipulation and control structures, if Calc's
functionality is not enough.
If a formula starts with a single-quote followed by an opening
parenthesis, then it is evaluated as a Lisp form. The evaluation
should return either a string or a number. Just as with Calc
formulas, you can specify modes and a ~printf~ format after
a semicolon.
A formula is evaluated as a Lisp form when it starts with a
single-quote followed by an opening parenthesis. Cell table
references are interpolated into the Lisp form before execution. The
evaluation should return either a string or a number. Evaluation
modes and a ~printf~ format used to render the returned values can be
specified after a semicolon.
With Emacs Lisp forms, you need to be conscious about the way field
references are interpolated into the form. By default, a reference is
interpolated as a Lisp string (in double-quotes) containing the field.
If you provide the =N= mode switch, all referenced elements are
numbers---non-number fields will be zero---and interpolated as Lisp
numbers, without quotes. If you provide the =L= flag, all fields are
interpolated literally, without quotes. For example, if you want a
reference to be interpreted as a string by the Lisp form, enclose the
reference operator itself in double-quotes, like ="$3"=. Ranges are
inserted as space-separated fields, so you can embed them in list or
vector syntax.
By default, references are interpolated as literal Lisp strings: the
field content is replaced in the Lisp form stripped of leading and
trailing white space and surrounded in double-quotes. For example:
Here are a few examples---note how the =N= mode is used when we do
computations in Lisp:
: '(concat $1 $2)
- ='(concat (substring $1 1 2) (substring $1 0 1) (substring $1 2))= ::
#+texinfo: @noindent
concatenates the content of columns 1 and column 2.
Swap the first two characters of the content of column 1.
When the =N= flag is used, all referenced elements are parsed as
numbers and interpolated as Lisp numbers, without quotes. Fields that
cannot be parsed as numbers are interpolated as zeros. For example:
- ='(+ $1 $2);N= ::
: '(+ $1 $2);N
Add columns 1 and 2, equivalent to Calc's =$1+$2=.
#+texinfo: @noindent
adds columns 1 and 2, equivalent to Calc's =$1+$2=. Ranges are
inserted as space-separated fields, so they can be embedded in list or
vector syntax. For example:
- ='(apply '+ '($1..$4));N= ::
: '(apply '+ '($1..$4));N
Compute the sum of columns 1 to 4, like Calc's =vsum($1..$4)=.
#+texinfo: @noindent
computes the sum of columns 1 to 4, like Calc's =vsum($1..$4)=.
When the =L= flag is used, all fields are interpolated literally: the
cell content is replaced in the Lisp form stripped of leading and
trailing white space and without quotes. If a reference is intended
to be interpreted as a string by the Lisp form, the reference operator
itself should be enclosed in double-quotes, like ="$3"=. The =L= flag
is useful when strings and numbers are used in the same Lisp form. For
example:
: '(substring "$1" $2 $3);L
#+texinfo: @noindent
extracts the part of the string in column 1 between the character
positions specified in the integers in column 2 and 3 and it is easier
to read than the equivalent:
: '(substring $1 (string-to-number $2) (string-to-number $3))
*** Durations and time values
:PROPERTIES: