例3でも触れたがremoteの第二引数は別表の参照前に展開されないように見える。
しかしマニュアルには次のような例がある。(Field coordinates in formulas)
- @3 = 2 * remote(FOO, @1$$#)
- Insert the doubled value of each column of row 1 of the table named FOO into row 3 of the current table.
この例の @1$$#
はremote()を解決する前に @1$1
, @1$2
, @1$3
のように参照元の列の番号に展開されなければならないはずだ。
#+NAME: remote-ref-tbl1
| 1 | 2 | 3 | 4 |
| 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 |
| 2 | 4 | 6 |
#+TBLFM: @1=2*remote(remote-ref-tbl1, @1$$#)
ちなみに「現在の列」を表したいなら $0
やそもそも列を省略すれば良さそうだが、実際にやると次のようになる。
| 2 | 2 | 2 |
#+TBLFM: @1=2*remote(remote-ref-tbl1, @1$0)
マニュアルにもリモート参照の第二引数は絶対参照か名前参照でなければならないと書いてあるのでこの書き方はできないのだろう。
org-table-eval-formula
関数を見ると、 @#
等のフィールド座標表記はリモート参照よりも前に解決しているようだ。つまり、remoteとその引数の展開は次のような順番になっている。
- フィールド座標(
@#
$#
)だけ先に解決(数字へ置き換え)
- 第一引数を現在の表上で解決し、得られた名前に従って参照先となる表を見つける
- 見つけた表上で1の結果得られた第二引数の参照を解決する
そもそもこの remote(表名, 参照) という表記は関数の計算などではなく文字列の置き換えに過ぎない。なので展開の規則はCalcともElispとも異なる。 実際マニュアルの例にもあるとおりElisp式内でも同じように書ける。
- $2 = '(identity remote(FOO, @@#$1))
- Copy text or values of each row of column 1 of the table named FOO into column 2 of the current table.