Move Semantics and Ownership
32.1 sink Parameters
proc store(s: var seq[string], item: sink string) =
s.add item # item is moved in, not copied
var bag: seq[string]
var msg = "hello"
store(bag, msg) # msg's last use: moved (msg is now "wasMoved")
store(bag, "literal")32.2 move, ensureMove, wasMoved
var a = @[1, 2, 3]
var b = move(a) # explicit move; a is reset to empty
var c = ensureMove(b) # Nim 2: compile error if a move isn't possible32.3 lent (Borrowed Return Values)
type Holder = object
items: seq[string]
proc first(h: Holder): lent string = h.items[0] # returns a borrowed view, no copy
proc firstMut(h: var Holder): var string = h.items[0]32.4 Isolated[T] for Thread Transfer
import std/isolation
let iso = isolate(@[1, 2, 3]) # proves no other references exist
# send through a channel safely32.5 openArray Views and Experimental View Types
--experimental:views lets openArray[T] and var openArray be used as first-class borrowed views, with borrow checking.