LoginSignup
12
3

More than 3 years have passed since last update.

Nimでlambda式

Last updated at Posted at 2019-07-02

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]

([引数]: [引数の型]) => 戻り値
と書くだけで済むので、シンプルで見やすいですね。

12
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
3