рдирдорд╕реНрддреЗ!
рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, рд╣рдорд╛рд░рд╛ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдХрд┐ рд╣рд░ рд╢реБрд░реБрдЖрддрдХрд░реНрддрд╛ рдХреЛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдХреА рдЧрдгрдирд╛ рдХреА рдЧрдИ рдереАред рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рдХрдард┐рди рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣рд╛рдиреБрднреВрддрд┐ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдмреБрдирд┐рдпрд╛рджреА рдмреАрдЬреАрдп рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛, рдЬреИрд╕реЗ рдХрд┐ рднреЗрджрднрд╛рд╡, рд╕рд░рд▓реАрдХрд░рдг рдФрд░ рдЧрдгрдирд╛ рдХреА рдЧрддрд┐ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди рдЬреИрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВред
рдХрдо рдкрд╛рдиреА! рд▓реЗрдЦ рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ?рдпрд╣ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рддрд╣реА рд╣реЛрдЧрд╛, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛, рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди, рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рд╡реНрдпреБрддреНрдкрдиреНрди, рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдПрдХ рд╕рдореАрдХрд░рдг рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрднрд┐рдиреНрди, LaTeX рдкреНрд░рд╛рд░реВрдк рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛, рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛, рд╕рдВрдХрд▓рди рдХрд╛рд░реНрдпреЛрдВ, рд╕рд░рд▓реАрдХрд░рдг, рд╡рд┐рд╕реНрддрд╛рд░ рдХреЛрд╖реНрдардХ, рдФрд░ рдмреНрд▓рд╛ рдмреНрд▓рд╛ рдмреНрд▓рд╛ред рд╢рд╛рдпрдж рдПрдХ рд▓реЗрдЦ рдореЗрдВ рдирд╣реАрдВред
рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рддрддреНрдХрд╛рд▓ рдХреБрдЫ рдХреНрд▓реЛрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдПрдХ рд▓рд┐рдВрдХ ред рд╣рдо рдирдП рд╕рд╛рд▓ рд╕реЗ рд╢реЗрд╖ рдХреБрдХреАрдЬрд╝ рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рдЪрд▓рд╛рдИ рд╣реИ!
рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣реИ?рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЗрдЦ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЬреЛ рд▓реЛрдЧ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡реА рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рднреА рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдорд┐рд▓реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ рддрд╛рдХрд┐ рдЗрд╕реЗ рдмрд┐рдирд╛ C # рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдкрдврд╝реЗ рдЬрд╛ рд╕рдХреЗред
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рднрд╛
рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреНрдпрд╛ рд╣реИ?
рдЬрдм рдореИрдВ рдЫреЛрдЯрд╛ рдерд╛ ...рдлрд┐рд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореИрдВ рдПрдХ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╡рд╣ рдХреНрдпрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдЪрд╛рд░ рдмреБрдирд┐рдпрд╛рджреА рд╕рдВрдЪрд╛рд▓рди, рдФрд░ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХред рдЗрд╕рд▓рд┐рдП, рдореЗрд░рд╛ рдХрд╛рд░реНрдп рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдерд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "1 + (3/4 - (5 + 3 * 1))"ред рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдкрд╕рдВрджреАрджрд╛ рдбреЙрд▓реНрдлрд╝рд┐рди рд▓рд┐рдпрд╛, рдФрд░ рдПрдХ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦрд╛, рдЬреЛ рдкрд╣рд▓реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЛрд╖реНрдардХ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛, рдФрд░ рдлрд┐рд░ рдПрдХ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдХреЛрд╖реНрдардХ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛, рдФрд░ рдХреЛрд╖реНрдардХ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ред рдореВрд▓ рд░реВрдк рд╕реЗ, рдореЗрд░реЗ рд▓рд┐рдП рдЙрд╕ рд╕рдордп рдХрд╛рдлреА рдХрд╛рдо рдХрд╛ рддрд░реАрдХрд╛ рдерд╛ред
рдмреЗрд╢рдХ, рдпрд╣ рдПрдХ рдкрдВрдХреНрддрд┐ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдПрдХ рдЧрдгрд┐рддреАрдп рд╕реВрддреНрд░ рдпрд╛ рддреЛ рдПрдХ рдкреЗрдбрд╝ рд╣реИ рдпрд╛ рдПрдХ рд╕реНрдЯреИрдХ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рд╣рдо рдкрд╣рд▓реЗ рдкрд░ рд░реЛрдХрддреЗ рд╣реИрдВред рдЕрд░реНрдерд╛рддреН, рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб, рдЗрд╕ рдкреЗрдбрд╝ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб, рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди, рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдпрд╛ рд╕реНрдерд┐рд░ рд╣реИред

