Help us understand the problem. What is going on with this article?

Nim v1.2.0 概要

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"

変更履歴

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

tauplus
Nimを勉強中
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした