Cmmでは、関数宣言で定義した関数は、変数と同じです。つまり、変数名が関 数名で値として関数の本体をもっている変数とみなされます。
そのため、たとえば、下記のようなプログラムを書くことができます。
func max (a, b) {
if (a > b) a ;
else b ;
}
var MAX = max ;
MAX(2, 5)
上記の例の場合、関数maxの関数本体が、変数MAXに代入されます。このとき、 maxとMAXが同じ関数本体を指し示します。MAXに代入するときに、関数本体が コピーされることはありません。
関数自体を別の関数の引数として渡すことも可能です。
func fact(n) (n == 0) ? 1 : n * fact(n-1) ;
func total(n) (n == 0) ? 0 : n + total(n-1) ;
func exec_and_println(n, fun) {
var result = fun(n) ;
print("Result: ", result) ;
}
exec_and_println(10, fact);
exec_and_println(10, total) ;
また、関数宣言式は、関数そのものを返します。そこで、以下のようなこともできま す。
例2. 階乗計算factvar kaijou = func fact (n) {
if (n == 0) 1 ;
else n * fact (n - 1) ;
}
kaijou(10) ;