generated at
Nimのprocとmethodとfunc
from Nim

proc
だから、overloadができる
monkey-nimのnewError関数でも使っている



method
Dynamic Dispatchで関数を定義したい場合はmethodを使う
overrideする関数には {.base.} Pragmaを付ける
overrideされる側である親クラスのメソッドにのみに書くのかな
他の言語のようにmethodがclassにbindされているのはデメリットがある
開発者の管理下に無いクラスにメソッドを追加したいときに不可能もしくは、複雑になる
メソッドがどのクラスに属しているのか不明確になる
overrideに書いたコードをNimに書き直したもの
nim
type 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型なので、②が使われていない
overrideではなく、overloadが起こっている
pとcを定義時に型を指定しなければ、上のコードのときと同じ結果になる
Nimにはvtableは使われていない代わりに、dispatch treeが生成される
>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から入った
参考