added system.typeof operation; fixes #9093

This commit is contained in:
Araq 2018-10-24 17:09:51 +02:00
commit 963292f725
5 changed files with 47 additions and 4 deletions

View file

@ -673,10 +673,16 @@ template mapIt*(s: typed, op: untyped): untyped =
## nums = @[1, 2, 3, 4]
## strings = nums.mapIt($(4 * it))
## assert strings == @["4", "8", "12", "16"]
type outType = type((
block:
var it{.inject.}: type(items(s));
op))
when defined(nimHasTypeof):
type outType = typeof((
block:
var it{.inject.}: typeof(items(s), typeOfIter);
op), typeOfProc)
else:
type outType = type((
block:
var it{.inject.}: type(items(s));
op))
when compiles(s.len):
block: # using a block avoids https://github.com/nim-lang/Nim/issues/8580
@ -1135,5 +1141,13 @@ when isMainModule:
A, B
doAssert mapIt(X, $it) == @["A", "B"]
block:
# bug #9093
let inp = "a:b,c:d"
let outp = inp.split(",").mapIt(it.split(":"))
doAssert outp == @[@["a", "b"], @["c", "d"]]
when not defined(testing):
echo "Finished doc tests"

View file

@ -180,6 +180,15 @@ else:
## Cannot be overloaded.
discard
when defined(nimHasTypeof):
type
TypeOfMode* = enum ## Possible modes of `typeof`.
typeOfProc, ## Prefer the interpretation that means `x` is a proc call.
typeOfIter ## Prefer the interpretation that means `x` is an iterator call.
proc typeof*(x: untyped; mode = typeOfIter): typeDesc {.magic: "TypeOf", noSideEffect, compileTime.} =
## Builtin 'typeof' operation for accessing the type of an expression. Since version 0.20.0.
discard
proc `not`*(x: bool): bool {.magic: "Not", noSideEffect.}
## Boolean not; returns true iff ``x == false``.