謎's キッチン

謎のひとりごと。Amazon欲しい物リストはこちら: https://www.amazon.co.jp/hz/wishlist/ls/CCPOV7C6JTD2

tupleが型としても使えるようになった(表現微妙)

のでbindが簡単に書けるようになった(ただし一つまでしか固定できない。C++のstd::bind1nd/bind2ndよりは良いけどboost::bindよりは悪い。重ねればいくつでもokなはず)。はまった上に一ヶ所を間違えてたまま某所に張ったのははずかしいけど気にしない方向で。


///License: Public Domain
import std.traits,std.typetuple,std.stdio;

template RemoveAt(int i,T,UL...){
static if(i==0)
alias UL RemoveAt;
else
alias TypeTuple!(T,RemoveAt!(i-1,UL)) RemoveAt;
}

static assert(is(RemoveAt!(1,int,bool,short)==TypeTuple!(int,short)));

template bind(alias func,int i){
ReturnType!(func) bind(ParameterTypeTuple!(func)[i] val)
(RemoveAt!(i,ParameterTypeTuple!(func)) tl){
return func(tl[0..i],val,tl[i..$]);
}
class _bind2(T,UL...){
T val;
ReturnType!(func) f(UL ul){
return func(ul[0..i],val,ul[i..$]);
}
}
ReturnType!(func) delegate(RemoveAt!(i,ParameterTypeTuple!(func)))
bind2(ParameterTypeTuple!(func)[i] val){
auto b=new _bind2!(ParameterTypeTuple!(func)[i],
RemoveAt!(i,ParameterTypeTuple!(func)));
b.val=val;
return &b.f;
}
}

char[] test(char[] a,char[] b,char[] c){
return "a:"~a~",b:"~b~",c:"~c;
}

void main(){
writefln(bind!(test,0).bind!("test")("test2","test3"));
auto f=&bind!(test,0).bind!("test");
writefln(f("a","b"));
char[] t="test";
writefln(bind!(test,0).bind2(t)("test2","test3"));
t="aaaa";
writefln(bind!(test,0).bind2(t)("test2","test3"));
auto f2=bind!(test,0).bind2(t);
writefln(f2("a","b"));

auto f3=bind!(test,0).bind2("test");
writefln(f3("a","b"));

writefln(f2("a","b"));
}

ところでstatic foreachまだー?

関数版に対応してみた。


関数版の修正。
functionとdelegateの関係がまだよくわかってないな>俺。
ってかこれ、GC動いたら破綻する気ガス。インスタンスをbind内に配列で保存しといた方がいいかも。
#複数対応するために配列にしてごにょろうとしてるんだけどやっかいなバグに複数引っかかって(ry