Nimでlambda式(無名関数)を書く方法です。
おそらく無名関数はmapで使うことが多いと思われます。
そこで例として、リスト[1, 2, 3, 4, 5]
をそれぞれ+1して[2, 3, 4, 5, 6]
とするシンプルなコードを書いてみましょう。
分かりやすいように、先にPythonのソースコードも載せて置きます。
Python
python3
add_one = lambda x: x + 1
add_one(1) # 2
l = range(1, 6) # [1, 2, 3, 4, 5]
new = map(lambda x: x + 1, l) # [2, 3, 4, 5, 6]
こんな感じで、lambda [引数]: [戻り値]
とすることで無名関数を作れます。
Nim
ここからが本題です。
proc
Nimで関数を定義する際はprocを書きますが、関数名をそのまま省略することで無名関数を作れます。
proc
from sequtils import map
let add_one = proc(x: int): int = return x + 1 # これ。意外と簡単でしょ?
1.add_one # 2
let add_one_simple = proc(x: int): int = x + 1 # returnを省略
1.add_one_simple # 2
let l = @[1, 2, 3, 4, 5]
l.map(proc (x: int): int = return x + 1) # @[2, 3, 4, 5, 6] : seq[int]
l.map(proc (x: int): int = x + 1) # returnを省略。3行目と同じ
2, 4, 8, 9行目のように、関数名を省略してワンライナーで定義してあげればOKです。returnは省略できます。Pythonのlambdaと同じですね。
proc ([引数名]: [引数の型]): [戻り値の型] = 戻り値
と書いてあげるだけです。
sugar
sugarを使うともっと簡潔に書くことができます。
sugar
let add_one = (x: int) => x + 1
1.add_one # 2
let l = @[1, 2, 3, 4, 5]
# 型推論可能なら引数の型は省略できる
l.map(x => x + 1) # @[2, 3, 4, 5, 6] : seq[int]
([引数]: [引数の型]) => 戻り値
と書くだけで済むので、シンプルで見やすいですね。