也可以使用 Emacs Lisp 编写公式。如果 Calc 的功能不足以满足需求,这种方式在字符串处理和控制结构方面会非常有用。
当公式以单引号后跟左括号开头时,会被当作 Lisp 表达式求值。表格单元格引用会在执行前代入到 Lisp 表达式中。求值结果应当为字符串或数字。求值模式以及用于渲染返回值的 format 字符串(类似 printf )22 可以在分号后指定。
默认情况下,单元格引用会作为字面量 Lisp 字符串代入:字段内容会去除首尾空白后,用双引号包裹并替换到 Lisp 表达式中。例如:
'(concat $1 $2)
会将第 1 列和第 2 列的内容拼接在一起。
使用 ‘N’ 标记时,所有引用的元素会被解析为数字,并作为无引号的 Lisp 数字代入。无法解析为数字的字段会以 0 代入。例如:
'(+ $1 $2);N
会将第 1 列和第 2 列相加,等价于 Calc 中的 ‘$1+$2’ 。范围会以空格分隔的字段形式插入,因此可以嵌入到列表或向量语法中。例如:
'(apply '+ '($1..$4));N
计算第 1 列到第 4 列的和,与 Calc 的 ‘vsum($1..$4)’ 效果相同。
使用 ‘L’ 标记时,所有字段会按字面量代入:单元格内容去除首尾空白后,不带引号直接替换到 Lisp 表达式中。如果希望 Lisp 表达式将某个引用当作字符串处理,需要将引用本身用双引号包裹,例如 ‘"$3"’ 。 ‘L’ 标记在同一个 Lisp 表达式中同时使用字符串和数字时非常实用。例如:
'(substring "$1" $2 $3);L
提取第 1 列字符串中,由第 2、3 列整数指定的字符位置之间的子串,可读性优于等价写法:
'(substring $1 (string-to-number $2) (string-to-number $3))
如果公式本身包含 ‘;’ 符号,Org mode 可能会错误地将分号后的内容当作格式说明符:
'(concat $1 ";")
可以在末尾额外添加一个 ‘;’ ,表示前面所有的 ‘;’ 都属于公式本身:
'(concat $1 ";");
format 与 C 等语言中的 printf 类似,但可处理任意精度整数及其他 Elisp 对象。详细说明参见 (elisp)Formatting Strings 与 format 的文档字符串。