Managed to write a suitable macro, posting solution for completeness:
    
    
    type DataTable = tuple
       id : seq[int]
       name : seq[string]
       age: seq[Natural]
    
    proc len(dt: DataTable) : Natural =
      for f in fields(dt):
        return f.len
      return 0
    
    
    macro injectTupleOrObject(t: typed, index:typed): typed =
      var tType = t.getTypeImpl
      case tType.typeKind:
        of ntyTuple: discard
        of ntyObject: tType = tType[2]
        else: error "Not a tuple or object"
      
      result = newNimNode(nnkLetSection)
      for field in tType:
        let dotExpr = newDotExpr(t, newIdentNode($field[0]))
        let brkExpr = newNimNode(nnkBracketExpr).add(dotExpr, index)
        result.add(newIdentDefs(ident($field[0]), newEmptyNode(), brkExpr))
    
    template mask(dt : DataTable, expr : untyped) : seq[bool] =
      var result = newSeq[bool](dt.len)
      for i in 0 ..< dt.len:
        injectTupleOrObject(dt, i)
        result[i] = expr
      result
    
    
    echo mask(x, age >= 15 and isAlphaNumeric(name))
    
    

Reply via email to