wow, this is amazing!

I tried using LLM with some result, but your answer is just another level!

LLM generated answer
    
    
    import macros
    
    macro generateObject*(name: untyped, fields: varargs[untyped]): untyped =
      result = newTree(nnkTypeSection,
        newTree(nnkTypeDef,
          name,
          newEmptyNode(),
          newTree(nnkObjectTy,
            newEmptyNode(),
            newEmptyNode(),
            newTree(nnkRecList)
          )
        )
      )
      
      let recList = result[0][2][2]
      for field in fields:
        case field.kind
        of nnkExprColonExpr:
          # Field with type specified: fieldName: fieldType
          recList.add(newIdentDefs(field[0], field[1], newEmptyNode()))
        of nnkIdent:
          # Field without type: Nim will infer as string
          recList.add(newIdentDefs(field, newIdentNode("string"), 
newEmptyNode()))
        else:
          error("Unexpected node kind: " & $field.kind, field)
    
    # Usage
    # generateObject(Person, name, age: int, address)
    
    
    template tableOf(Tname: untyped, cols: untyped) =
        cols
        type
            `Tname Table`* = object
                list*:seq[`Tname`]
    
    tableOf(Person, generateObject(Person, name, age: int, address))
    
    
    let p0 = Person(name: "Alice", age: 30, address: "23 Main St")
    let p1 = Person(name: "Bob", age: 23, address: "32 Main St")
    
    
    var pt: PersonTable
    pt.list.add(p0)
    pt.list.add(p1)
    
    
    for p in pt.list:
        echo p.name, " is ", p.age, " years old and lives at ", p.address
    
    
    Run

Reply via email to