7. genfft構造 and dft sign n input = let reccooley_tukey sign n1 n2 input = let tmp1 = array n2 (fun i2 -> dft sign n1 (fun i1 -> input (i1 * n2 + i2))) in let tmp2 = .. 0.0 * a + b b a+b 2a+2b 2a+2b a a b b 1 2 V T4, T5, Te, Tf, T7, T8; T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); T5 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); Te = LD(&(xi[WS(is, 6)]), ivs, &(xi[0]));
8. 命令セット(抜粋) type expr = | Num of Number.number | Plus of expr list | Times of expr * expr | Uminus of expr | Load of Variable.variable | Store of Variable.variable * expr Ifもloopも無い! 実際にはこれを直接書くことは少なく、もっぱらmodule Complexのval(@*) : expr -> expr -> expr val (@+) : expr -> expr -> expr val (@-) : expr -> expr -> exprなどを使う
9. fibを作る q0, q1, q0+q1, q1+(q0+q1), (q0+q1)+(q1+(q0+q1)), … let q = load_array_c 2 input in let rec output = function 0 -> q 0 | 1 -> q 1 | i -> output (i-1) @+ output (i-2) in (* 中略 *) let odag = store_array_r n oloc output in let annot = standard_optimizerodag in let tree = Fcn (* 中略 *) ([Asch annot]))) in print_string (unparse tree ^ "") LoopはOcaml側で書く Complex.(@+)を利用 自動で最適化をしてくれる魔法の言葉 実態は最適化関数群を@@で繋いだもの C.unparse : C言語出力!