Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
import std.stdio;
import std.traits;
auto f(string s) {
return s.length;
}
auto g(string s) {
return 2*s.length;
}
struct S {
auto getClosure() {
return (string s) { return 3*s.length; };
}
}
class X(R, A...) { // три точки значат, что можно это не один тип может быть, а кортеж типов
R delegate(A) g;
A a;
this(R delegate(A) g, A a) {
this.g = g;
this.a = a;
}
R run() { return g(a); }
}
auto newX(F,Args...)( F fnc, Args args )
if( isCallable!F && __traits(compiles, { fnc(args); }) )
// F может быть даже объектом с методом opCall
// с помощью __traits мы проверяем можем ли вызывать эту fnc с такими аргументами
{
return new X!( ReturnType!F, ParameterTypeTuple!F ) // тип объекта всё равно нужно задавать
( (Args a){ return fnc(a); }, args );
// в любом случае создаём делегат
}
void main() {
auto x = newX(&f, "a");
auto y = newX(&g, "ab");
auto s = S();
auto d = s.getClosure();
auto z = newX(d, "abc");
auto Z = [x,y,z];
foreach(t; Z) {
writeln(t.run());
}
}
auto newX(R,Args...)( R delegate(Args) fnc, Args args )
{ return new X!(R,Args)( fnc, args ); }
auto newX(R,Args...)( R function(Args) fnc, Args args )
{ return new X!(R,Args)( (Args a){ return fnc(a); }, args ); }
import std.stdio;
import std.traits;
auto f(string s) {
return s.length;
}
auto g(string s) {
return 2*s.length;
}
struct S {
auto getClosure() {
return (string s) { return 3*s.length; };
}
}
auto apply(F,Args...)( F fnc, Args args )
if( isCallable!F && __traits(compiles,fnc(args)) )
{ return { return fnc(args); }; }
void main() {
auto x = apply(&f, "a");
auto y = apply(&g, "ab");
auto s = S();
auto d = s.getClosure();
auto z = apply(d, "abc");
auto Z = [x,y,z];
foreach(t; Z) {
writeln(t());
}
}
int pause(int x) {
sleep(x);
return 0;
}
int connect(int p) {
auto c = connect_to_server('127.0.0.1', p);
if (c.connected) {
return 0;
} else {
return -1;
}
}
auto tasks = map!run([future(pause, 10), future(connect, 80)]);
writeln("wait some time for results");
sleep(1);
auto result = map!waitResult(tasks);
Compile-time рефлексия D