from oomacro import class from utils import `...` from sequtils import newSeqWith from math import sqrt type Vector*[T] = seq[T] #SVector*[S : static[int], T] = array[1..S,T] proc newVector*[T](size : int, init: T=0) : Vector[T] = result = newSeq[T](size) for i in 0...len(result): result[i] = init proc `+`*[T](v1 : Vector[T], v2:Vector[T]) : Vector[T] = result = newVector[T](len(v1)) for i in 0...len(v1): result[i] = v1[i] + v2[i] proc `-`*[T](v1 : Vector[T], v2:Vector[T]) : Vector[T] = result = newVector[T](len(v1)) for i in 0...len(v1): result[i] = v1[i] - v2[i] proc `*`*[T](v1 : Vector[T], v2:Vector[T]) : T = result = 0 for i in 0...len(v1): result += v1[i] * v2[i] proc `+=`*[T](v1 : var Vector[T], v2 : Vector[T]) = for i in 0...len(v1): v1[i] += v2[i] proc `-=`*[T](v1 : var Vector[T], v2 : Vector[T]) = for i in 0...len(v1): v1[i] -= v2[i] proc `+=`*[T](v : var Vector[T], value : T) = v.add(value) proc createVector*[T](elems : varargs[T]) : Vector[T] = result = newSeq[T]() for elem in items(elems): result += elem proc norm*[T](v : Vector[T]) : T = for value in v: result += v * v proc abs*[T](v : Vector[T]) : T = return math.sqrt(v.norm) # let vec = createVector(10,1) # echo $vec # var vec2 = newVector[int](10, 1) # echo vec2 # type Foo[T, S] = object of RootObj # data : S # proc `+`[T,S](v1 : Foo[T,S], v2 : Foo[T,S]) : Foo[T,S] = # result = Foo[T,S]() # for i in range(len(v1.data)): # result[i] = v1.data[i] + v2.data[i] # type Bar[T] = Foo[T, array[3,T]] # var bar = Bar[int]() # bar.data[1] = 4 # bar.data[1] = 4