-
Notifications
You must be signed in to change notification settings - Fork 0
Metaprogramming
danieltan1517 edited this page Feb 10, 2026
·
5 revisions
One can use the insert directive to automatically generate getter and setter functions. This is an elementary example for didactic purposes, but one can extrapolate this example to do much more complex metaprogramming.
generate_getters_and_setters :: ($T: Type) -> string {
builder: String_Builder;
info := type_info(T);
for member: info.members {
print("%\n", type_of(member.type));
print_to_builder(*builder, "get_% :: (s: %) -> type_of(s.%) { return s.%; }\n",
member.name, T, member.name, member.name);
print_to_builder(*builder, "set_% :: (s: *%, val: type_of(s.%)) { s.% = val; }\n",
member.name, T, member.name, member.name);
}
s := builder_to_string(*builder);
return s;
}
#insert -> string {
return generate_getters_and_setters(Person);
}
Given the following Person struct as an example:
Person :: struct {
name: string;
age: int;
}
The following code generated by the function would result in this:
get_name :: (s: Person) -> type_of(s.name) { return s.name; }
set_name :: (s: *Person, val: type_of(s.name)) { s.name = val; }
get_age :: (s: Person) -> type_of(s.age) { return s.age; }
set_age :: (s: *Person, val: type_of(s.age)) { s.age = val; }