рд╕рднреА рдХреЛ рд╢реБрдн рджрд┐рди!
рдЖрдЬ рдореИрдВ рдЕрджреНрднреБрдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдбреА рдХреА рдХрд╣рд╛рдиреА рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реВрдВред
рдЕрдкрдиреЗ
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ, рдореИрдВрдиреЗ рдбреА рдореЗрдВ рдмрд╣реБ-рдкреНрд░рддрд┐рдорд╛рди рдФрд░ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереАред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЕрджреНрднреБрдд
рд╡реБрд▓реНрдлрд░рд╛рдо рд▓реЗрдЦ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЬрд┐рд╕рдореЗрдВ рдЙрдиреНрд╣реЛрдВрдиреЗ
рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рдЬрд╛рд░реА рд░рдЦрд╛, рдореИрдВ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
рдЦрд┐рдбрд╝рдХреА рдХреЗ рдмрд╛рд╣рд░ рдЫреБрдЯреНрдЯрд┐рдпрд╛рдВ рд╣реИрдВ, рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рдПрдХ рдЖрд░рд╛рдо рд╣реИ, рдЬрд╢реНрди рдордирд╛рддреЗ рд╣реИрдВ, рдЖрдирдВрдж рдордирд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЛ рднрд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдмреЛрдЭ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЖрдЬ рдореИрдВ рдПрдХ рд╕рд░рд▓ рд▓реЗрдХрд┐рди рдХрдо рд╕реБрдЦрдж рд╡рд┐рд╖рдп рдкрд░ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛: рдСрдкрд░реЗрдЯрд░ рдЕрдзрд┐рднрд╛рд░ред
рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпреЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ trifles рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╕ рдбреА рдСрдкрд░реЗрдЯрд░ рдореЗрдВ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдореИрдВ CTFE (рд╕рдВрдХрд▓рди-рд╕рдордп рдлрд╝рдВрдХреНрд╢рди рдореВрд▓реНрдпрд╛рдВрдХрди) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд┐рд╕ рдкрд░ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереАред рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЙрд╕реЗ рдмрд╣реБрдд рдкреНрд░рд╢рдВрд╕рд╛ рдХреЗ рд▓рд┐рдП, рд╣реИ рдирд╛?
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбреА рдореЗрдВ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд╡рд┐рд╖рдп рдЗрд╕рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдЫреВрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред
рддреЛ, рдХрд┐рд╕рд╕реЗ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ - рдПрдХ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рддреЛ, рдЗрд╕ рд╡рд┐рд╖рдп рдХреА рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рдРрд╕реА рд╣реИрдВ рдХрд┐ рдХрдо рд╢рдмреНрдж рдФрд░ рдЕрдзрд┐рдХ рдХрд╛рдо рд╣реЛрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рдЪрдп рдЫреЛрдЯрд╛ рд╣реЛрдЧрд╛:
D рдореЗрдВ, C ++ рдХреА рддрд░рд╣ рдСрдкрд░реЗрдЯрд░, рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдХреЗ рд▓реЛрдб рд╣реЛрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, C ++ рдФрд░ C # рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рдирд╛рдо рд╣реИрдВред
рд╣рдо рдкрд╣рд▓реЗ рдмрд╣реБрднреБрдЬ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╡рд░реНрдЧ рдХреЛ рдЪреБрдирд╛ рд╣реИред
рддреЛ:
import std.stdio; import std.math; // . struct Complex { private: double re; double im; public: // this(double r = 0, double i = 0) { re = r; im = i; } @property nothrow pure double Re() { return re; } @property nothrow pure double Im() { return im; } @property nothrow pure double Abs() { return sqrt(re ^^ 2 + im ^^ 2); } @property nothrow pure double Arg() { return atan(im/re); } }
рдпрд╣рд╛рдВ рдХрдИ рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛рдПрдВ рдФрд░ рдЙрдирдХреЗ рд░реВрдк рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рдмреАрдЬрдЧрдгрд┐рдд рдХреЗ рдкрд╛рдареНрдпрдХреНрд░рдо рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЙрди рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВред рддреЛ, рд╣рдо рдХрд┐рд╕ рддрд░рд╣ рдХреЗ рдСрдкрд░реЗрд╢рди рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?
рдкрд╣рд▓реЗ, рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрди рдирдВрдмрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдЕрдЪреНрдЫрд╛, рдЕрдЪреНрдЫрд╛, рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓рдХреНрд╖реНрдп, рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдбреА рдореЗрдВ, рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░ opEquals рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдереЛрдбрд╝рд╛ рдЖрдЧреЗ рджреЗрдЦрдирд╛: рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдбреА рдореЗрдВ рд╕рднреА рдСрдкрд░реЗрдЯрд░ рдУрдк рдлрд╝рдВрдХреНрд╢рди рдУрд╡рд░рд▓реЛрдб рдХреЗ рд╕рд╛рде рдУрд╡рд░рд▓реЛрдб рд╣реЛрддреЗ рд╣реИрдВред рдореИрдВ рд▓реЗрдЦ рдореЗрдВ рд╕рднреА рдЕрддрд┐рднрд╛рд░рд┐рдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред
рддреЛ рддреБрд▓рдирд╛:
pure nothrow bool opEquals(Complex v) { return v.re == re && v.im == im; }
рдФрд░ рд╕рдлрд▓рддрд╛ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:
unittest { Complex a, b; assert(a == b); assert(!(a != b));
рд╣рд╛рдВ, D рдХрд╛рдлреА рд╕реНрдорд╛рд░реНрдЯ рд╣реИ рдФрд░ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ a! = B рдПрдХ рд╣реА рдЬреИрд╕рд╛ рд╣реИ! (A == b), рдЗрд╕рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ! =
рдЕрдм opcmp рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реЛрдЧреА:
pure nothrow int opCmp(Complex v) { auto a = Abs; auto va = v.Abs; if(a == va) return 0; else if(a > va) return 1; else return -1; }
рдФрд░ рд╣рдо рдЕрдкрдиреЗ unittest рдХреЗ рдкреВрд░рдХ рд╣реИрдВ:
Complex a, b, c = 1;
рдЕрдм рдореИрдВ рд╕рдордЭрд╛рддрд╛ рд╣реВрдБред рд╣рд╛рдВ, рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕ рдХреЛрдб рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдирд╛ рджрд░реНрдж рд░рд╣рд┐рдд рдерд╛ред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреБрд▓рдирд╛ рдХреЗрд╡рд▓ рдЧрдгрд┐рддреАрдп рд░реВрдк рд╕реЗ рдЧрд▓рдд рд╣реИ - рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдзреЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рджреВрд╕рд░реА рдУрд░, рдореИрдВрдиреЗ> рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓> =, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕реЗрдЯ рдкрд░ рдЖрдВрд╢рд┐рдХ рдЧреИрд░-рд╕рдЦреНрдд рдЖрджреЗрд╢ рдорд╛рдирдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдбреА, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдзреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП> рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрднреА рднреА рднрд╛рд╖рд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдЧрдгрд┐рддред
рдЕрдм, рдмрд╣рд╛рдирд╛ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЕрдм рд╣рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рднрд╛рд╖рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ c = 1. рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдФрд░ рдЬрдм рд╕реЗ рдореИрдВ рдлрд╝реАрд▓реНрдб рдХреЗ рдХреНрд░рдо рдХреЛ {re, im} рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реВрдВрдЧрд╛, рдпрд╣ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдареАрдХ рд╡рд╣реА рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛ рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ - рдкрд╣рд▓рд╛ рдХреНрд╖реЗрддреНрд░ 1 рд╕реМрдВрдкрд╛ рдЬрд╛рдПрдЧрд╛ред
рдмрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдиреЛрдЯрд┐рд╕ рдХрд░реВрдВрдЧрд╛: opCmp рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдПрдХ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЪрд╛рд░ рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддреА рд╣реИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП C ++ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрд╡рд╛рдж рдХреА рдмрд╛рдд рд╣реИред
рдЕрдм рд╣рдореЗрдВ рдЬрдЯрд┐рд▓ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо opAssign рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ:
ref Complex opAssign(Complex v) { re = v.re; im = v.im; return this; }
рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд╕рдорд╛рдирддрд╛, рдЖрджреЗрд╢ рдФрд░ рдХреЙрдкреА рдСрдкрд░реЗрдЯрд░реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛, рдЕрдм рдореИрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдУрд░ рдмрдврд╝реВрдВрдЧрд╛ред рдЖрдЗрдП рд╢реБрд░реБрдЖрдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдбреА рд╣рдореЗрдВ рдПрдХ рд╕реБрдЦрдж рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ: рдСрдкрд░реЗрдЯрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╕рднреА рдПрдХрд╛рддреНрдордХ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: T.opUnary (string op) ();
рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕рдордЭрд╛рдКрдВрдЧрд╛:
ref Complex opUnary(string op)() if (op == "++") { ++re; return this; } ref Complex opUnary(string op)() if (op == "--") { --re; return this; } Complex opUnary(string op)() if (op == "-") { return Complex(-re, -im); } Complex opUnary(string op)() if (op == "+") { return Complex(re, im); } bool opUnary(string op)() if (op == "!") { return !re && !im; }
рдФрд░ рдпрд╣рд╛рдБ рдХрд╛рдо рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
unittest { Complex a, b, c = 1; assert(a == b); assert(!(a != b)); assert(a >= b); assert(c >= b); auto d = ++c; d = c++;
рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдб рдореЗрдВ рдореИрдВрдиреЗ рдЙрдкрд╕рд░реНрдЧ рд╡реГрджреНрдзрд┐ рдФрд░ рдЧрд┐рд░рд╛рд╡рдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ, рдореЗрд░реЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рднрд╛рд╖рд╛ рдЕрдкрдиреЗ рдЖрдк рдЬреБрдбрд╝ рдЧрдИред
рд╕реА ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдо рдбреА рдореЗрдВ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рд╣реИ рдирд╛? рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХреЛрдб рдирдХрд▓ рдХреЗ рдПрдХ рдЕрдХреНрд╖рдореНрдп рдмрд╣реБрдд рд╕реЗ рдиреЛрдЯрд┐рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЬреЛ рд▓реЛрдЧ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рдкрдврд╝рддреЗ рд╣реИрдВ рд╡реЗ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдорд┐рдХреНрд╕рд┐рди рдХреНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдСрдк рд╕рдВрдХрд▓рди рд╕рдордп рдХрд╛ рдПрдХ рддрд░реНрдХ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рдЖрдк рдЗрд╕реЗ рдорд┐рдХреНрд╕рд┐рди рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЪрд▓реЛ рдЗрд╕реЗ рдЖрдЬрдорд╛рдПрдБ?
ref Complex opUnary(string op)() if (op == "++" || op == "--") { mixin(op ~ "re;"); return this; } Complex opUnary(string op)() if (op == "+" || op == "~") { return Complex(mixin(op ~ "re"), mixin(op ~ "im")); }
рдХрд▓рд╛рдИ рдХреА рдПрдХ рдЭрдЯрдХрд╛ рдХреЗ рд╕рд╛рде, рдЪрд╛рд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рджреЛ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИрдВ! рд╣рдордиреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдСрдкрд░реЗрдЯрд░ рдХреЗ рдирд╛рдо рдХреЛ "рдорд┐рдХреНрд╕" рдХрд░рддреЗ рд╣реИрдВред рдХреБрдЫ рднреА рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ!
рдЦреИрд░, рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рд╣рдо рдЕрдкрдиреЗ рдЬрдЯрд┐рд▓ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ - рдЕрдм рд╣рдореЗрдВ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рд╕рднреА рдиреЗ рд╢рд╛рдпрдж рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реИ, рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдПрдХ рд╣реА рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдПрдХ: рд╡реЗ рд╕рднреА рдПрдХ рд╣реА рдХрд╛рд░реНрдп T.opBinary (string op) (V a) рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред
рдореИрдВ рд▓реЗрдЦ рдХреЛ рдирд╣реАрдВ рдмрдврд╝рд╛рдКрдВрдЧрд╛ рдФрд░ рддреБрд░рдВрдд рдорд┐рдХреНрд╕рдЪрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реВрдВрдЧрд╛:
Complex opBinary(string op)(Complex v) if (op == "-" || op == "+") { return Complex(mixin("v.re" ~ op ~ "re"), mixin("v.im" ~ op ~ "im")); } Complex opBinary(string op)(Complex v) if (op == "*") { return Complex(re*v.re - im*v.im, im*v.re + re*v.im); } Complex opBinary(string op)(Complex v) if (op == "/") { auto r = v.Abs; return Complex((re*v.re + im*v.im) / r, (im*v.re - re*v.im) / r); } // , Complex opBinary(string op)(int v) if (op == "^^") { Complex r = Complex(re, im), t = r; // opAssign foreach(i; 1..v) r = r * t; return r; }
рдФрд░ рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг (рдпрджреНрдпрдкрд┐ рд╕реНрдкрд╖реНрдЯ) рдЙрдкрдпреЛрдЧ рдХрд╛ рд╣реИ:
unittest { Complex a, b, c = 1; a = 1; b = Complex(0, 1); d = a + b; auto k = a * b; auto p = c ^^ 3; assert(d == Complex(1, 1) && k == Complex(0, 1)); assert(p == Complex(27, 0)); }
рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдСрдкрд░реЗрдЯрд░%, >>, <<, >>>, &,;, ^, рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдЕрд░реНрде рдХреЗ рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдХреЗ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдереЛрдбрд╝рд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдФрд░ рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреА рддрдХрдиреАрдХ рдореЗрдВ рдХреБрдЫ рдирдпрд╛ рдирд╣реАрдВ рд▓рд╛рддрд╛ рд╣реИред
рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╣реИ, рдореИрдВрдиреЗ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рддрдХ рдХреЗ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдХреА рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЕрдзрд┐рдХрддрд╛ рд╣реИред рд╕реНрдерд┐рддрд┐ рдХреЛ рдереЛрдбрд╝рд╛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ * = рдСрдкрд░реЗрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХрд┐ рдЙрди рд╕рднреА рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЗрд╕реЗ opOpAssign (рд╣рд╛рдБ, рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рддрдирд╛рддрдиреА) рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
ref Complex opOpAssign(string op)(Complex v) if (op == "-" || op == "+" || op == "*" || op == "/") { auto t = Complex(re, im); mixin("auto r = t" ~ op ~ "v;"); re = r.re; im = r.im; return this; } Complex opBinary(string op)(int v) if (op == "^^") { Complex r = Complex(re, im), t = r; // opAssign foreach(i; 1..v) r *= t; return r; }
рдпрд╣ рдХреЗрд╡рд▓ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдЬрдм рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕ рдЪрд░ рдмрд╛рдИрдВ рддрд░рдл рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рджрд╛рдИрдВ рдУрд░ рдЗрд╕ рддрд░рд╣ рд╣реИ:
Complex a = 1; Complex b = 5 * a;
рдореИрдВ рдЗрд╕ рдХреЛрдб рдХрд╛ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдХреГрдкрдпрд╛! рд╕рднреА рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖, рджрд╛рд╣рд┐рдиреЗ рд╣рд╛рде рд╡рд╛рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдХрдореНрдпреВрдЯреЗрдЯрд┐рд╡рд┐рдЯреА рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИ:
Complex opBinaryRight(string op)(double v) if(op == "+" || op == "*") { return Complex.opBinary!op(v); }
рдФрд░ рдЕрдЧрд░ рдСрдкрд░реЗрд╢рди рд╕рд░рд╛рд╣рдиреАрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
Complex opBinaryRight(string op)(double v) if(op == "-" || op == "/") { return Complex.opBinary!op(Complex(v,0)); }
рд╡рд╣ рд╕рдм, рдЕрдВрдХрдЧрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЧреЗ рдЖрдк рд╣рдорд╛рд░реЗ рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╡реИрдз рд╣реИрдВред рдЖрдЗрдП рдПрдХ рд░реВрдкрд╛рдВрддрд░рдг рдСрдкрд░реЗрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
double opCast(T)(int v) if (is(T == double)) { if(im != 0) throw new Exception("Not real!"); return re; }
рд░реВрдкрд╛рдВрддрд░рдг рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдЕрдЪреНрдЫрд╛ рдмрд┐рдВрджреБ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдЕрд░реНрдерд╛рддреН, "рдЕрдЧрд░ (expr)" рдФрд░ "expr? a: b? "рдХреНрд░рдорд╢рдГ" if (рдХрд╛рд╕реНрдЯ (bool) expr) "рдФрд░" cast (bool) expr рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд░рдорд╢рдГ рд░реВрдкрд╛рдВрддрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред a: b; тАЭред рдЗрд╕рдХрд╛ рд▓рд╛рдн рд▓реЗрдВ:
double opCast(T)(int v) if (is(T == bool)) { return re == 0 && im == 0; }
рдЕрдм рд╣рдо рдЬреИрд╕реЗ рднрд╛рд╡ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
Complex a = 0; if(!a) return false;
рдпрд╣ рдЕрдиреБрдХреНрд░рдордг рдСрдкрд░реЗрд╢рди рдХреЗ рдЕрдзрд┐рднрд╛рд░ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╣рдорд╛рд░реЗ рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕ рд╡рд░реНрдЧ рдкрд░ рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд▓рдЧреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рд╣реИ рдирд╛?
рдЕрдиреБрдХреНрд░рдордг рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ред рд╡реЗ рдХреНрд░рдорд╢рдГ opIndex рдФрд░ opIndexAssign рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдП рдЧрдП рд╣реИрдВред рдЖрдЗрдП рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
double opIndex(size_t a) { switch(a) { case 1: return Re; case 2: return Im; default: throw new Exception("Ur doin it wrong."); } } void opIndexAssign(double v, size_t a) { switch(a) { case 1: re = v; break; case 2: im = v; break; default: throw new Exception("Ur doin it wrong."); } } // , , , - : a[1,2] = 0 // re = 0, im = 0 void opIndexAssign(double v, size_t a, size_t b) { switch(a) { case 1: re = v; break; case 2: im = v; break; default: throw new Exception("Ur doin it wrong."); } switch(b) { case 1: re = v; break; case 2: im = v; break; default: throw new Exception("Ur doin it wrong."); } }
рд╕рдм рдХреБрдЫ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЕрдЪрд╛рдирдХ рдРрд╕рд╛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛:
Complex a = 0
C ++ рдореЗрдВ, opIndex Ref рд░реЗрдлрд░реА рд╣реИ, рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ? рдФрд░ рдпрд╣рд╛рдБ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╕рдВрдЪрд╛рд▓рдХ рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╣реИ: opIndexAssignUnary (string op) (v, i)
void opIndexAssignUnary(string op)(double v, size_t a) { switch(a) { case 1: mixin("re " ~ op ~ "= v"); break; case 2: mixin("im " ~ op ~ "= v"); break; default: throw new Exception("Ur doin it wrong."); } }
рдЖрдЗрдП рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:
unittest { ... assert(p == Complex(27, 0)); p[0] /= 3; assert(p == Complex(9, 0)); }
рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░, рдбреА рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ "рд╕реНрд▓рд╛рдЗрд╕" рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдПрдХ [n..k] (рдХреЗ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ) рдХреЗ рд╕рд╛рде рдордирдорд╛рдирд╛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ, рдЬрд╣рд╛рдВ n, рдХрд╢реНрдореАрд░ рдХрд┐рд╕реА рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ рдЬрд┐рд╕рдореЗрдВ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдг $ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ рдХрд╛ рдкреНрд░рддреАрдХ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдбреА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ: opSlice, рдЬреЛ рд░реЗрдВрдЬ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ opDollar, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрд▓рд╛рдЗрд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реА рддрд░рд╣, рдЕрдЧрд░ opSilceAssign рдФрд░ opSliceOpAssign рдСрдкрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЗрдВрдбреЗрдХреНрд╕рд░реНрд╕ рдХреЗ рдПрдирд╛рд▓реЙрдЧреНрд╕ рдХреЗ рд╕рдорд╛рди рдЕрд░реНрде рд╣реИред
рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рд▓рд╛рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдирдП рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЧреНрд░рд╛рдЙрдВрдб рдФрд░ рдХреЛрдб рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд▓реЗрдЦ рдкрд╣рд▓реЗ рд╣реА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЪреБрдХрд╛ рд╣реИ, рдЬрд▓реНрдж рд╣реА рдирд╣реАрдВ рд╣реЛрдЧрд╛, рддреЛ рдЪрд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред
рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдзреБрдирд┐рдХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ (рд╕реА ++ рдореЗрдВ рднреА рдирдХрд▓ рд╣реИ) рдПрдХ рдлреЙрд░реНрдЪреНрдпреВрдирд░ рдСрдкрд░реЗрдЯрд░ рд╣реИ - рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдПрдирд╛рд▓реЙрдЧред C ++ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрдЯреНрд░реЗрдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред C # рдореЗрдВ рд╕рдорд╛рдиред рдбреА рдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдЕрд╡рд╕рд░ рд╣реИ: рдПрдХ рд╕рд░рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:
{ @property bool empty(); // - iterator != end() @property ref T front(); // - begin() void popFront(); // - next() iterator++ }
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдкрд░реЛрдХреНрдд рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдбреА рдПрдХрдорд╛рддреНрд░ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреЗрдбрд╝ рдХреЗ рд▓рд┐рдП, рддреЛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рд░рдХреНрддрд╕реНрд░рд╛рд╡ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдбреА рдмрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ!
рдпрд╣рд╛рдВ рдЖрдк рдлрд╝реЙрд░реЗрд╕реНрдЯ рд▓реВрдк рдХреЗ рд╢рд░реАрд░ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рди рдХреЗрд╡рд▓ рдПрдХ рдкреЗрдбрд╝ рдХреЗ рд▓рд┐рдП рдкреЙрдкрдлреНрд░реЙрд╕реНрдЯ () рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреИрдореНрдмреЛрд░рд┐рди рдХреЗ рд╕рд╛рде рдиреГрддреНрдп рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХреА рднрд╛рд╡рдирд╛ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред
рд╕рдм рдХреБрдЫ рдХреИрд╕рд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ? рдФрд░ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдлрд╝реЙрд░реЗрд╕реНрдЯ рдмреЙрдбреА рдХреЛ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдирдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЧрд╣ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рднрд▓реЗ рд╣реА рдореИрдВ рдЬреЛрдЦрд┐рдо рд╕реЗ рдЧреБрдЬрд░ рд░рд╣рд╛ рд╣реЛ, рдореБрдЭреЗ рдЦреЗрдж рд╣реИ, рдПрдХ рд╡рд┐рдХреГрдд, рдореИрдВ рдЕрднреА рднреА рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдЕрдкрдиреЗ рдЬрдЯрд┐рд▓ рдирдВрдмрд░реЛрдВ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВред рдмрд╕ рдЗрд╕реЗ рдШрд░ рдкрд░ рджреЛрд╣рд░рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рди рдХрд░реЗрдВ!
int opApply(int delegate(ref double) f) { auto res = f(re); if(res) return res; res = f(im); return res ? res : 0; }
рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖ?
auto p = Complex(10,5); foreach(i; p) writeln(i);
рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:
10
5
рдорд╣рд╛рди, рд╕рд╣реА? рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдк рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдПрдХ рдкреЗрдбрд╝ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдЕрд╡рд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рдЗрдЪреНрдЫрд┐рдд рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣реЗ рд╣реИрдВ ...
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдЕрд╡рд╕рд░ рд╣реИ? рдФрд░ рдирд╣реАрдВ! рдЖрдЧреЗ рдмреЗрд╣рддрд░ рд╣реИред
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреБрд╕реНрддрдХ рд╕реЗ рд▓рдЧрднрдЧ рд╢рдмреНрджрд╢рдГ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛ - рдореИрдВрдиреЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖ рд╕рдХрд╛ред
рдкрд╣рд▓реЗ рд▓реЗрдЦ рд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╡рд┐рд░рд╛рд╕рдд рдпрд╛рдж рд╣реИ? рддреЛ рдЕрдм рдПрдХ рдкреВрд░реНрдг, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╡рд┐рд░рд╛рд╕рдд рд╣реЛрдЧрд╛ред
рдФрд░ рдЗрд╕реЗ рдПрдХ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛ рдореЗрдВ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдП? рдбреЙрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдХреЗ! рд╣рд╛рдВ, рд╣рд╛рдВ, рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд D, рдпрд╣ рд╕рдВрднрд╡ рд╣реИред
рдФрд░ рд╡реЗрд░рд┐рдПрдВрдЯ рдкреНрд░рдХрд╛рд░ рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рддреЛ:
import std.variant; // , . alias Variant delegate(DynamicObj self, Variant[]args...) DynamicMethod; // - class DynamicObj { private Variant[string] fields; private DynamicMethod[string] methods; void AddMethod(string name, DynamicMethod f) { methods[name] = f; } void RemoveMethod(string name) { methods.remove(name); } // Variant opDispatch(string name, Args)(Args args...) { Variant[] as = new Variant[args.length]; foreach(i, arg; args) as[i] = Variant(arg); return methods[name](this, args); } Variant opDispatch(string name)() { return fields[name]; } }
рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
unittest { auto obj = new Dynamic; DynMethod ff = cast(DynMethod) (Dynamic, Variant[]) { writeln("Hello, world!"); return Variant(); }; obj.AddMethod("sayHello", ff); obj.sayHello(); }
рдЖрдЙрдЯрдкреБрдЯ: рдирдорд╕реНрддреЗ, рджреБрдирд┐рдпрд╛!
рддреЛ, рдпрд╣ рдЖрдЬ рдХреЗ рд▓рд┐рдП рд╣реИред рдпрд╣ рдПрдХ рдорд╣рд╛рди рд▓реЗрдЦ рдирд┐рдХрд▓рд╛, рдЬрд┐рд╕рдореЗрдВ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдХреЛрдИ рдЬрдЯрд┐рд▓ рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИред рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░реЛрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд░рд┐рдЪрдп рдореЗрдВ рдХрд╣рд╛ рдерд╛, рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдЪреАрдиреА рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдкреЗрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдбреА рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рдФрд░ рдкрдврд╝рдирд╛ рдЕрдзрд┐рдХ рд╕реБрдЦрдж рдмрдирд╛рддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореБрдЭреЗ рдбреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рд╣реИ - рднрд╛рд╖рд╛ рдХреЛ рдЗрд╕ рдкрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдЦрдж рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!