Function: org-table-make-reference
org-table-make-reference is a byte-compiled function defined in
org-table.el.gz.
Signature
(org-table-make-reference ELEMENTS KEEP-EMPTY NUMBERS LISPP)
Documentation
Convert list ELEMENTS to something appropriate to insert into formula.
KEEP-EMPTY indicated to keep empty fields, default is to skip them.
NUMBERS indicates that everything should be converted to numbers.
LISPP non-nil means to return something appropriate for a Lisp
list, literal is for the format specifier L.
Source Code
;; Defined in /usr/src/emacs/lisp/org/org-table.el.gz
(defun org-table-make-reference (elements keep-empty numbers lispp)
"Convert list ELEMENTS to something appropriate to insert into formula.
KEEP-EMPTY indicated to keep empty fields, default is to skip them.
NUMBERS indicates that everything should be converted to numbers.
LISPP non-nil means to return something appropriate for a Lisp
list, `literal' is for the format specifier L."
;; Calc nan (not a number) is used for the conversion of the empty
;; field to a reference for several reasons: (i) It is accepted in a
;; Calc formula (e. g. "" or "()" would result in a Calc error).
;; (ii) In a single field (not in range) it can be distinguished
;; from "(nan)" which is the reference made from a single field
;; containing "nan".
(if (stringp elements)
;; field reference
(if lispp
(if (eq lispp 'literal)
elements
;; Ignore KEEP-EMPTY here.
;; When ELEMENTS="" and NUMBERS=t, (string-to-number "")
;; returns 0 - consistent with (0) for Calc branch.
;; When ELEMENTS="" and NUMBERS=nil, `prin1-to-string' will
;; return "\"\"" - historical behavior that also does not
;; leave missing arguments in formulas like (string< $1 $2)
;; when $2 cell is empty.
(prin1-to-string
(if numbers (string-to-number elements) elements)))
(if (string-match "\\S-" elements)
(progn
(when numbers (setq elements (number-to-string
(string-to-number elements))))
(concat "(" elements ")"))
(if (or (not keep-empty) numbers) "(0)" "nan")))
;; range reference
(unless keep-empty
(setq elements
(delq nil
(mapcar (lambda (x) (if (string-match "\\S-" x) x nil))
elements))))
(setq elements (or elements '())) ; if delq returns nil then we need '()
(if lispp
(mapconcat
(lambda (x)
(if (eq lispp 'literal)
x
(prin1-to-string (if numbers (string-to-number x) x))))
elements " ")
(concat "[" (mapconcat
(lambda (x)
(if (string-match "\\S-" x)
(if numbers
(number-to-string (string-to-number x))
x)
(if (or (not keep-empty) numbers) "0" "nan")))
elements
",") "]"))))