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