Nimのprocとmethodとfunc
proc
method
overrideされる側である親クラスのメソッドにのみに書くのかな
他の言語のようにmethodがclassにbindされているのはデメリットがある
開発者の管理下に無いクラスにメソッドを追加したいときに不可能もしくは、複雑になる
メソッドがどのクラスに属しているのか不明確になる
nimtype
Parent = ref object of RootObj
Child = ref object of Parent
method hoge(e: Parent) {.base.} = echo "Parent" # ①
method hoge(e: Child) = echo "Child" # ②
# 型はParent, 実体もParent
var p: Parent = Parent()
p.hoge() # -> Parent
# 型はParent, 実体はChild
var c: Parent = Child()
c.hoge() # -> Child
このコードの method
の部分を proc
に書き直すと(もちろんpragmaも消して)、②の hoge
はunusedになり、結果は両方とも「Parent」と出力される
変数cはParent型なので、②が使われていない
pとcを定義時に型を指定しなければ、上のコードのときと同じ結果になる
>Performance note: Nim does not produce a virtual method table, but generates dispatch trees. This avoids the expensive indirect branch for method calls and enables inlining. However, other optimizations like compile time evaluation or dead code elimination do not work with methods. ref
func
副作用のないprocもしくは、iteratorを定義する
methodは?副作用のないmethodってある
#??副作用があるとコンパイルエラーになる
ただし、引数がポインタ(var, ptr)や参照型(ref)の場合は、副作用があってもエラーにならない
noSideEffect
Pragmaを使って定義したprocの糖衣構文
v0.19.0から入った
参考