type NdString* = ptr object len: uint32 chars: UncheckedArray[char] proc newString*(str: string): NdString = let strlen = str.len() let len = 4 + strlen result = cast[NdString](alloc(len)) result.len = strlen.uint32 copyMem(result.chars[0].unsafeAddr, str[0].unsafeAddr, strlen) proc `$`*(ndStr: NdString): string = result = newString(ndStr.len.int) copyMem(result[0].unsafeAddr, ndStr.chars[0].unsafeAddr, ndStr.len.int) proc `&`*(left, right: NdString): NdString = # TODO optimize this later when strings will be benchmarked newString($left & $right)