- v1.0.から幾つかの機能と標準ライブラリが追加された。
- 破壊的な変更は最小限としたが、バグフィックスとユーザへの恩恵のために必要な変更が行われた。
アップデート方法
インストール済みの人はchoosenim
コマンドでアップデート可能。
$ choosenim update stable
複数のNimバージョンを使う場合
-
v1.2でもv1.0の時のように動作させたい場合、
--useVersion:1.0
をつけてみる。つけてもv1.0の時と同じ動作をしないならissueを投げるべし。 -
自分のライブラリをv1.0とv1.2の両方で使えるようにしたいが、ライブラリがv1.2で導入された機能に依存する場合は、
when declared
を用いる。
import sequtils
when not declared(unzip):
proc unzip*[S, T](s: openArray[(S, T)]): (seq[S], seq[T]) =
result[0] = newSeq[S](s.len)
result[1] = newSeq[T](s.len)
for i in 0..<s.len:
result[0][i] = s[i][0]
result[1][i] = s[i][1]
let a = @[('a', 1), ('b', 2), ('c', 3)]
let b = unzip(a) # version 1.0 では上記で宣言したunzipが使われる
# version 1.2 ではsequtilsライブラリのunzipが使われる
assert b == (@['a', 'b', 'c'], @[1, 2, 3])
新機能
GC:ARC
-
--gc:arc
が新機能としてリリース - FOSDEM 2020で開発者(Araq)が背景の説明と利点を示すベンチマークを示している。
- C++やRustのSemanticsから影響を受けている。
- もっと詳細な説明は後日でるかも。
新しいsugarマクロ
Collect
-
collect
マクロは seq/set/table の内包に役立つ -
lc
(リスト内包)の代替でlc
よりも慣用的で強力 -
collect
の使用にオーバーヘッドはない
import sugar
let numbers = collect(newSeq): # or: collect(newSeqOfCap(10))
for i in 1..10:
i
assert numbers == @[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
import tables, sugar
let oddSquares = collect(initTable):
for i in numbers:
if i mod 2 == 1:
{i: i * i}
assert len(oddSquares) == 5
assert oddSquares[7] == 49
import sets, sugar
let oddOrNegative = collect(initHashSet):
for i in numbers:
{if i mod 2 == 1: i else: -i}
assert 5 in oddOrNegative
assert 2 notin oddOrNegative
assert -2 in oddOrNegative
Dup
-
dup
マクロはin-place関数に対して使うことで入力変数を変更せずに結果を返すようにすることができる。 - 将来的には、in-placeバージョンのみが提供されるようになる可能性がある。(現在は
sort
とsorted
などin-placeとout-of-placeの2種類の関数が用意されている場合がある)
import sugar
proc makePalindrome(s: var string) =
for i in countdown(s.len-2, 0):
s.add(s[i])
var a = "abc"
makePalindrome(a)
assert a == "abcba"
var b = "xyz"
var c = b.dup(makePalindrome)
assert b == "xyz"
assert c == "xyzyx"
アンダースコア_
によって、引数を渡す場所を示すことができる。
import algorithm, sugar
# b = "xyz"
var d = dup b:
makePalindrome # xyzyx
sort(_, SortOrder.Descending) # zyyxx
makePalindrome # zyyxxxyyz
assert d == "zyyxxxyyz"
Capture
-
capture
はループ内でループカウンタの値を用いたクロージャーの作成に有用 - イベント処理や
{int: callBack}
ルックアップテーブルに使用可
import strformat, sugar
var myClosure: proc(): string
for i in 5..7:
for j in 7..9:
if i * j == 42:
capture i, j:
myClosure = proc (): string = fmt"{i} * {j} = 42"
let a = myClosure()
assert a == "6 * 7 = 42"
変更履歴
多いので省略。そのうち、この記事で書いてくれるはず。