import std.stdio;
 
class carry(TResult, TParams...) {
	public this(TResult delegate(TParams) _f) {
		f = _f;
	}
	public auto opCall(TParams[0] para) {
		static if (TParams.length > 1) {
			return new carry!(TResult, TParams[1 .. $])( (TParams[1 .. $] args) { return f(para, args); } );
		} else {
			return f(para);
		}
	} 
	public TResult delegate(TParams) f;
}
 
void main() {
	auto f = new carry!(int, int, int, int, int)( (int a, int b, int c, int d) { return a+b+c+d; } );
	writeln(f(1)(2)(3)(4));
}
				aW1wb3J0IHN0ZC5zdGRpbzsKCmNsYXNzIGNhcnJ5KFRSZXN1bHQsIFRQYXJhbXMuLi4pIHsKCXB1YmxpYyB0aGlzKFRSZXN1bHQgZGVsZWdhdGUoVFBhcmFtcykgX2YpIHsKCQlmID0gX2Y7Cgl9CglwdWJsaWMgYXV0byBvcENhbGwoVFBhcmFtc1swXSBwYXJhKSB7CgkJc3RhdGljIGlmIChUUGFyYW1zLmxlbmd0aCA+IDEpIHsKCQkJcmV0dXJuIG5ldyBjYXJyeSEoVFJlc3VsdCwgVFBhcmFtc1sxIC4uICRdKSggKFRQYXJhbXNbMSAuLiAkXSBhcmdzKSB7IHJldHVybiBmKHBhcmEsIGFyZ3MpOyB9ICk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIGYocGFyYSk7CgkJfQoJfSAKCXB1YmxpYyBUUmVzdWx0IGRlbGVnYXRlKFRQYXJhbXMpIGY7Cn0KCnZvaWQgbWFpbigpIHsKCWF1dG8gZiA9IG5ldyBjYXJyeSEoaW50LCBpbnQsIGludCwgaW50LCBpbnQpKCAoaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQpIHsgcmV0dXJuIGErYitjK2Q7IH0gKTsKCXdyaXRlbG4oZigxKSgyKSgzKSg0KSk7Cn0=