Circle: C++ Automation Language
circle-lang.org
circle-lang.org
The cool part about Zig is that it uses this ability (via the `comptime` keyword) to power it’s generic system, and not vice versa (looking at you, Turing complete type systems)
https://ziglang.org/learn/overview/#generic-data-structures-...
At least they give it a nice abbreviation like “comptime” instead of the atrocious “CTFE” that C++ seems to like.
There are also 3 walkthroughs that are kind of buried:
1. https://github.com/seanbaxter/circle/blob/master/walkthrough...
2. https://github.com/seanbaxter/circle/blob/master/walkthrough...
3. https://github.com/seanbaxter/circle/blob/master/walkthrough...
This was the only thing holding me back from finishing my metacircular TODO app.
It might seem too picky to some, but I need to have good control over the inputs into my build processes. There are the obvious concerns regarding reproducibility and security which, again, maybe some don't care about. But there are also implications for distributed building and caching workflows. Circle doesn't practically drop in for C++ while it is allowed to do arbitrary I/O (even off the machine!) at build time.
It seems like it should be a solvable problem at the expense of restricting what can happen at compile time, at least as an opt-in feature.
The usual response is "well, don't do that kind of thing!", but at scale, manually maintaining that kind of design standard isn't practical. But I'm sure you all audit all the source that feeds into each one of your container base images.
Java and C# also have acquired many capabilities that for 10 years were a plus from D over them.
Shame it took so long to actually arrive.
Any other interesting use of this?
Related topic: standardizing reflection in c++. https://youtu.be/ARxj3dfF_h0 https://en.cppreference.com/w/cpp/keyword/reflexpr
Circle has dozens of special traits for accessing useful stuff about types, packs, etc. Don't need to overengineer such a simple thing.
the trick (relyiong __FUNCTION__ like macros/(funcs?)) is here - https://github.com/Neargye/magic_enum/blob/master/include/ma...
and https://github.com/Neargye/magic_enum/blob/master/include/ma...
https://github.com/seanbaxter/shaders#reflection-and-attribu...
Just mark your declarations up with custom attributes:
[[.imgui::range_float { .1, 5 }]] float Zoom = 1.5;
[[.imgui::range_float { 0, 1 }]] float Speed = .15;
[[.imgui::range_float { .1, 1 }]] float XScale = .3;
[[.imgui::range_float { 0, .5 }]] float YScale = .2;
Then loop over the members with a meta for, and emit widget code that's guided by the attribute kind and data. These attributes each define a scrollbar.The kind of data you reflect over will likely come from within the program.
Lately I've been working on a Go (pretty small subset -- no GC or concurrency) to C++ compiler and generating meta stuff as part of it. Mostly because I like how focused Go's syntax is and also it having an official parser and type checker in the standard library makes things pretty quick to get started.
I should play with Circle some time! It's definitely touching on a lot of the desired things from a metaprogramming layer.