рдПрдХ рдСрдкрд░реЗрд╢рди рдпрд╛ рддреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдПрдХ рдСрдкрд░реЗрдЯрд░ рд╣реИ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд▓рдЧрднрдЧ рдПрдХ рд╣реА рдмрд╛рдд рд╣реИред рдЙрд╕рдХреЗ рдмрдЪреНрдЪреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рдСрдкрд░реЗрдЯрд░) рдХреЗ рддрд░реНрдХ рд╣реИрдВред
рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рд╢реНрд░реЗрдгреА рдкрджрд╛рдиреБрдХреНрд░рдо
рдмреЗрд╢рдХ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рд╕реА рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкреЗрдбрд╝ рдореЗрдВ рдХреЗрд╡рд▓ рдиреЛрдбреНрд╕ рдФрд░ рдкрддреНрддреЗ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдЕрд▓рдЧ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЗрди "рдЪреАрдЬреЛрдВ" - рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдмреБрд▓рд╛рддрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП, рдЙрдЪреНрдЪ рд╡рд░реНрдЧ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдЗрдХрд╛рдИ рд╣реЛрдЧрд╛ред
рд╕рд╛рд░?рдЬреИрд╕рд╛ рдХрд┐ рд╣рд░ рдХреЛрдИ рдмреБрдирд┐рдпрд╛рджреА рднрд╛рд╖рд╛ рд╕реАрдЦрдиреЗ рд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИ, рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдУрд░ рдХреБрдЫ рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдУрд░ рдЖрдкрдХреЛ рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рддрд░реНрдХ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБ рдирд╣реАрдВ рдмрдирд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдФрд░ рдЪрд╛рд░ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рд╡рд░реНрдЧ рднреА рд╣реЛрдВрдЧреЗ: рдирдВрдмрд░рдЗрдВрдЯреАрдЯрд┐рдЯреА, рд╡реИрд░рд┐рдПрдмрд▓ рдПрдиреАрдЯрд┐рдЯреА, рдСрдкрд░реЗрдЯрд░рдПрдЯреЗрдВрдЯрд┐рдЯреА, рдлрдВрдХреНрд╢рдирдПрдВрдЯрд┐рдЯреАред
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕реЗ рдХрд░реЗрдВ?
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдХреЛрдб рдореЗрдВ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ, рдЕрд░реНрдерд╛рддред
var x = new VariableEntity("x"); var expr = x * x + 3 * x + 12;
рдпрджрд┐ рдЖрдк рдПрдХ рдЦрд╛рд▓реА рд╡рд░реНрдЧ VariableEntity рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдРрд╕рд╛ рдХреЛрдб рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрдЧрд╛, рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЧреБрдгрд╛ рдФрд░ рдпреЛрдЧ рдХрд░рдирд╛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред
рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░реНрд╕
рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рд╖рд╛рдУрдВ рдХреА рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдФрд░ рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛, рдЬреЛ рдЖрдкрдХреЛ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдпрд╣ рднрд╛рд╖рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, C # рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
public static YourClass operator +(YourClass a, YourClass b) { return new YourClass(a.ToString() + b.ToString()); }
C # рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВрд╢рд▓рдЬрдо
рдпрд╣рд╛рдБ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛
рд╣реИ ред
(рдЧреИрд░) рд╕реНрдкрд╖реНрдЯ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ
рд╕рдВрдХрд▓рд┐рдд рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЬреИрд╕реЗ рдХрд┐ C #, рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬ рдЖрдорддреМрд░ рдкрд░ рдореМрдЬреВрдж рд╣реЛрддреА рд╣реИ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдмрд┐рдирд╛ myvar.ToAnotherType () рдХреЗ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдЖрдкрдХреЛ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд▓рд┐рдЦрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛
NumberEntity myvar = 3;
рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рдмрдЬрд╛рдп
NumberEntity myvar = new NumberEntity(3);
C # рдореЗрдВ рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдкрд░ рдЕрдзрд┐рдХрдЗрд╕ рд▓рд╛рдЗрди рдкрд░ рд╢рд▓рдЬрдо рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдирд┐рд▓рдВрдмрди
рдЗрдХрд╛рдИ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдмрдЪреНрдЪреЗ рдХрд╛ рдХреНрд╖реЗрддреНрд░ рд╣реИ - рдпрд╣ рдЗрдХрд╛рдИ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдЬреЛ рдЗрд╕ рдЗрдХрд╛рдИ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рд╣реИрдВред
рд╡рд┐рдЪрд╛рд░реЛрдВрд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдХреЗрд╡рд▓ рджреЛ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдмрдЪреНрдЪреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: OperatorEntity рдФрд░ FunctionEntityред рдпрд╣реА рд╣реИ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА NodeEntity рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрди рджреЛрдиреЛрдВ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ LeafEntity рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рд╕реЗ VariableEntity рдФрд░ NumberEntity рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЬрдм рд╣рдо рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдирдИ рдЗрдХрд╛рдИ рдмрдирд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЙрд╕рдореЗрдВ рдЙрди рдмрдЪреНрдЪреЛрдВ рдХреЛ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдирд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдСрдкрд░реЗрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рд░рд╛рд╢рд┐ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдП:
public static Entity operator +(Entity a, Entity b){ var res = new OperatorEntity("+"); res.Children.Add(a); res.Children.Add(b); return res; }
рдпрд╣реА рд╣реИ, рдЕрдм рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрдХрд╛рдИ x рдФрд░ рдЗрдХрд╛рдИ 3 рд╣реИ, рддреЛ x + 3 рджреЛ рдмрдЪреНрдЪреЛрдВ рдХреЗ рд╕рд╛рде рдпреЛрдЧ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд╕рд╛рд░ рд▓реМрдЯрд╛рдПрдЧрд╛: 3 рдФрд░ xред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕рд░рд▓ рд╣реИ рдФрд░ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЙрддрдирд╛ рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ:
public Entity Sin(Entity a) { var res = new FunctionEntity("sin"); res.Children.Add(a); return res; }
рд╢рд▓рдЬрдо рдореЗрдВ рд▓рдЯрдХрдирд╛
рдпрд╣рд╛рдВ рд▓рд╛рдЧреВ рд╣реЛрддрд╛
рд╣реИ ред
рдареАрдХ рд╣реИ, рд╣рдордиреЗ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЯреНрд░реА рдмрдирд╛рдпрд╛ред
рдЪрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрдХрд╛рдИ рд╣реИ - рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕реНрд╡рдпрдВ рдПрдХ рдЪрд░ рд╣реИ, рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рд╣рдо рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдмрдЪреНрдЪреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВред
рдпрд╣ рд╡рд┐рд╢рд╛рд▓ 48-рд▓рд╛рдЗрди рдлрд╝рд╛рдЗрд▓ рдРрд╕реЗ рдЬрдЯрд┐рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИред
рдорд╛рди рдЧрдгрдирд╛
рджрд░рдЕрд╕рд▓, рдпрд╣ рд╕рдм рдХрд┐рд╕ рд▓рд┐рдП рд╣реИред рдпрд╣рд╛рдБ рд╣рдо Entity рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВ
public Entity Eval() { if (IsLeaf) { return this; } else return MathFunctions.InvokeEval(Name, Children); }
рдкрддреНрддреА рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдХреА рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХрд╕реНрдЯрдо рдЧрдгрдирд╛ рд╣реИред рдлрд┐рд░ рд╕реЗ, рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛:
public static Entity Eval(List<Entity> args) { MathFunctions.AssertArgs(args.Count, 1); var r = args[0].Eval(); if (r is NumberEntity) return new NumberEntity(Number.Sin((r as NumberEntity).Value)); else return r.Sin(); }
рдпрджрд┐ рддрд░реНрдХ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВрдЧреЗ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдерд╛ред
рд╕рдВрдЦреНрдпрд╛?
рдпрд╣ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЗрдХрд╛рдИ рд╣реИ, рд╕рдВрдЦреНрдпрд╛ред рдЙрд╕ рдкрд░ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрд╢рди рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдЬрдЯрд┐рд▓ рд╣реИред рдЙрд╕рдХреЗ рдкрд╛рд╕ рдкрд╛рдк, рдХреЙрд╕, рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЬреИрд╕реЗ рдСрдкрд░реЗрд╢рди рднреА рд╣реИрдВред
рдпрджрд┐ рд░реБрдЪрд┐ рд╣реИ, рддреЛ рд╕рдВрдЦреНрдпрд╛
рдпрд╣рд╛рдБ рд╡рд░реНрдгрд┐рдд
рд╣реИ ред
рдпреМрдЧрд┐рдХ
рдХреЛрдИ рднреА рд╡реНрдпреБрддреНрдкрдиреНрди рдХреА рдЧрдгрдирд╛ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рд╣реА рдорд╛рдпрдиреЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ:
public double Derivative(Func<double, double> f, double x) => (f(x + 1.0e-5) - f(x)) * 1.0e+5;
рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рдо рдПрдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рд╡реНрдпреБрддреНрдкрдиреНрди рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЪреВрдБрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡реГрдХреНрд╖ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХреЛ рд╡рд┐рднреЗрджрди рдирд┐рдпрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рд░рд╛рд╢рд┐ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рд╣реИ:
public static Entity Derive(List<Entity> args, VariableEntity variable) { MathFunctions.AssertArgs(args.Count, 2); var a = args[0]; var b = args[1]; return a.Derive(variable) + b.Derive(variable); }
рд▓реЗрдХрд┐рди рдХрд╛рдо
public static Entity Derive(List<Entity> args, VariableEntity variable) { MathFunctions.AssertArgs(args.Count, 2); var a = args[0]; var b = args[1]; return a.Derive(variable) * b + b.Derive(variable) * a; }
рдФрд░ рдпрд╣рд╛рдБ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ:
public Entity Derive(VariableEntity x) { if (IsLeaf) { if (this is VariableEntity && this.Name == x.Name) return new NumberEntity(1); else return new NumberEntity(0); } else return MathFunctions.InvokeDerive(Name, Children, x); }
рдпрд╣ рдЗрдХрд╛рдИ рд╡рд┐рдзрд┐ рд╣реИред рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдкрддреНрддреА рдХреЗ рдХреЗрд╡рд▓ рджреЛ рд░рд╛рдЬреНрдп рд╣реИрдВ - рдпрд╛ рддреЛ рдпрд╣ рдПрдХ рдЪрд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдо рдЕрдВрддрд░ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЗрд╕рдХрд╛ рд╡реНрдпреБрддреНрдкрдиреНрди 1 рд╣реИ, рдпрд╛ рдпрд╣ рдПрдХ рд╕реНрдерд┐рд░ (рд╕рдВрдЦреНрдпрд╛ рдпрд╛ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп) рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рд╡реНрдпреБрддреНрдкрдиреНрди 0 рд╣реИ, рдпрд╛ рдПрдХ рдиреЛрдб рд╣реИ, рдлрд┐рд░ рдирд╛рдо рд╕реЗ рдПрдХ рд╕рдВрджрд░реНрдн рд╣реИ (InvokeDerive) рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╡рд╛рдВрдЫрд┐рдд рдПрдХ рд╕реНрдерд┐рдд рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпреЛрдЧ рдпрд╛ рд╕рд╛рдЗрди))ред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ рдбрд╛рдИ / рдбреАрдПрдХреНрд╕ рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рдпрд╣рд╛рдВ рдирд╣реАрдВ рдЫреЛрдбрд╝рддрд╛ рдФрд░ рддреБрд░рдВрдд рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЬрд┐рд╕ рд╡реЗрд░рд┐рдПрдмрд▓ рд╕реЗ рд╣рдо рдЕрдВрддрд░ рдХрд░рддреЗ рд╣реИрдВ рдЙрд╕рдХрд╛ рд╡реНрдпреБрддреНрдкрдиреНрди 0. рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ
рдпрд╣ рдЕрд▓рдЧ рддрд░рд╣
рд╕реЗ рдХрд┐рдпрд╛
рдЬрд╛рддрд╛ рд╣реИред
рд╕рднреА рднреЗрджрднрд╛рд╡
рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╕рд░рд▓реАрдХрд░рдгред рдкреИрдЯрд░реНрди
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╕рд░рд▓реАрдХрд░рдг рдЖрдорддреМрд░ рдкрд░ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рддреБрдЪреНрдЫ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреМрди рд╕реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рд░рд▓ рд╣реИ:
рдпрд╛
? рд▓реЗрдХрд┐рди рд╣рдо рдХреБрдЫ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рдо рдЙрди рдирд┐рдпрдореЛрдВ рдХреЛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред
рдкреНрд░рддреНрдпреЗрдХ рдПрд╡рд▓ рдореЗрдВ рдпрд╣ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпреЛрдЧ рд╣реИ, рдФрд░ рдмрдЪреНрдЪреЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЪрд╛рд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╣рд▓ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЕрдЧрд░ рдХреБрдЫ рд╕рдорд╛рди рд╣реИ, рддреЛ рд╣рдо рдХрд╛рд░рдХ рдирд┐рдХрд╛рд▓ рд▓реЗрдВрдЧреЗ ... рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореИрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред рдЗрд╕рд▓рд┐рдП, рдЖрдк рдирд┐рдпрдореЛрдВ рдФрд░ рдкреИрдЯрд░реНрди рдХреА рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ рд╣рдо рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдХреБрдЫ рдЗрд╕ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреА рддрд░рд╣:
{ any1 / (any2 / any3) -> any1 * any3 / any2 }, { const1 * var1 + const2 * var1 -> (const1 + const2) * var1 }, { any1 + any1 * any2 -> any1 * (Num(1) + any2) },
рдпрд╣рд╛рдВ рдПрдХ рдкреЗрдбрд╝ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рдмрдЯреНрд░реА рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ (рд╣рд░реЗ рд░рдВрдЧ рдореЗрдВ рдкрд░рд┐рдЪрд╛рд▓рд┐рдд) рдЬреЛ рдХрд┐рд╕реА рднреА рдкреИрдЯрд░реНрди + 1 (const1 * any1 (рдХрд┐рд╕реА рднреА рдкрд╛рдпрд╛ рдЧрдпрд╛ рдирд╛рд░рдВрдЧреА рдореЗрдВ рдкрд░рд┐рдХреНрд░рдорд╛ рдХрд░рддрд╛ рд╣реИ) рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрднреА-рдХрднреА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдПрдХ рд╣реА рдЗрдХрд╛рдИ рдХреЛ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ x + a * x рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ x рдХреЛ рд╡рд╣рд╛рдВ рдФрд░ рд╡рд╣рд╛рдВ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ x + a * y рдЕрдм рдХрдо рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рди рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдВрдЪрддреА рд╣реИ рдХрд┐ рдкреЗрдбрд╝ рдкреИрдЯрд░реНрди рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рднреА
- рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рдорд╛рди рдПрдВрдЯрд┐рдЯреА рдкреИрдЯрд░реНрди рд╕рдорд╛рди рдПрдВрдЯрд┐рдЯреА рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
- рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ, рдлрд┐рд░ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
internal Dictionary<int, Entity> EqFits(Entity tree) { var res = new Dictionary<int, Entity>(); if (!tree.PatternMakeMatch(this, res)) return null; else return res; }
рдФрд░ рдкреЗрдбрд╝ рдореЗрдВред PaternMakeMatch, рд╣рдо рдХреБрдВрдЬреА рдФрд░ рдЙрдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рд╕реНрд╡рдпрдВ рдкреНрд░рддрд┐рд░реВрдкреЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
static readonly Pattern any1 = new Pattern(100, PatType.COMMON); static readonly Pattern any2 = new Pattern(101, PatType.COMMON); static readonly Pattern const1 = new Pattern(200, PatType.NUMBER); static readonly Pattern const2 = new Pattern(201, PatType.NUMBER); static readonly Pattern func1 = new Pattern(400, PatType.FUNCTION);
рдЬрдм рд╣рдо any1 * const1 - func1 рдЗрддреНрдпрд╛рджрд┐ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдЧреА - рдпрд╣ рдХреБрдВрдЬреА рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рднрд░рддреЗ рд╕рдордп, рдпреЗ рд╕рдВрдЦреНрдпрд╛рдПрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреА: 100, 101, 200, 201, 400 ... рдФрд░ рдЬрдм рдПрдХ рдкреЗрдбрд╝ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдХреБрдВрдЬреА рдХреЗ рдЕрдиреБрд░реВрдк рдореВрд▓реНрдп рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗред
рдпрд╣рд╛рдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛
рдЧрдпрд╛ ред
рд╕рд░рд▓ред рдкреЗрдбрд╝ рдХреА рдЫрдБрдЯрд╛рдИ
рд▓реЗрдЦ рдореЗрдВ рдЬреЛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдЦрдХ рдиреЗ рдЗрд╕реЗ рдмрд╕ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рдкреЗрдбрд╝ рдХреЗ рд╣реИрд╢ рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ред рд╡рд╣ 2 рдмреА + рд╕реА рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ -рдП, рдмреА + рд╕реА + рдмреА рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рд▓реЗрдХрд┐рди рд╣рдо, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, (x + y) + x * y - 3 * x рдХреЛ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЪреАрдЬреЛрдВ рдореЗрдВред
рдкреИрдЯрд░реНрди рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдордиреЗ рдкрд╣рд▓реЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдерд╛, рдкреИрдЯрд░реНрди рдПрдХ рд░рд╛рдХреНрд╖рд╕реА рд░реВрдк рд╕реЗ рдЕрджреНрднреБрдд рдЪреАрдЬ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рд╡рд░реНрдЧреЛрдВ, рдФрд░ рд╕рд╛рдЗрди рдФрд░ рдХреЛрд╕рд┐рди рдХреЗ рд╡рд░реНрдЧ рдХреЗ рдпреЛрдЧ рдФрд░ рдЕрдиреНрдп рдЬрдЯрд┐рд▓ рдЪреАрдЬреЛрдВ рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдкреНрд░рд╛рдердорд┐рдХ рд╣рдереЗрд▓реА, ((((((x + 1) + 1) + 1) + 1), рдпрд╣ рдХрдо рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдирд┐рдпрдо рд╢рд░реНрддреЛрдВ рдХреА рдХрдореНрдпреВрдЯрд┐рдЯреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓рд╛ рдХрджрдо "рд░реИрдЦрд┐рдХ рдмрдЪреНрдЪреЛрдВ" рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реИред
"рд░реИрдЦрд┐рдХ рдмрдЪреНрдЪреЗ"
рджрд░рдЕрд╕рд▓, рдпреЛрдЧ рдпрд╛ рдЕрдВрддрд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХреЗ рд▓рд┐рдП (рдФрд░, рд╡реИрд╕реЗ, рдЙрддреНрдкрд╛рдж / рд╡рд┐рднрд╛рдЬрди), рд╣рдо рд╢рд░реНрддреЛрдВ (рдХрд╛рд░рдХреЛрдВ) рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реАрдзрд╛ рд╣реИред LinearChildren (Entity рдиреЛрдб) рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рд╕реВрдЪреА рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рджреЗрдВ, рдлрд┐рд░ рд╣рдо рдиреЛрдб рдореЗрдВ рдмрдЪреНрдЪреЗ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рдЪрд┐рд▓реНрдбреНрд░реЗрди: рдпрджрд┐ рдмрдЪреНрдЪрд╛ рдПрдХ рдпреЛрдЧ рдирд╣реАрдВ рд╣реИ, рддреЛ resultред рдЬреЛрдбрд╝реЗрдВ (рдмрдЪреНрдЪрд╛), рдЕрдиреНрдпрдерд╛ рдкрд░рд┐рдгрд╛рдо редddRange (LinearCildren (рдмрдЪреНрдЪрд╛))ред
рдпрд╣рд╛рдВ рд▓рд╛рдЧреВ рд╕рдмрд╕реЗ рдЦреВрдмрд╕реВрд░рдд рддрд░реАрдХрд╛ рдирд╣реАрдВред
рдмрдЪреНрдЪреЛрдВ рдХрд╛ рд╕рдореВрд╣ рдмрдирд╛рдирд╛
рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрдЪреНрдЪреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЧреЗ рдХреНрдпрд╛? рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╛рдк (x) + x + y + sin (x) + 2 * x рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╣рдорд╛рд░реЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдкрд╛рдВрдЪ рд╢рд░реНрддреЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреАред рдЕрдЧрд▓рд╛, рд╣рдо рд╕рдорд╛рдирддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, x рдкрд╛рдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 2 * x рдЕрдзрд┐рдХ рд▓рдЧрддрд╛ рд╣реИ (x)ред
рдпрд╣рд╛рдБ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдореВрд╣рди рд╣реИ:

рдЪреВрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдкреИрдЯрд░реНрди 2 * x + x рд╕реЗ 3 * x рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗред
рдпрд╣реА рд╣реИ, рд╣рдо рдкрд╣рд▓реЗ рдХреБрдЫ
рд╣реИрд╢ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдорд▓реНрдЯреАрд╣рд╛рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ - рдПрди-рдЖрд░реНрдп рдпреЛрдЧ рдХреЛ рдмрд╛рдЗрдирд░реА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдиреЛрдб рд╣реИрд╢
рдПрдХ рдУрд░
рдФрд░
рдПрдХ рд╕рдореВрд╣ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рджреВрд╕рд░реА рдУрд░, рдпрджрд┐ рдЙрдкрд▓рдмреНрдз рд╣реЛ
рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдореВрд╣ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛
рд╡реНрдпрд░реНрдеред
рд╡рд┐рдЪрд╛рд░реЛрдВрдЕрдЧрд░ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рд╡реИрд╕реЗ рднреА, рд╕рд░рд▓реАрдХрд░рдг рдХрднреА рднреА рдПрдХ рд╕реНрдкрд╖реНрдЯ рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рдФрд░ "рдХреИрд▓рдХреБрд▓реЗрдЯрд░" рд▓рд┐рдЦрддреЗ рд╕рдордп рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкрд╣рд▓реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдмрд╣реБ-рд╕реНрддрд░реАрдп рдЫрдБрдЯрд╛рдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ, рд╣рдо рдпрд╣ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ
- рдПрдХ рд╣реА рдмрд╛рддред рдХреНрд░рдордмрджреНрдз, рд╢рд╛рдВрдд рд╣реЛ рдЧрдпрд╛ред рдлрд┐рд░ рд╣рдо рджрд┐рдЦрд╛рд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ
рдХреЗрд╡рд▓ рджреВрд╕рд░реЛрдВ рдХреЗ рд╕рд╛рде рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
ред рдФрд░ рдЕрдм рд╣рдорд╛рд░реА
рдФрд░
рдЕрдВрдд рдореЗрдВ рдЯреАрдо рдмрдирд╛рдИ рдЧрдИред рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рд▓рд╛рдЧреВ:
internal string Hash(SortLevel level) { if (this is FunctionEntity) return this.Name + "_" + string.Join("_", from child in Children select child.Hash(level)); else if (this is NumberEntity) return level == SortLevel.HIGH_LEVEL ? "" : this.Name + " "; else if (this is VariableEntity) return "v_" + Name; else return (level == SortLevel.LOW_LEVEL ? this.Name + "_" : "") + string.Join("_", from child in Children where child.Hash(level) != "" select child.Hash(level)); }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЫрдБрдЯрд╛рдИ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдмреЗрд╢рдХ, рдХреНрдпреЛрдВрдХрд┐
рд╕рд╛рде
рдЖрдо рддреМрд░ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ)ред рдПрдХ рдЪрд░ рдХреА рддрд░рд╣,
рд╕рд╛рде
рдЦреИрд░, рдпрд╣ рдорд┐рд╢реНрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕реНрдерд┐рд░рд╛рдВрдХ рдФрд░ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд╕рднреА рд╕реНрддрд░реЛрдВ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдХреНрд░рдо рдореЗрдВ, рд╕рд░рд▓реАрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реА
public Entity Simplify(int level) {
рд╡рд┐рдЪрд╛рд░реЛрдВрдХреНрдпрд╛ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ? рдирд┐рдЬреА рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рд╢реЙрд╡ рдХрд░реЗрдВ, рд╢рд╛рдпрдж рдмреЗрд╣рддрд░ рд╡рд┐рдЪрд╛рд░ рд╣реЛрдВрдЧреЗред рдореИрдВрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реЛрдЪрд╛ рдХрд┐ рдЗрд╕реЗ рдпрдерд╛рд╕рдВрднрд╡ рд╕реБрдВрджрд░ рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ "рд╕реБрдВрджрд░" рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред
рдореИрдВ
рдпрд╣рд╛рдВ рдкреЗрдбрд╝ рдХреЛ рдЫрд╛рдВрдЯрддрд╛ рд╣реВрдВред
рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ "рд╕рдВрдХрд▓рди"
рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ - рдЪреВрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ IL рдХреЛрдб рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдХреЗрд╡рд▓ рдмрд╣реБрдд рддреЗрдЬрд╝ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕реЗрдЯ рдореЗрдВ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред
рд╕реНрдерд╛рдирд╛рдкрдиреНрди рд╕рдорд╕реНрдпрд╛
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдЪрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдФрд░ eval рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
var x = MathS.Var("x"); var expr = x * x + 3; var result = expr.Substitute(x, 5).Eval();
рд▓реЗрдХрд┐рди рдпрд╣ рдзреАрд░реЗ-рдзреАрд░реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдкреНрд░рддрд┐ рд╕рд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ 1.5 рдорд╛рдЗрдХреНрд░реЛрд╕реЗрдХрдВрдбред
рдЕрдиреБрджреЗрд╢
рдЧрдгрдирд╛ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН:
1) рд╣рдо рдлрд╛рд╕реНрдЯрдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрдЧреА
2) рдЬрдм рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рд╕реНрдЯреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди x * x + sin (x) + 3 рд╣реИ, рддреЛ рдирд┐рд░реНрджреЗрд╢ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдВрдЧреЗ:
PUSHVAR 0 // 0 - x CALL 6 // 6 - PUSHCONST 3 CALL 0 // 0 - PUSHVAR 0 PUSHVAR 0 CALL 2 CALL 0
рдЕрдЧрд▓рд╛, рдЬрдм рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред
рд░рд╛рд╢рд┐ рдХрдерди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
internal static void Sumf(Stack<Number> stack) { Number n1 = stack.Pop(); Number n2 = stack.Pop(); stack.Push(n1 + n2); }
рд╕рд╛рдЗрди рдХреЙрд▓ 1500ns рд╕реЗ рдШрдЯрд╛рдХрд░ 60ns (рд╕рд┐рд╕реНрдЯрдо рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕.рдЗрди 30ns рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ) рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╢рд▓рдЬрдо
рдпрд╣рд╛рдБ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛
рд╣реИ ред
рдлреВ, рд╕рдм рдХреБрдЫ рдЕрдм рдХреЗ рд▓рд┐рдП рд▓рдЧрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрднреА рднреА рдХреБрдЫ рдмрддрд╛рдирд╛ рдмрд╛рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдорд╛рддреНрд░рд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рд╕реАрдХреНрд╡рд▓ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ? рдЕрд░реНрдерд╛рддреН: рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ, рд▓реЗрдЯреЗрдХреНрд╕ рдореЗрдВ рдкреНрд░рд╛рд░реВрдкрдг, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрднрд┐рдиреНрди рдФрд░ рдЕрдиреНрдп рдЙрдкрд╣рд╛рд░ред
рд╕рднреА рдХреЛрдб рдХреЗ рд╕рд╛рде
рднрдВрдбрд╛рд░ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ , рд╕рд╛рде рд╣реА рдкрд░реАрдХреНрд╖рдг рдФрд░ рдирдореВрдиреЗред
рд╡рд┐рдЪрд╛рд░реЛрдВрд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реВрдВред рдпрд╣ рдПрдордЖрдИрдЯреА рдХреЗ рддрд╣рдд рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдЪрд╛рд╣рддреЗ рд╣реИрдВ), рдФрд░ рдпрд╣ рдХрднреА рднреА рдмрдВрдж рдпрд╛ рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рдирд╣реАрдВ рдмрдиреЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рд╕реБрдзрд╛рд░ рдФрд░ рдпреЛрдЧрджрд╛рди рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рддреЛ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдмрд╣реБрдд рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!