LoginSignup
24
6

More than 3 years have passed since last update.

Nim v1.2.0 概要

Posted at

Version 1.2.0 releasedの概要

  • 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バージョンのみが提供されるようになる可能性がある。(現在はsortsortedなど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"

変更履歴

多いので省略。そのうち、この記事で書いてくれるはず。

24
6
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
24
6