間接関数呼び出し(indirect function call ,indirect call)とは,変数で指定された関数(メソッド)を実行する方法です
たとえばc言語なら,ポインタ変数を使って
void (*f)(void); f = foo; f(); // これが indirect function call
となります
本エントリではawkで間接関数呼び出しを実装する方法をまとめます
awkでは間接関数呼び出しはできない
まず標準のawk(POSIX準拠のawk)では,indirect function callはできません.macOS標準のawk(/usr/bin/awk)などは indirect function callはできないことが多いです
gawkでは間接関数呼び出しはできる
一方で大半のLinuxディストリビューション(ubuntuとかcentos)の /usr/bin/awk は標準のawkではなくて,GNU拡張版の gawk を採用しています
gawk で indirect function callを行う方法
indirect function callは@演算子を使います
たとえば"foo"という関数をコールするには
f = "foo" @f() # これが indirect function call
となります
公式のマニュアルはこちらにあります
https://www.gnu.org/software/gawk/manual/html_node/Indirect-Calls.html
利用例:quicksort
上記の公式マニュアルでは,利用例として quicksort を取り上げて,ソート順を決定するoperatorを indirect function callで指定する例が紹介されています
引用すると quicksortの実装は以下の通りで, 引数 less_than でoperatorの関数名を指定しています
function quicksort(data, left, right, less_than, i, last) { if (left >= right) # do nothing if array contains fewer return # than two elements quicksort_swap(data, left, int((left + right) / 2)) last = left for (i = left + 1; i <= right; i++) if (@less_than(data[i], data[left])) quicksort_swap(data, ++last, i) quicksort_swap(data, left, last) quicksort(data, left, last - 1, less_than) quicksort(data, last + 1, right, less_than) } function quicksort_swap(data, i, j, temp) { temp = data[i] data[i] = data[j] data[j] = temp }
例えば less than の条件でソートしたい場合は,以下の関数を定義して
function num_lt(left, right) { return ((left + 0) < (right + 0)) }
引数 less_than として,関数の名前 "num_lt" を指定します