top-down type inference, implements rfc 149 (#20091)
* micro implementation of rfc 149 refs https://github.com/nim-lang/RFCs/issues/149 * number/array/seq literals, more statements * try fix number literal alias issue * renew expectedType with if/case/try branch types * fix (nerf) index type handling and float typed int * use typeAllowed * tweaks + const test (tested locally) [skip ci] * fill out more of the checklist * more literals, change @ order, type conversions Not copying the full call tree before the typedesc call check in `semIndirectOp` is also a small performance improvement. * disable self-conversion warning * revert type conversions (maybe separate op later) * deal with CI for now (seems unrelated), try enums * workaround CI different way * proper fix * again * see sizes * lol * overload selection, simplify int literal -> float * range, new @ solution, try use fitNode for nil * use new magic * try fix ranges, new magic, deal with #20193 * add documentation, support templates Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
This commit is contained in:
parent
2dcfd73260
commit
0014b9c48e
17 changed files with 599 additions and 199 deletions
|
|
@ -791,7 +791,7 @@ template toSeq1(s: not iterator): untyped =
|
|||
i += 1
|
||||
result
|
||||
else:
|
||||
var result: seq[OutType] = @[]
|
||||
var result: seq[OutType]# = @[]
|
||||
for it in s:
|
||||
result.add(it)
|
||||
result
|
||||
|
|
@ -808,7 +808,7 @@ template toSeq2(iter: iterator): untyped =
|
|||
result
|
||||
else:
|
||||
type OutType = typeof(iter2())
|
||||
var result: seq[OutType] = @[]
|
||||
var result: seq[OutType]# = @[]
|
||||
when compiles(iter2()):
|
||||
evalOnceAs(iter4, iter, false)
|
||||
let iter3 = iter4()
|
||||
|
|
@ -852,7 +852,7 @@ template toSeq*(iter: untyped): untyped =
|
|||
inc i
|
||||
result
|
||||
else:
|
||||
var result: seq[typeof(iter)] = @[]
|
||||
var result: seq[typeof(iter)]# = @[]
|
||||
for x in iter:
|
||||
result.add(x)
|
||||
result
|
||||
|
|
@ -1020,7 +1020,7 @@ template mapIt*(s: typed, op: untyped): untyped =
|
|||
i += 1
|
||||
result
|
||||
else:
|
||||
var result: seq[OutType] = @[]
|
||||
var result: seq[OutType]# = @[]
|
||||
# use `items` to avoid https://github.com/nim-lang/Nim/issues/12639
|
||||
for it {.inject.} in items(s):
|
||||
result.add(op)
|
||||
|
|
|
|||
|
|
@ -1614,13 +1614,23 @@ proc isNil*[T: proc](x: T): bool {.noSideEffect, magic: "IsNil".}
|
|||
## `== nil`.
|
||||
|
||||
|
||||
proc `@`*[T](a: openArray[T]): seq[T] =
|
||||
## Turns an *openArray* into a sequence.
|
||||
##
|
||||
## This is not as efficient as turning a fixed length array into a sequence
|
||||
## as it always copies every element of `a`.
|
||||
newSeq(result, a.len)
|
||||
for i in 0..a.len-1: result[i] = a[i]
|
||||
when defined(nimHasTopDownInference):
|
||||
# magic used for seq type inference
|
||||
proc `@`*[T](a: openArray[T]): seq[T] {.magic: "OpenArrayToSeq".} =
|
||||
## Turns an *openArray* into a sequence.
|
||||
##
|
||||
## This is not as efficient as turning a fixed length array into a sequence
|
||||
## as it always copies every element of `a`.
|
||||
newSeq(result, a.len)
|
||||
for i in 0..a.len-1: result[i] = a[i]
|
||||
else:
|
||||
proc `@`*[T](a: openArray[T]): seq[T] =
|
||||
## Turns an *openArray* into a sequence.
|
||||
##
|
||||
## This is not as efficient as turning a fixed length array into a sequence
|
||||
## as it always copies every element of `a`.
|
||||
newSeq(result, a.len)
|
||||
for i in 0..a.len-1: result[i] = a[i]
|
||||
|
||||
|
||||
when defined(nimSeqsV2):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue