概要
こんにちは。
普段業務ではScalaをメインに書いているものですが、
ちょっとした調査スクリプトを書いたり、雑なスクリプトを作りたい時は、Pythonやシェルスクリプトを採用することが多いです。
しかしながら、
普段Scalaを書いている身としましては、
Pythonは、list.map(???).filter(???)
...のようにメソッドチェーンでコレクション処理をやりずらかったり、ラムダ式を定義するのにlambda
キーワードをタイピングしたりと、若干の煩わしさを感じることもあります。
そこで、現在、Nimのような新しめの言語を使って、雑なスクリプトを作れないかと検討していまして、
その過程で見つけたNim言語の素晴らしいところを6個共有できればと思います m(_ _)m
1. map, filter, foldlが使いやすい!
以下のコードは、NimのmapIt, filterIt, foldlの使用例です。
mapIt
, filterIt
については、単に引数it
を使う式を丸括弧の中に書いてやるだけで、
ラムダ式を渡すことができます。
import sequtils
import sugar
echo [1, 2, 3, 4, 5, 6].mapIt(it * 2) # @[2, 4, 6, 8, 10, 12]
echo [1, 2, 3, 4, 5, 6].filterIt(it %% 2 == 0) # @[2, 4, 6]
echo [1, 1, 1].foldl(a + b) # 3
echo [1, 2, 3, 4, 5, 6].map(x => x * 2) # @[2, 4, 6, 8, 10, 12]
echo [1, 2, 3, 4, 5, 6].filter(x => x %% 2 == 0) # @[2, 4, 6]
2. ドット演算子で関数を呼び出す
UFCSをサポートしているので、オブジェクト指向言語におけるメソッドのように関数に値を渡すことが可能です。
proc addOne(num: int): int =
num + 1
echo 10.addOne # 11
echo addOne(10) # 11(普通に呼び出した場合)
3. 変数再代入禁止
let
で変数を定義すると再代入を禁止することができます。
var
で定義すると再代入可能です。
var x = 1
x = 10
echo x
let y = 2
y = 10 # コンパイルエラーに..
echo y
4. タプルが便利
タプルの各要素に名前をつけることができます。
type
Person = tuple
name: string
age: int
let person: Person = (name: "あああ", age: 20)
echo person.name # あああ
echo person.age # 20
5. 文字列のjoin
Pythonですと、"-".join([1, 2, 3, ...])
のような若干トリッキーなjoinを書くことになりますが、
Nimですと、自然にjoin
することができます。
import strutils
echo [1, 2, 3, 4, 5, 6].join("-") # 1-2-3-4-5-6
6. importが直感的
多くのプログラミング言語ですと.
繋ぎでimportしますが、Nimですと、/
で階層を繋いでいます。
地味に分かりやすいです。
import std/json