Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nim lang 如何在Nim中检查未命名元组?_Nim Lang - Fatal编程技术网

Nim lang 如何在Nim中检查未命名元组?

Nim lang 如何在Nim中检查未命名元组?,nim-lang,Nim Lang,如果元组已就地定义,则下面的宏可以工作,但如果元组是通过类型名称定义的,则无法工作 导入宏 宏是未命名的元组[T](TT:type[T]):bool= #nnktuple-命名 设r=new(TT.getTypeInst[1].kind==nnkTupleConstr) 报价做: `r` 类型NamedT=tuple[a:string] 类型unnamet=(字符串,) echo是_unnamed_tuple tuple[a:string]35;=>false echo为_unnamed_tu

如果元组已就地定义,则下面的宏可以工作,但如果元组是通过类型名称定义的,则无法工作

导入宏
宏是未命名的元组[T](TT:type[T]):bool=
#nnktuple-命名
设r=new(TT.getTypeInst[1].kind==nnkTupleConstr)
报价做:
`r`
类型NamedT=tuple[a:string]
类型unnamet=(字符串,)
echo是_unnamed_tuple tuple[a:string]35;=>false
echo为_unnamed_tuple NamedT 35;=>false
echo是_unnamed_tuple(字符串,)#=>true
echo is_unnamed_tuple unnamed#=>false都是宏

import std/macros

macro is_unnamed_tuple(T: typedesc): bool =
  # nnkTupleTy - named
  if T.kind != nnkTupleConstr:
    if T.kind == nnkSym:
      result = newLit( T.getImpl[^1].kind == nnkTupleConstr)
    else:
      result = newLit(false)
  else:
    result = newLit(true)

macro isVariant(T: typedesc): bool =
  result = newLit(false)
  let impl = T.getImpl
  if impl.kind != nnkNilLit:
    let objImpl =
      if impl[^1].kind == nnkRefTy:
        impl[^1][0]
      else:
        impl[^1]
    if objImpl.kind == nnkObjectTy:
      for x in objImpl[^1]:
        if x.kind == nnkRecCase:
          result = newLit(true)
          break
type 
  NamedT = tuple[a: string]
  UnnamedT = (string,)
  VarObj = object
    a: int
    case t: bool
    of true: discard
    of false: discard

assert is_unnamed_tuple(tuple[a: string]) == false
assert is_unnamed_tuple(NamedT) == false
assert is_unnamed_tuple((string,)) == true
assert is_unnamed_tuple(UnnamedT) == true
assert string.isVariant == false
assert VarObj.isVariant == true
assert int.isVariant == false
都是宏

import std/macros

macro is_unnamed_tuple(T: typedesc): bool =
  # nnkTupleTy - named
  if T.kind != nnkTupleConstr:
    if T.kind == nnkSym:
      result = newLit( T.getImpl[^1].kind == nnkTupleConstr)
    else:
      result = newLit(false)
  else:
    result = newLit(true)

macro isVariant(T: typedesc): bool =
  result = newLit(false)
  let impl = T.getImpl
  if impl.kind != nnkNilLit:
    let objImpl =
      if impl[^1].kind == nnkRefTy:
        impl[^1][0]
      else:
        impl[^1]
    if objImpl.kind == nnkObjectTy:
      for x in objImpl[^1]:
        if x.kind == nnkRecCase:
          result = newLit(true)
          break
type 
  NamedT = tuple[a: string]
  UnnamedT = (string,)
  VarObj = object
    a: int
    case t: bool
    of true: discard
    of false: discard

assert is_unnamed_tuple(tuple[a: string]) == false
assert is_unnamed_tuple(NamedT) == false
assert is_unnamed_tuple((string,)) == true
assert is_unnamed_tuple(UnnamedT) == true
assert string.isVariant == false
assert VarObj.isVariant == true
assert int.isVariant == false

谢谢你花时间来写它!:)谢谢你花时间来写它!:)