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

Reply via email to