On Sunday, 1 June 2025 at 15:29:56 UTC, monkyyy wrote:
```d dmd -unittest -i -main -run foo.d --- meta.d import std; enum counter=cast(immutable(void)*)[0].ptr; auto count()=>(*(cast(int*)counter))++; auto getcount()=>(*(cast(int*)counter)); template ctval(T,int i){ enum point=cast(immutable(void)*)[T.init].ptr; auto get()=>(*(cast(T*)point)); auto set(T t){(*(cast(T*)point))=t; return true;} auto apply(alias F)(){ enum _=set(F(get())); return true; } } struct linked(T){ T val; typeof(this) function() next; auto front()=>val; void popFront(){this=next();} bool empty()=>next==null; } auto delelinked(T,int I)(){ return ctval!(linked!T,I).get; } template add(alias V){ enum int I=count; alias L=ctval!(linked!(typeof(V)),I); alias _=L.apply!((p){p.val=V;return p;}); static if(I>0){ _=ctval!(linked!(typeof(V)),I-1).apply!((p){p.next=&delelinked!(typeof(V),I); return p;}); } } --- foo.d import std; import meta; unittest{ alias a=add!1; alias b=add!2; alias c=add!3; alias d=add!4; foreach(e; ctval!(linked!int,0).get){ e.writeln; } } import bar; --- bar.d import meta; alias a=add!5; alias b=add!6; alias c=add!7; alias d=add!8; ``` off by one but this direction should work