パターンマッチの実装(3)
型でのマッチングの実装を一部実装しました。
これによって関数のオーバーロードが出来るようになりました↓
print(10) # print_intが呼ばれる print("Hello World") # print_stringが呼ばれる
関数定義時にはこんな感じで書きます↓
fib(n!Int): fib(n-1) + fib(n-2) fib(0): 0 fib(1): 1
これでInt以外でfibを呼ぶとパターンマッチエラー(型エラーではなく)になります。これまでと同じく、型のパターンマッチのコードもJITコンパイルで生成しています。
静的型付け言語と違って、rowlでは型によるマッチングであっても実行時検査で行うので、実行時オーバヘッドがあります。
例えば、上の定義でfib(36)を走らせた場合は、4.66秒だったのが6.91秒と遅くなりました。今回整数演算でもパターンマッチを行うようしたので、だいぶ大きなオーバヘッドになっています。
一方、型パターン使用時はJITコンパイラが型の情報を使って最適化をかける事が出来るので、最終的に性能的にもプラスにはたらくことを期待しています。rowlはRuby等と違ってグローバルに関数定義情報を持っていて、高速化が楽になるように作っています。