Julia: рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕

рдХреЛ рдирд┐рд░реНрдорд┐рдд 26 рдордИ 2014  ┬╖  171рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: JuliaLang/julia

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЕрднреА рддрдХ рдЕрдкрдирд╛ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХреА рдЪрд░реНрдЪрд╛ рдЙрджрд╛рд╣рд░рдг # 5 рдореЗрдВ рдХреА рдЧрдИ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХреЗрдВред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдореЗрд░рд╛ рддрд╛рддреНрдкрд░реНрдп рдЙрди рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдХреЗрд╡рд▓ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрдИ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдмрд┐рдЦрд░рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реЛ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп рдХреНрдпрд╛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред

рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рд╛рдердорд┐рдХ рд░реВрдк рд╕реЗ рд╣рдореЗрдВ рджреЛ рдЪреАрдЬреЗрдВ рджреЗрдВрдЧреЗ:

  • рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╕реНрд╡-рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг
  • рдмреЗрд╣рддрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢

рдмреЗрд╕.рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЗрдВ рдПрдХ рдореИрдХреНрд░реЛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлрд╝реЙрд▓рдмреИрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЪрд╛рд▓рд╛рдХ рд╣реИред рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рджреЗрдирд╛ рдФрд░ рднреА рдЕрдЪреНрдЫрд╛ рд╣реИ:

abstract MyType has print, size(::MyType,::Int), push!

рдпрд╣рд╛рдВ рдпрд╣ рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧреНрд░реИрдиреНрдпреБрд▓реИрд░рд┐рдЯреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред print рдФрд░ push! рдШреЛрд╖рдгрд╛рдПрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣рддреА рд╣реИрдВ рдХрд┐ рдЙрд╕ рдирд╛рдо рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдФрд░ MyType рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ) рд▓реЗрдХрд┐рди рд╡реЗ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд size рдШреЛрд╖рдгрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛рдкрди рджреЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рдгрд╛ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдХрд╛рдлреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджреЗ рд╕рдХрддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ #5 рдореЗрдВ рдХрд╣рд╛ рд╣реИ, рдРрд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдореВрд▓ рд░реВрдк рд╕реЗ C++ рдореЗрдВ C++14 рдпрд╛ C++17 рдХреЗ рд▓рд┐рдП Concept-light рд░реВрдк рдореЗрдВ рдирд┐рдпреЛрдЬрд┐рдд рд╣реИрдВред рдФрд░ рдХреБрдЫ рд╕реА ++ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреБрдЫ рдФрдкрдЪрд╛рд░рд┐рдХрддрд╛ рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рднреА рдЕрдЪреНрдЫреА рд╣реЛрдЧреАред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЧреИрд░-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдЪрд╛рд░реЛрдВ рдФрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдВрдХ рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╡рдЪрди рд╕реВрддреНрд░ рд╢реБрд░реВ рдХрд░рдирд╛ рдФрд░ рд╡рд╣рд╛рдВ рдкреЛрд╕реНрдЯ рдХрд░рдирд╛ рдФрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рд╢реЛрдз рдореЗрдВ рд╕рд╛рдордиреЗ рдЖрдИ рдФрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд▓рдЧрднрдЧ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИрдВред рд╕реНрдЯреЗрдЯрд┐рдХ рднрд╛рд╖рд╛рдПрдВ рд▓рдЧрднрдЧ рдЕрдирдиреНрдп рд░реВрдк рд╕реЗ рдЙрд╕ рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ рдЬреЛ рд╡реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ рдЕрднреА рднреА рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ рдХрд┐ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рд╕рд┐рд╕реНрдЯрдо рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕реНрдерд┐рд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред

рд╣рдо рдЬрд┐рд╕ рдЪреАрдЬ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рдПрдХ рд╕рдВрд░рдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬрд┐рд╕реЗ рднрд╛рд╖рд╛ рддрдм рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ (рдЕрдЧреНрд░рд┐рдо рдореЗрдВ, рдЬрдм рд╕рдВрднрд╡ рд╣реЛ)ред рд╣рдо рд▓реЛрдЧреЛрдВ рдХреЛ рд▓рдХреНрд╖рдгреЛрдВ рдЬреИрд╕реА рдЪреАрдЬрд╝реЛрдВ рдкрд░ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рднреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ; рдпрд╣ рдЦреБрд▓рд╛ рд░рд╣рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдирд┐рдЪрд▓рд╛ рд░реЗрдЦрд╛: рдЬрдмрдХрд┐ рд╕реНрдерд┐рд░ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рдЕрдХрд╛рджрдорд┐рдХ рдХрд╛рд░реНрдп рд╕рд╛рдорд╛рдиреНрдп рд░реБрдЪрд┐ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИред

рд╕рднреА 171 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЖрдо рддреМрд░ рдкрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕-рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рджрд┐рд╢рд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣рд╛рдБ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИред рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ (рди рдХреЗрд╡рд▓ рдЙрдирдХреЗ рдирд╛рдо) рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред

рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЧрдбрд╝рдмрдбрд╝рд┐рдпрд╛рдВ рд╣реЛрдВрдЧреАред рд╢рд╛рдпрдж рдпрд╣реА рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ _Concepts_ рдХреЛ C++ 11 рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рддреАрди рд╡рд░реНрд╖реЛрдВ рдХреЗ рдмрд╛рдж, рдХреЗрд╡рд▓ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реАрдорд┐рдд _lite_ рд╕рдВрд╕реНрдХрд░рдг C++ 14 рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ size рд╡рд┐рдзрд┐ рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╢рд╛рдорд┐рд▓ рдереЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдмреЗрд╕.рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╕реЗ @mustimplement рднреА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Concept-light рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдк рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдЗрдВрдЯрд░рдлреЗрд╕ рджреВрд╕рд░рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВред

рд╡рд╣ рдореИрдХреНрд░реЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рдореИрдВрдиреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐-рдЯреНрд░рд┐рдЧрд░ рдлреЙрд▓рдмреИрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬреВрд▓рд┐рдпрд╛рдСрдкреНрдЯ рдХрд╛ рдореИрдердкреНрд░реЛрдЧрдмреЗрд╕ рдпрд╣ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдПрдХ рдирдП рд╕реЙрд▓реНрд╡рд░ (https://github.com/IainNZ/RationalSimplex.jl) рдХреЗ рд╕рд╛рде рдШреВрдо рд░рд╣рд╛ рдерд╛ рдФрд░ рдореБрдЭреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рддрдм рддрдХ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдерд╛ рдЬрдм рддрдХ рдХрд┐ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЙрдард╛рдирд╛ рдмрдВрдж рди рд╣реЛ рдЬрд╛рдПред

рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рднреА рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░реЗрдЧрд╛, рд╣реИ рдирд╛? рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк рдкреВрд░реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП _have_ рд╣реЛрдВрдЧреЗ?

рдпрд╣ рдХреЙрдиреНрд╡реЗрдВрдЯ/рдХреЙрдиреНрдЯреНрд░рд╛рд╡реЗрд░рд┐рдПрдВрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯрддрд╛ рд╣реИ?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,

abstract A has foo(::A, ::Array)

type B <: A 
    ...
end

type C <: A
    ...
end

# is it ok to let the arguments to have more general types?
foo(x::Union(B, C), y::AbstractArray) = ....

@IainNZ рд╣рд╛рдВ, рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ @mustimplement рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдмрд╣реБрдореБрдЦреА рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рдореЗрд░реА рднрд╛рд╡рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдРрд╕рд╛ "рдХреЛрд░" рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред рдпрд╣ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рд░рдирдЯрд╛рдЗрдо рдЬрд╛рдВрдЪ рдЬреИрд╕рд╛ рдХрд┐ @mustimplement рд╣реИ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@ рд▓рд┐рдВрдбрд╣реБрдЖ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛ред

@ рд▓рд┐рдВрдбрд╛рд╣реБрдЖ рд╢рд╛рдпрдж рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╕рд┐рд░реНрдл рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛ред @mustimplement рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдзрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред

рддреЛ рдЗрд╕реЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЧрд╣рд░рд╛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдХрд┐рд╕реА рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╛рдо/рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрдирд╛ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЬрд╣рд╛рдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ "... рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ" рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХреА рдЬрд╛рддреА рд╣реИ, рдХрд┐рд╕реА рдХреЛ рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред

MethodError рдкреНрд░рд┐рдВрдЯ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдФрд░ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рдПрдкреАрдЖрдИ рд╣реИред

рдПрдХ рдФрд░ рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ рд╡рд╣ рд╣реИ base.Test рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ (рд╕рднреА рдкреНрд░рдХрд╛рд░?) рдореВрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рд╛рдл-рд╕реБрдерд░реА рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╣реЛрдЧрд╛ред

рдзрдиреНрдпрд╡рд╛рдж @ivarneред рддреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

  1. рдПрдХ рдХреЗ рдкрд╛рд╕ рд╡реИрд╢реНрд╡рд┐рдХ рд╢рдмреНрджрдХреЛрд╢ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреБрдВрдЬреА рдФрд░ рдлрд╝рдВрдХреНрд╢рди (+ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░) рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИрдВред
  2. рдЬрдм has рдШреЛрд╖рдгрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдирд┐рд░реНрджреЗрд╢ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
  3. MethodError рдХреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рд╡реИрд╢реНрд╡рд┐рдХ рд╢рдмреНрджрдХреЛрд╢ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рдЕрдзрд┐рдХрд╛рдВрд╢ рддрд░реНрдХ рддрдм MethodError ред

рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ https://gist.github.com/tknopp/ed53dc22b61062a2b283 рдореИрдВ рдпрд╣ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:

julia> abstract A
julia> addInterface(A,length)
julia> type B <: A end
julia> checkInterface(B)
ERROR: Interface not implemented! B has to implement length in order to be subtype of A ! in error at error.jl:22

length рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдбрд╛рд▓реА рдЬрд╛рддреА рд╣реИ:

julia> import Base.length
julia> length(::B) = 10
length (generic function with 34 methods)
julia> checkInterface(B)
true

рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╣ рдЕрднреА рднреА рдмрд╣реБрдд рд╣реИрдХреА рд╣реИ рд▓реЗрдХрд┐рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

julia> abstract A
julia> type B <: A end

julia> addInterface(A,:size,(A,Int64))
1-element Array{(DataType,DataType),1}:
 (A,Int64)
julia> checkInterface(B)
ERROR: Interface not implemented! B has to implement size in order to be subtype of A !
in error at error.jl:22

julia> import Base.size
julia> size(::B, ::Integer) = 333
size (generic function with 47 methods)
julia> checkInterface(B)
true

julia> addInterface(A,:size,(A,Float64))
2-element Array{(DataType,DataType),1}:
 (A,Int64)
 (A,Float64)
julia> checkInterface(B)
ERROR: Interface not implemented! B has to implement size in order to be subtype of A !
 in error at error.jl:22
 in string at string.jl:30

рдореБрдЭреЗ рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ рдХрд┐ рдЬрд┐рд╕реНрдЯ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреИрд╢ рдЕрдм рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рддреАрдХреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреЛрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛрдбрд╝ рд╕рдХреЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХреЗред рдореБрдЭреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред

рдмрд╕ рджреЗрдЦрд╛ рдХрд┐ #2248 рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ рдХреБрдЫ рд╕рд╛рдордЧреНрд░реА рд╣реИред

рдЬрдм рддрдХ рд╣рдо рджрд░рд╡рд╛рдЬреЗ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗ, рддрдм рддрдХ рдореИрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдЬреИрд╕реА рдЕрдзрд┐рдХ рд╕рдЯреНрдЯрд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рдЖрдкрдиреЗ рдЪрд░реНрдЪрд╛ рд╢реБрд░реВ рдХреА рд╣реИ, рдпрд╣рд╛рдВ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛ рдерд╛ред


рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рдгрд╛ рдФрд░ рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдореЙрдХрдЕрдк рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

interface Iterable{T,S}
    start :: Iterable --> S
    done  :: (Iterable,S) --> Bool
    next  :: (Iterable,S) --> (T,S)
end

implement UnitRange{T} <: Iterable{T,T}
    start(r::UnitRange) = oftype(r.start + 1, r.start)
    next(r::UnitRange, state::T) = (oftype(T,state), state + 1)
    done(r::UnitRange, state::T) = i == oftype(i,r.stop) + 1
end

рдЖрдЗрдП рдЗрд╕реЗ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рддреЛрдбрд╝ рджреЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡рд╣рд╛рдБ рд╕рдорд╛рд░реЛрд╣ рдкреНрд░рдХрд╛рд░ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛: A --> B рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдирдХреНрд╢реЗ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╣реИ A рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП B ред рдЗрд╕ рд╕рдВрдХреЗрддрди рдореЗрдВ рдЯреБрдкрд▓реНрд╕ рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ, рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ f :: A --> B рдШреЛрд╖рд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ f рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рд╣реИ, рдореИрдкрд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ A рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП B ред рдпрд╣ рдереЛрдбрд╝рд╛ рдЦреБрд▓рд╛ рдкреНрд░рд╢реНрди рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИред рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм A рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ f B рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛? рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ f рдХреЗрд╡рд▓ A рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдХрд╣реАрдВ рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рдЗрдирдкреБрдЯ рдкрд░? рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдм рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреЛрдИ рддрд░реАрдХрд╛ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдПрдХ рдирдпрд╛ рдЬреЗрдиреЗрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╣реИрдВред

рджреВрд╕рд░рд╛, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ Iterable{T,S} рдХреА рдШреЛрд╖рдгрд╛ рд╣реИред рдпрд╣ Iterable рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреА рддрд░рд╣ рдФрд░ рдПрдХ рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рдереЛрдбрд╝рд╛ рд╕рд╛ рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреА рддрд░рд╣ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдореЗрдВ Iterable.start , Iterable.done рдФрд░ Iterable.next рдирд╛рдордХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╣реИред рдпрд╣ рдЙрд╕ Iterable рдФрд░ Iterable{T} рдФрд░ Iterable{T,S} рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╡рд┐рдзрд┐ рдкреНрд░реЗрд╖рдг рдореЗрдВред

рддреАрд╕рд░рд╛, implement рдмреНрд▓реЙрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ UnitRange Iterable рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред implement рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░, Iterable.start , Iterable.done рдФрд░ Iterable.next рдлрд╝рдВрдХреНрд╢рди рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ import Iterable: start, done, next , рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЬреЛрдбрд╝ред рдпрд╣ рдмреНрд▓реЙрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рддрд░рд╣ рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛рдПрдВ рд╣реИрдВ - рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░, UnitRange рдЕрд░реНрде рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ UnitRange , рди рдХрд┐ рдЫрд╛рддрд╛ рдкреНрд░рдХрд╛рд░ред

implement рдмреНрд▓реЙрдХ рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ import рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдмрдЪрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рд╡реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдЖрдпрд╛рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓реЛрдЧ рдЖрдорддреМрд░ рдкрд░ import рдмрд╛рд░реЗ рдореЗрдВ рднреНрд░рдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВред Base рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ import рд▓рд┐рдП рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ рдХрд┐рд╕реА рдирд╛рдо рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпреЛрдЧреНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВред

рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдЬреЛ рдореИрдВрдиреЗ рдЗрдзрд░-рдЙрдзрд░ рдЙрдЫрд╛рд▓рд╛ рд╣реИ, рд╡рд╣ рд╣реИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ "рдЖрдВрддрд░рд┐рдХ" рдФрд░ "рдмрд╛рд╣рд░реА" рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ред рдЗрд╕рд╕реЗ рдореЗрд░рд╛ рддрд╛рддреНрдкрд░реНрдп рдпрд╣ рд╣реИ рдХрд┐ "рдЖрдВрддрд░рд┐рдХ" рдлрд╝рдВрдХреНрд╢рди рд╡рд╣ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ "рдмрд╛рд╣рд░реА" рдлрд╝рдВрдХреНрд╢рди рд╡рд╣ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВред рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдЬрдм рдЖрдк sort! рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ (рдмрд╣рд┐рд╖реНрдХреГрдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░):

julia> methods(sort!)
sort!(r::UnitRange{T<:Real}) at range.jl:498
sort!(v::AbstractArray{T,1},lo::Int64,hi::Int64,::InsertionSortAlg,o::Ordering) at sort.jl:242
sort!(v::AbstractArray{T,1},lo::Int64,hi::Int64,a::QuickSortAlg,o::Ordering) at sort.jl:259
sort!(v::AbstractArray{T,1},lo::Int64,hi::Int64,a::MergeSortAlg,o::Ordering) at sort.jl:289
sort!(v::AbstractArray{T,1},lo::Int64,hi::Int64,a::MergeSortAlg,o::Ordering,t) at sort.jl:289
sort!{T<:Union(Float64,Float32)}(v::AbstractArray{T<:Union(Float64,Float32),1},a::Algorithm,o::Union(ReverseOrdering{ForwardOrdering},ForwardOrdering)) at sort.jl:441
sort!{O<:Union(ReverseOrdering{ForwardOrdering},ForwardOrdering),T<:Union(Float64,Float32)}(v::Array{Int64,1},a::Algorithm,o::Perm{O<:Union(ReverseOrdering{ForwardOrdering},ForwardOrdering),Array{T<:Union(Float64,Float32),1}}) at sort.jl:442
sort!(v::AbstractArray{T,1},alg::Algorithm,order::Ordering) at sort.jl:329
sort!(v::AbstractArray{T,1}) at sort.jl:330
sort!{Tv<:Union(Complex{Float32},Complex{Float64},Float64,Float32)}(A::CholmodSparse{Tv<:Union(Complex{Float32},Complex{Float64},Float64,Float32),Int32}) at linalg/cholmod.jl:809
sort!{Tv<:Union(Complex{Float32},Complex{Float64},Float64,Float32)}(A::CholmodSparse{Tv<:Union(Complex{Float32},Complex{Float64},Float64,Float32),Int64}) at linalg/cholmod.jl:809

рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЙрдкрднреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЫрдБрдЯрд╛рдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдХрдорд╛рддреНрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

sort!(v::AbstractArray)

рдмрд╛рдХреА рд╢реЛрд░ рд╣реИрдВ рдФрд░ "рдЕрдВрджрд░" рдкрд░ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ,

sort!(v::AbstractArray{T,1},lo::Int64,hi::Int64,::InsertionSortAlg,o::Ordering)
sort!(v::AbstractArray{T,1},lo::Int64,hi::Int64,a::QuickSortAlg,o::Ordering)
sort!(v::AbstractArray{T,1},lo::Int64,hi::Int64,a::MergeSortAlg,o::Ordering)

рд╕рд╛рдорд╛рдиреНрдп рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдорд╢реАрдирд░реА рдореЗрдВ рд╣реБрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рдореЗрдВ Sort.Algorithm рдПрдХ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рд╣реИ, рдФрд░ InsertionSortAlg , QuickSortAlg рдФрд░ MergeSortAlg рдЗрд╕рдХреЗ рдареЛрд╕ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИрдВред рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде, Sort.Algorithm рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

# module Sort
interface Algorithm
    sort! :: (AbstractVector, Int, Int, Algorithm, Ordering) --> AbstractVector
end
implement InsertionSortAlg <: Algorithm
    function sort!(v::AbstractVector, lo::Int, hi::Int, ::InsertionSortAlg, o::Ordering)
        <strong i="17">@inbounds</strong> for i = lo+1:hi
            j = i
            x = v[i]
            while j > lo
                if lt(o, x, v[j-1])
                    v[j] = v[j-1]
                    j -= 1
                    continue
                end
                break
            end
            v[j] = x
        end
        return v
    end
end

рддрдм рд╣рдо рдЬреЛ рдЕрд▓рдЧрд╛рд╡ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

# module Sort
sort!(v::AbstractVector, alg::Algorithm, order::Ordering) =
    Algorithm.sort!(v,1,length(v),alg,order)

рдпрд╣, рдХреНрдпрд╛ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рд╕реЗ _very_ рдХрд░реАрдм рд╣реИ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╣рдо рдЙрд╕ Algorithm.sort! рдХреЗ рдмрдЬрд╛рдп рд╕рд┐рд░реНрдл sort! - рдФрд░ рдЬрдм рд╡рд┐рднрд┐рдиреНрди рдЫрдБрдЯрд╛рдИ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ, "рдЖрдВрддрд░рд┐рдХ" рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ Algorithm.sort! sort! рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВред рдЗрд╕рдХрд╛ рдмрд╛рд╣рд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ sort! рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рднрд╛рд╡ рд╣реИред

@StefanKarpinski рдЖрдкрдХреЗ рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ 0.3 рд╕рд╛рдорд╛рди рдирд╣реАрдВ рд╣реИред рдмрд╣реБрдд рдЦреЗрдж рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рд╕рдордп рдЗрд╕реЗ рд▓рд╛рдпрд╛ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ 0.3 рдЬрд▓реНрдж рд╣реА рдпрд╛ рдЖрдзреЗ рд╕рд╛рд▓ рдореЗрдВ рд╣реЛрдЧрд╛ ;-)

рдкрд╣рд▓реА рдирдЬрд╝рд░ рд╕реЗ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ (!) рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдиреБрднрд╛рдЧ рдХреЛ рдЕрдкрдирд╛ рдХреЛрдб рдмреНрд▓реЙрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕реАрдзреЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред

рдХреЛрдИ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ - рдЬрдм рд╣рдо рдХрд┐рд╕реА рд░рд┐рд▓реАрдЬрд╝ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рднрд╡рд┐рд╖реНрдп рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдХреЛрдИ рдмреБрд░рд╛рдИ рдирд╣реАрдВ рд╣реИред

рдЖрдкрдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореМрд▓рд┐рдХ рд╣реИ рдФрд░ рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реНрд╡рддрдВрддреНрд░ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рднреА рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдирдпрд╛ рдирд┐рд░реНрдорд╛рдг (рдпрд╛рдиреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕) рднреА рд▓рд╛рддрд╛ рд╣реИ рдЬреЛ рднрд╛рд╖рд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдПрдХ рдмреБрд░реА рдЪреАрдЬ рдирд╣реАрдВ рд╣реИ)ред

рдореИрдВ "рдЗрдВрдЯрд░рдлрд╝реЗрд╕" рдХреЛ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдзрд┐рдХ рджреЗрдЦрддрд╛ рд╣реВрдВред рдпрджрд┐ рдХреЛрдИ рдЗрд╕рдореЗрдВ has рдбрд╛рд▓рддрд╛ рд╣реИ рддреЛ рдХреЛрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХреЛ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдпрджрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕реАрдзреЗ рдЗрд╕рдХреА рдШреЛрд╖рдгрд╛ рдкрд░ рдорд╛рдиреНрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рдЕрдВрджрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХрдо рд╕реЗ рдХрдо рдЖрдХреНрд░рд╛рдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдЕрдкрдирд╛ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдирд╛ рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ

type UnitRange{T} <: Iterable{T,T}
    start(r::UnitRange) = oftype(r.start + 1, r.start)
    next(r::UnitRange, state::T) = (oftype(T,state), state + 1)
    done(r::UnitRange, state::T) = i == oftype(i,r.stop) + 1
end

рдХрд┐рд╕реА рдХреЛ рдЕрднреА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рдмрд╛рд╣рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдЧреАред рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдп рдШреЛрд╖рдгрд╛рдПрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдорд╛рдиреНрдп рд╣реИрдВред

рд▓реЗрдХрд┐рди рдлрд┐рд░, рд╢рд╛рдпрдж рдореЗрд░рд╛ "рдХрдо рд╕реЗ рдХрдо рдЖрдХреНрд░рд╛рдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг" рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИред рд╕рдЪ рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ред

рдЙрди рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдЯрд╛рдЗрдк рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рд░рдЦрдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдПрдХрд╛рдзрд┐рдХ рд╡рд┐рд░рд╛рд╕рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмреАрдЪ рдирд╛рдо рдЯрдХрд░рд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рддрдереНрдп рдХреЛ рднреА рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ _after_ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВред

@StefanKarpinski рдпрд╣

рдЧреНрд░рд╛рдлрд╝ рдкреИрдХреЗрдЬ рд╡рд╣ рд╣реИ рдЬрд┐рд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдкреНрд░рдгрд╛рд▓реА рдпрд╣рд╛рдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░ рд╕рдХрддреА рд╣реИ: http://graphsjl-docs.readthedocs.org/en/latest/interface.htmlред

@StefanKarpinski : рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдПрдХрд╛рдзрд┐рдХ рд╡рд┐рд░рд╛рд╕рдд рдФрд░ рдЗрди-рдмреНрд▓реЙрдХ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред рдЯрд╛рдЗрдк рдмреНрд▓реЙрдХ рдХреЗ рднреАрддрд░ рд╕рднреА рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рд╣реЛрдЧреАред

рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ "рдЦреБрд▓рд╛" рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдФрд░ рдЗрди-рдЯрд╛рдЗрдк рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рднрд╛рд╖рд╛ рдХреЛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдХрд░ рд╕рдХрддреА рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ #7025 рдореЗрдВ рдЬреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рд╡рд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛред рдпрд╛ рддреЛ рдПрдХ рдбрд╛рд▓ verify_interface рд╕рдорд╛рд░реЛрд╣ рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рдмрд╛рдж (рдпрд╛ рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ) рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╕реНрдердЧрд┐рдд рдХрд░реЗрдВ MethodError ред

рдпрд╣ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдПрдХ рд╣реА рдирд╛рдо рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдирд╛рдо рдЯрдХрд░рд╛рд╡ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпреЛрдЧреНрдп рдирд╛рдо рд╕реЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдпрд╣ рднреА рдХрдо рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рд╡рд┐рдзрд┐ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдХрд┐рд╕ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ - рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдирд╛рдо рдЯрдХрд░рд╛рд╡ рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдФрд░ "рдЪреАрдЬ" рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдЬреЛрдбрд╝рдирд╛ рдереЛрдбрд╝рд╛ рдЧреИрд░-рдСрд░реНрдереЛрдЧреЛрдирд▓ рд▓рдЧрддрд╛ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд╡реЗ рдореЙрдбреНрдпреВрд▓ рдХреА рддрд░рд╣ рдереЛрдбрд╝реЗ рд╣реИрдВ рдФрд░ рдереЛрдбрд╝реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдХреБрдЫ рдПрдХреАрдХрд░рдг рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдХреИрд╕реЗред

рдореИрдВ рдХреБрдЫ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕-рдПрдЬрд╝-рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЙрдбрд▓ рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕-рдПрдЬрд╝-рд▓реИрдВрдЧреНрд╡реЗрдЬ-рдлрд╝реАрдЪрд░ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ: рдпрд╣ рднрд╛рд╖рд╛ рдХреЛ рд╕рд░рд▓ рд░рдЦрддрд╛ рд╣реИ (рдмреЗрд╢рдХ рд╡рд░реАрдпрддрд╛ рдФрд░ рдХреЛрдИ рдареЛрд╕ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ) рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрдиреА рд╣реБрдИ рд╣реИ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣реЛ рд╕рдХрддреА рд╣реИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реБрдзрд╛рд░ рдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореИрдВ @tknopp рд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд▓рдЧрддрд╛ рд╣реИ (рдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдХрдо рд╕реЗ рдХрдо рдЖрдХрд╛рд░) @StefanKarpinski рд╕реЗ рдПрдХ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ - рдпрд╣ рдХреБрдЫ рднреА рднрд╛рд╖рд╛ рдореЗрдВ рдирдИ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╕рдордп рдХреА рдЬрд╛рдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдЬреЛ рдореБрдЦреНрдп рджреЛрд╖ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИ, рд╡рд╣ рд╣реИ рдЯрд╛рдЗрдк рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдХрдореА; рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП _predicates_ рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдкреНрд░рдореБрдЦ рдкреНрд░реЗрд░рдгрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рднреНрд░рдо рд╣реИ рдЬреЛ _import_ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рддрд╛рдХрд┐ рдЙрдирдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХреЗред рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп, рдРрд╕рд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдпрд╣ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╕рдорд╕реНрдпрд╛ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдирд╣реАрдВ, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд▓рдЧрддрд╛ред

@StefanKarpinski рдЖрдк рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдкреНрд░реЗрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред рд╕рд╛рде рд╣реА implement рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдХрдИ рдкреНрд░реЗрд╖рдг рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рд╡реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯрдкрд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рддреЛ рдпрджрд┐ рд╡рд┐рдзрд┐рдпрд╛рдВ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЗрдВрдЯрд░рдлреЗрд╕ (рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕реЗрдЯ рд╣реИрдВ) рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ?

рдХрд╣реЛ рдХрд┐ рдореИрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:

module M

abstract A
abstract B

type A2 <: A end
type A3 <: A end
type B2 <: B end

function f(a::A2, b::B2)
    # do stuff
end

function f(a::A3, b::B2)
    # do stuff
end

export f, A, B, A2, A3, B2
end # module M

рдЕрдм рдореИрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдП рдФрд░ рдмреА рд▓реЗрддрд╛ рд╣реИ

using M

function userfunc(a::A, b::B, i::Int)
    res = f(a, b)
    res + i
end

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ f рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдПрдб-рд╣реЙрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ A рдФрд░ рдПрдХ B рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдпрд╣ рдорд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ f рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЙрди рдкрд░

рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдЬреЛ A рдФрд░ B рдареЛрд╕ рдЙрдкрдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдирд╕реЗ f рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рд╡рд┐рд╕реНрдлреЛрдЯ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рд░реБрджреНрдз f рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ:

module N

using M

type SpecialA <: A end
type SpecialB <: B end

function M.f(a::SpecialA, b::SpecialB)
    # do stuff
end

function M.f(a::A, b::SpecialB)
    # do stuff
end

function M.f(a::SpecialA, b::B)
    # do stuff
end

export SpecialA, SpecialB

end # module N

рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рд╣реА рдХрд╛рд▓реНрдкрдирд┐рдХ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ (рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо) рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдкреНрд░реЗрд╖рдг рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдмреАрдЪ рдПрдХ рдореМрд▓рд┐рдХ рдЧрд▓рдд рдорд┐рд▓рд╛рди рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ import рднреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреА рдмрд╛рдд рджреЗрдЦрддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рдЬреЛрдбрд╝реЗ рдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдЬрдм рдореИрдВрдиреЗ using M рдбрд╛рд▓рд╛ рдФрд░ рдлрд┐рд░ f рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рддреЛ рдпрд╣ рдореЗрд░реА рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдирд╣реАрдВ рд╣реБрдЖ, рдФрд░ рдореБрдЭреЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ рд╕реЗ M.f (рдпрд╛ рдореИрдВ import рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рдерд╛)ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ рд╣рд╛рд▓рд╛рдВрдХрд┐ред рдХреНрдпрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕рд╣рдЬ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░-рдордВрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рд╣реИ?

@ abe-egnor рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрдзрд┐рдХ рдЦреБрд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдзрд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд▓рдЧрддрд╛ рд╣реИред рдореЗрд░реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк #7025 рдореЗрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рджреЛ рдЪреАрдЬреЛрдВ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ:
рдП) рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕
рдмреА) рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрддрдирд╛ рдЕрдзрд┐рдХ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЧреБрд░реБ рдирд╣реАрдВ рд╣реВрдВ, рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдмреА) рдЧрд╣рд░реЗ рдЕрдиреБрднрд╡ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ) рдХреЛрдИ рдореИрдХреНрд░реЛ рдХреЗ рд╕рд╛рде рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕реАрдзреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднрд╛рд╖рд╛ рд╕рдорд░реНрдерди рдЦрд░реНрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред has рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдХреЛрдб рдмреНрд▓реЙрдХ рдЗрд╕реЗ рдЕрдЪреНрдЫрд╛ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ #4935 рд╕реЗ рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ "рдЖрдВрддрд░рд┐рдХ" рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрдмрдХрд┐ рдпрд╣ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдЗрдиреНрд╣реЗрдВ рдмрдВрдбрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ #4935 рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рджреЛрдиреЛрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред

https://gist.github.com/abe-egnor/503661eb4cc0d66b4489 рдореИрдВрдиреЗ рдЬрд┐рд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рдЙрд╕ рдкрд░ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдЫреБрд░рд╛ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред @implement рдореИрдХреНрд░реЛ рдХреЗрд╡рд▓ рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рджрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред

рдЕрдЪреНрдЫреЗ рдЕрдВрдХ:

  • рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ред
  • рдУрд░реНрдереЛрдЧреЛрдирд▓, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЦреЗрд▓рддрд╛ рд╣реИред
  • рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдлреИрдВрд╕реА рд╣реЛ рд╕рдХрддреА рд╣реИ (рд╡реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рдХреЗрд╡рд▓ рдХрд╛рд░реНрдп рдХрд░ рд░рд╣реЗ рд╣реИрдВ)

рдмреБрд░реЗ рд╕рдВрдХреЗрдд:

  • рдпрджрд┐ рдЖрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рдЦреЗрд▓рддрд╛ рд╣реИред рдпрд╣ рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд╣рд▓реВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рддрддреНрдХрд╛рд▓ рддрд░реАрдХрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдкреИрд░рд╛рдореАрдЯрд░рдХрд░рдг рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ - рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдПрдХ рдореИрдХреНрд░реЛ рдУрд╡рд░ рдЯрд╛рдЗрдк рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдкреНрд░рдХрд╛рд░ рдорд╛рдиреЛрдВ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВред @implement рдореИрдХреНрд░реЛ рддрдм рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рддрдХ рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

<strong i="7">@interface</strong> stack(Container, Data) begin
  stack_push!(Container, Data)
end

<strong i="8">@implement</strong> stack{T}(Vector{T}, T) begin
  stack_push!(vec, x) = push!(vec, x)
end

рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рддрдХ рдмрдврд╝рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ stack_push!{T}(vec::Vector{T}, x::T) = push!(vec, x) рдлреИрд▓рддрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдмрд╛рдд рд╣реИред

рдЬреИрд╕реЗ рд╣реА рдореБрдЭреЗ рд╕рдордп рдорд┐рд▓реЗрдЧрд╛ рдореИрдВ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░реВрдВрдЧрд╛; рд╢рд╛рдпрдж рдПрдХ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдЖрджреЗрд╢ рдкрд░ред

рдореИрдВрдиреЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд┐рдпрд╛ рдХрд┐ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдПрдВ рдЗрдВрдЯрд░рдлреЗрд╕, рд╡рд┐рд░рд╛рд╕рдд рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИрдВ рдФрд░ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЖрдИ рд╣реИрдВред (рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рдпрд╣рд╛рдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рддреЛ рдореИрдВрдиреЗ https://gist.github.com/mauro3/e3e18833daf49cdf8f60 рдмрд╣реБрдд рдореЛрдЯреЗ рдиреЛрдЯ рд▓рд┐рдП рд╣реИрдВ)

рдЗрд╕рдХреА рдХрдореА рдпрд╣ рд╣реИ рдХрд┐ рд╢рд╛рдпрдж рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  • рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХрд╛рдзрд┐рдХ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛, рдФрд░
  • рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ред

рдпрд╣ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛ рдФрд░ рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдареЛрд╕ рдЙрдкрдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рд▓рдВрдмреА рдХрд╣рд╛рдиреА:

рдореИрдВрдиреЗ рдЬреЛ рдкрд╛рдпрд╛ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдХреБрдЫ "рдЖрдзреБрдирд┐рдХ" рднрд╛рд╖рд╛рдПрдВ рдЙрдкрдкреНрд░рдХрд╛рд░ рдмрд╣реБрд░реВрдкрддрд╛ рд╕реЗ рджреВрд░ рд╣реЛрддреА рд╣реИрдВ, рдпрд╛рдиреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдХреЛрдИ рд╕реАрдзрд╛ рд╕рдореВрд╣ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╡реЗ рдЗрдВрдЯрд░рдлреЗрд╕/рд╡рд┐рд╢реЗрд╖рддрд╛/рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдореВрд╣ рдмрдирд╛рддреЗ рд╣реИрдВред рдХреБрдЫ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдЗрдВрдЯрд░рдлреЗрд╕ / рд▓рдХреНрд╖рдг / рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЙрдирдХреЗ рдмреАрдЪ рдХреНрд░рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред рд╡реЗ рднреА (рдЬреНрдпрд╛рджрд╛рддрд░) рдЙрд╕ рдкрд╕рдВрдж рд╕реЗ рдЦреБрд╢ рд▓рдЧрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ: рдЬрд╛рдУ ,
рдЬрдВрдЧ , рд╣рд╛рд╕реНрдХреЗрд▓ ред
рдЧреЛ рддреАрдиреЛрдВ рдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдХрдо рд╕рдЦреНрдд рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрджрд┐ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдХрд┐рд╕реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рддреЛ рд╡рд╣ рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рд▓рдХреНрд╖рдг) рдХреЛ impl рдмреНрд▓реЙрдХ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рди рддреЛ рдЧреЛ рдФрд░ рди рд╣реА рд░рд╕реНрдЯ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдмрд╣реБрд╡рд┐рдз рд╣реИрдВ рдФрд░ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реАрдзреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ) рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВред

рдХреБрдЫ рдЕрд░реНрдереЛрдВ рдореЗрдВ рдпрд╣ рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдПрдХ (рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд) рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рддрд░рд╣ рд╣реИрдВ, рдпрд╛рдиреА рд╡реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдВ рди рдХрд┐ рдлрд╝реАрд▓реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ @StefanKarpinski рдиреЗ рдКрдкрд░ рдХреА рдЕрдкрдиреА рдПрдХ рдкреЛрд╕реНрдЯ рдореЗрдВ рднреА рджреЗрдЦрд╛ рдФрд░ рдХрд╣рд╛ рдХрд┐ рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реЛрдиреЗ рд╕реЗ "рдереЛрдбрд╝рд╛ рдмрд╣реБрдд рдЧреИрд░-рдСрд░реНрдереЛрдЧреЛрдирд▓ рд▓рдЧрддрд╛ рд╣реИред" рддреЛ, рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрджрд╛рдиреБрдХреНрд░рдо рд╣реИ (рдпрд╛рдиреА рдЙрдкрдкреНрд░рдХрд╛рд░ рдмрд╣реБрд░реВрдкрддрд╛) рдЬрдмрдХрд┐ рдЧреЛ/рд░рд╕реНрдЯ/рд╣рд╛рд╕реНрдХреЗрд▓ рдирд╣реАрдВ рд╣реИред

рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо None<: ... <:Any рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕/рд╡рд┐рд╢реЗрд╖рддрд╛/рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ? рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛:
1) (рдЕрдореВрд░реНрдд) рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХрд╛рдзрд┐рдХ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ (рд╕рдорд╕реНрдпрд╛ # 5)
2) рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ (рдпрд╛рдиреА рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ)
3) рд╕рд╛рд░ (рдпрд╛рдиреА рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди) рдФрд░ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдм рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдорд╣реАрди рджрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЧреНрд░рд╛рдл рдмрди рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЪрд░рдг рджрд░ рдЪрд░рдг рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд░рдгреА-рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛:

abstract Container  <: Iterable, Indexable, ...
end

abstract AbstractArray <: Container, Arithmetic, ...
    ...
end

abstract  Associative{K,V} <: Iterable, Indexable, Eq
    haskey :: (Associative, _) --> Bool
end

abstract Iterable{T,S}
    start :: Iterable --> S
    done  :: (Iterable,S) --> Bool
    next  :: (Iterable,S) --> (T,S)
end

abstract Indexable{A,I}
    getindex  :: (A,I) --> eltype(A)
    setindex! :: (A,I) --> A
    get! :: (A, I, eltype(A)) --> eltype(A)
    get :: (A, I, eltype(A)) --> eltype(A)
end

abstract Eq{A,B}
    == :: (A,B) --> Boolean
end
...

рддреЛ, рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛рдиреА рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрди рдЬрд╛рддреЗ рд╣реИрдВ) рдЬрдмрдХрд┐ рдареЛрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝реАрд▓реНрдб рд╣реЛрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ AbstractArray рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓реЛрдЧ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдЯреБрдХрдбрд╝реЗ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ AbstractArray рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИред

рдпрджрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рддреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреИрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ), рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдПрдХ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ?

@ssfrr рдиреЗ рдКрдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рдХрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдПрдХрд╛рдзрд┐рдХ рдкреНрд░реЗрд╖рдг рдЕрд╕рдВрдЧрдд рд╣реИрдВред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдмрд╣реБрд╡рд┐рдз рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реА рд╕рдВрднрд╡ рд╣реИред

рдореИрдВрдиреЗ рдпрд╣ рднреА рдкрд╛рдпрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдкрдврд╝рдиреЗ @StefanKarpinski рд▓реЗрдЦ рдХрд┐ рд╕реАрдзреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ abstract рдХреЗ рдмрдЬрд╛рдп interface рдорддрд▓рдм рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ abstract рдХреЛ interface рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрдкрддреНрддрд┐ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддреА рд╣реИ: рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ implement interface _after_ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред рдлрд┐рд░ рдореИрдВ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рдХреЗ lib B рд╕реЗ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо algoB рдХреЗ рд╕рд╛рде lib A рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ typA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ typA algoB рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рдареЛрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЦреБрд▓реА рдПрдХрд╛рдзрд┐рдХ рд╡рд┐рд░рд╛рд╕рдд рд╣реЛрддреА рд╣реИ)ред

@ рдореМрд░реЛ 3 , рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реБрдЭрд╛рд╡ рдкрд╕рдВрдж рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдмрд╣реБрдд "рдЬреВрд▓рд┐рдпрди" рдФрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрдВрдЯрд░рдлреЗрд╕, рдПрдХрд╛рдзрд┐рдХ рд╡рд┐рд░рд╛рд╕рдд, рдФрд░ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ "рдлрд╝реАрд▓реНрдб" рдХрд╛ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдПрдХреАрдХрд░рдг рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдлрд╝реАрд▓реНрдб рдХреЗрд╡рд▓ рд╡рд┐рдзрд┐рдпрд╛рдВ/рдХрд╛рд░реНрдп рд╣реЛрдВрдЧреЗ, рдорд╛рди рдирд╣реАрдВ)ред рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ "рдЖрдВрддрд░рд┐рдХ" рдмрдирд╛рдо "рдмрд╛рд╣рд░реА" рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ @StefanKarpinski рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ abstract Algorithm рдФрд░ Algorithm.sort! рдШреЛрд╖рдгрд╛ рдХрд░рдХреЗ abstract Algorithm sort! рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Algorithm.sort! ред

рд╕рднреА рдХреЛ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ

------------------ -------------------
: "рдЬреИрдХрдм рдХреНрд╡рд┐рди" рд╕реВрдЪрдирд╛рдПрдВ @github.com
рдирдВрдмрд░: 2014х╣┤9цЬИ12цЧе(цШЯцЬЯф║Ф) 6:23
: "рдЬреВрд▓рд┐рдпрд╛ рд▓реИрдВрдЧ/рдЬреБрд▓рд┐рдпрд╛" [email protected];
: "рд▓рд╛рдЧреВ рдХрд░реЗрдВ" [email protected];
: рдкреБрди: [рдЬреВрд▓рд┐рдпрд╛] рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ (#6975)

@ рдореМрд░реЛ 3 , рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реБрдЭрд╛рд╡ рдкрд╕рдВрдж рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдмрд╣реБрдд "рдЬреВрд▓рд┐рдпрди" рдФрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрдВрдЯрд░рдлреЗрд╕, рдПрдХрд╛рдзрд┐рдХ рд╡рд┐рд░рд╛рд╕рдд, рдФрд░ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ "рдлрд╝реАрд▓реНрдб" рдХрд╛ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдПрдХреАрдХрд░рдг рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдлрд╝реАрд▓реНрдб рдХреЗрд╡рд▓ рд╡рд┐рдзрд┐рдпрд╛рдВ/рдХрд╛рд░реНрдп рд╣реЛрдВрдЧреЗ, рдорд╛рди рдирд╣реАрдВ)ред рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ "рдЖрдВрддрд░рд┐рдХ" рдмрдирд╛рдо "рдмрд╛рд╣рд░реА" рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ @StefanKarpinski рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВред

@implement рдмрд╣реБрдд рдЦреЗрдж рд╣реИ; рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЖрдкрдХреЛ рдХреИрд╕реЗ рдкрд┐рдВрдЧ рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдереЗ, рддреЛ рдЖрдк рд╕реНрдХреНрд░реАрди рдХреЗ рджрд╛рдИрдВ рдУрд░ "рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ" рдмрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдпрдВ рдХреЛ рдЙрди рд╕реВрдЪрдирд╛рдУрдВ рд╕реЗ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдирд╣реАрдВ, рдореИрдВ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рд╕рд░реНрд░реА рдХрд╣рдиреЗ рдореЗрдВ рдЖрдкрдХреА рдмрд╣реБрдд рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛

------------------ -------------------
: "рдкрд╛рдУ" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рдирдВрдмрд░: 2014х╣┤9цЬИ13цЧе(цШЯцЬЯхЕн)цЩЪф╕К9:50
: "рдЬреВрд▓рд┐рдпрд╛ рд▓реИрдВрдЧ/рдЬреБрд▓рд┐рдпрд╛" [email protected];
: "рд▓рд╛рдЧреВ рдХрд░реЗрдВ" [email protected];
: рдкреБрди: [рдЬреВрд▓рд┐рдпрд╛] рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ (#6975)

@implement рдмрд╣реБрдд рдЦреЗрдж рд╣реИ; рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЖрдкрдХреЛ рдХреИрд╕реЗ рдкрд┐рдВрдЧ рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдереЗ, рддреЛ рдЖрдк рд╕реНрдХреНрд░реАрди рдХреЗ рджрд╛рдИрдВ рдУрд░ "рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ" рдмрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдпрдВ рдХреЛ рдЙрди рд╕реВрдЪрдирд╛рдУрдВ рд╕реЗ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВред

рд╣рдо рдЖрдкрд╕реЗ рдпрд╣ рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ! рдпрд╣ рдПрдХ рджреБрд░реНрдШрдЯрдирд╛ рдереА, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрдХ рдЬреВрд▓рд┐рдпрд╛ рдореИрдХреНрд░реЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдХреЗ рд╕рдорд╛рди рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВрдиреЗ рдЕрднреА рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╕рдВрднрд╛рд╡рд┐рдд рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ (рд╢рд╛рдпрдж рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ) рдЬрдВрдЧ рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ: http://blog.rust-lang.org/2014/09/15/Rust-1.0.html , рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ: https ://github.com/rust-lang/rfcs/pull/195

рдЯреАрдПрдЪрдЯреАрдЯреА ("рдЯрд┐рдо рд╣реЛрд▓реА Traits.jl ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рдПрдХ рдпрд╛ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдмрдВрдз рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЬреЛрдбрд╝рдирд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдФрд░ рдЕрдиреНрдп рдиреЗ рдКрдкрд░ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ, рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреБрдг рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╣реАрдВ)ред рдФрд░ рджреВрд╕рд░рд╛, рддрд░реАрдХреЛрдВ рдХреЛ рдкреНрд░реЗрд╖рдг рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ @StefanKarpinski рдиреЗ рдКрдкрд░ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИред

рдирдл рдиреЗ рдХрд╣рд╛, рдпрд╣рд╛рдВ рдореЗрд░реЗ рдкреИрдХреЗрдЬ Traits.jl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

<strong i="12">@traitdef</strong> Eq{X,Y} begin
    # note that anything is part of Eq as ==(::Any,::Any) is defined
    ==(X,Y) -> Bool
end

<strong i="13">@traitdef</strong> Cmp{X,Y} <: Eq{X,Y} begin
    isless(X,Y) -> Bool
end

рдпрд╣ рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ Eq рдФрд░ Cmp рдкреНрд░рдХрд╛рд░ X рдФрд░ Y рдмреАрдЪ рдЕрдиреБрдмрдВрдз рд╣реИрдВред Cmp рдореЗрдВ рд╕реБрдкрд░рдЯреНрд░реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ Eq , рдЕрд░реНрдерд╛рдд Eq рдФрд░ Cmp рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред @traitdef рдмреЙрдбреА рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдЗрд╕ рд╕рдордп рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рд╣реА рд╣реЛрдЧрд╛ред рдореИрдВ рдЬрд╛рдБрдЪ рд╕рдХрддрд╛ рд╣реВрдБ, рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, Cmp{Int,Float64} рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ:

julia> istrait(Cmp{Int,Float64})
true

julia> istrait(Cmp{Int,String})
false

рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрднреА рдкреИрдХреЗрдЬ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕рд░рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

_trait-dispatch_ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

<strong i="31">@traitfn</strong> ft1{X,Y; Cmp{X,Y}}(x::X,y::Y) = x>y ? 5 : 6

рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди ft1 рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмрд╛рдзрд╛ рдХреЗ рд╕рд╛рде рджреЛ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ Cmp{X,Y} рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореИрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рдкреНрд░реЗрд╖рдг рдХреА рдПрдХ рдФрд░ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ:

<strong i="37">@traitdef</strong> MyT{X,Y} begin
    foobar(X,Y) -> Bool
end
# and implement it for a type:
type A
    a
end
foobar(a::A, b::A) = a.a==b.a

<strong i="38">@traitfn</strong> ft1{X,Y; MyT{X,Y}}(x::X,y::Y) = foobar(x,y) ? -99 : -999

рдЗрди рд╡рд┐рд╢реЗрд╖рддрд╛-рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдм рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рддрд░рд╣ рд╣реА рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

julia> ft1(4,5)
6

julia> ft1(A(5), A(6))
-999

рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ (рдЬреЛ рдХрд┐ ft1 рдХреЗ рд▓рд┐рдП Unions рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛):

julia> ft1("asdf", 5)
ERROR: TraitException("No matching trait found for function ft1")
 in _trait_type_ft1 at

julia> foobar(a::String, b::Int) = length(a)==b  # adds {String, Int} to MyTr
foobar (generic function with 2 methods)

julia> ft1("asdf", 5)
-999

рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ _рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди_ рдФрд░ рдЙрдирдХрд╛ рдкреНрд░реЗрд╖рдг рдЯрд┐рдо рдХреА рдЪрд╛рд▓ рдФрд░ рдордВрдЪрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдиреАрдЪреЗ рджреЗрдЦреЗрдВред рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рддреБрдЪреНрдЫ рд╣реИ, рд╕рднреА рдХреЗ рдореИрдиреНрдпреБрдЕрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░реЗрд╖рдг рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ

<strong i="51">@traitfn</strong> f{X,Y; Trait1{X,Y}}(x::X,y::Y) = x+y

рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдореЗрдВ (рдереЛрдбрд╝рд╛ рд╕рд░рд▓реАрдХреГрдд)

f(x,y) = _f(x,y, checkfn(x,y))
_f{X,Y}(x::X,y::Y,::Type{Trait1{X,Y}}) = x+y
# default
checkfn{T,S}(x::T,y::S) = error("Function f not implemented for type ($T,$S)")
# add types-tuples to Trait1 by modifying the checkfn function:
checkfn(::Int, ::Int) = Trait1{Int,Int}
f(1,2) # 3

рдкреИрдХреЗрдЬ рдореЗрдВ, checkfn рдХреА рдкреАрдврд╝реА рдХреЛ stagedfuncitons рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП Traits.jl рдХрд╛ README рджреЗрдЦреЗрдВред

_Performance_ рд╕рд░рд▓ рд╡рд┐рд╢реЗрд╖рддрд╛-рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрд╛рджрд┐рдд рдорд╢реАрди рдХреЛрдб рдЙрдирдХреЗ рдмрддрдЦ-рдЯрд╛рдЗрдк рд╕рдордХрдХреНрд╖реЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИ, рдпрд╛рдиреА рдЬрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛ рдЙрддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ рд╣реИред рд▓рдВрдмреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд▓рдВрдмрд╛рдИ рдореЗрдВ ~ 20% рддрдХ рдЕрдВрддрд░ рд╣реЛрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬреИрд╕рд╛ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдпрд╣ рд╕рдм рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

( Traits.jl рдореЗрдВ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП 27 рдЕрдХреНрдЯреВрдмрд░ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд)

рдХреНрдпрд╛ Traits.jl рдкреИрдХреЗрдЬ рддрд▓рд╛рд╢рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ? рд░реАрдбрдореА рдХрд╣рддрд╛ рд╣реИ " @traitimpl рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рд▓рд╛рдЧреВ рдХрд░реЗрдВ (рдЕрднреА рддрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ ...)" - рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдореА рд╣реИ?

рдпрд╣ рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ (рдмрдЧ рд╕рд╣рд┐рдд :-)ред рд▓рд╛рдкрддрд╛ @traitimpl рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп

<strong i="7">@traitimpl</strong> Cmp{T1, T2} begin
   isless(t1::T1, t2::T2) = t1.t < t2.f
end

рдЖрдк рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ

Base.isless(t1::T1, t2::T2) = t1.t < t2.f

рдЖрдкрдХреЗ рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП T1 рдФрд░ T2 ред

рдореИрдВрдиреЗ @traitimpl рдореИрдХреНрд░реЛ рдЬреЛрдбрд╝рд╛, рдЗрд╕рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдЕрдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде README рдХреЛ рднреА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ред рдФрд░ рдореИрдВрдиреЗ @lindahua Graphs.jl рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝рд╛:
https://github.com/mauro3/Traits.jl/blob/master/examples/ex_graphs.jl

рдпрд╣ рд╡рд╛рд╕реНрддрд╛рд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИред рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреБрдкрд▓реНрд╕ рдХреА рд╕рдВрдкрддреНрддрд┐ рд╣реИрдВ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВред

рдореБрдЭреЗ рдпрд╣ рднреА рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╕рдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рд╣реИред рдЕрдЪреНрдЫрд╛ рдХрд╛рдоред

:+1:

рдЕрдЪреНрдЫреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЕрдкрдбреЗрдЯ/рд░рд┐рдлреИрдХреНрдЯрд░ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрдЧ-рдореБрдХреНрдд рдФрд░ рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдпрд╣ рд╢рд╛рдпрдж рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдЕрдЧрд░ рд▓реЛрдЧ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рд╕реНрдкрд┐рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдпрд╣ рдЙрди рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдирдИ рд░реЛрд╢рдиреА рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реИред рдмрд╣реБрдд рд╣реА рд╢рд╛рдВрддред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдЗрд╕реЗ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ рдХреБрдЫ рд╕рд╛рдорд╛рдиреЛрдВ рдХреЛ рджреЛрдмрд╛рд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ ...

рдореИрдВ рдЕрдкрдиреЗ рдкреИрдХреЗрдЬ рднреА рджреЛрдмрд╛рд░рд╛ рдХрд░ рджреВрдВрдЧрд╛ :)

рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рд▓рдХреНрд╖рдг рдЙрдкрд▓рдмреНрдз рд╣реИрдВ (рдФрд░ рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕реБрдЭрд╛рд╡ рдХреА рддрд░рд╣ рдПрдХрд╛рдзрд┐рдХ рдкреНрд░реЗрд╖рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ) рддреЛ рдПрдХ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдкрджрд╛рдиреБрдХреНрд░рдо рддрдВрддреНрд░, рдпрд╛ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдФрд░ рдмрд╛рдж рдореЗрдВ рдкреВрд░реЗ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рдЕрдВрддрддрдГ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рдХреНрд╖рдгреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХрд╛ рдкрд░реНрджрд╛рдлрд╛рд╢ рд╣реЛрдЧрд╛, рдФрд░ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдмреЗрд╢рдХ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╣рдЯрд╛рдХрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЙрддреНрдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдЗрд╕ рдкрд░ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд▓рдХреНрд╖рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬрд┐рдВрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

Array{X; Cmp{X}} # an array of comparables
myvar::Type{X; Cmp{X}} # just a variable which is comparable

рдореИрдВ рдЙрдкрд░реЛрдХреНрдд рдореМрд░реЛ 3 рдмрд┐рдВрджреБ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рдЬрд┐рд╕рдореЗрдВ рд▓рдХреНрд╖рдг рд╣реИрдВ (рдЙрдирдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ) рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рдЬреЛ

  • рдПрдХрд╛рдзрд┐рдХ рд╡рд┐рд░рд╛рд╕рдд рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рдФрд░
  • рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдлрд╝реАрд▓реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрдВ

рдореИрдВ рдпрд╣ рднреА рдЬреЛрдбрд╝реВрдВрдЧрд╛ рдХрд┐ рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рдЙрдирдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рдж рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреЛ "рдЖрд▓рд╕реА рд╡рд┐рд░рд╛рд╕рдд" рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдпрд╛рдиреА рд╕рдВрдХрд▓рдХ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреБрдЫ рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред

рддреЛ рд╕рдм рдХреБрдЫ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд╣рд░ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛/рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдХреБрдЫ рджреЛрд╣рд░рд╛рд╡ рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░реЗрдЧрд╛, рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░реЗрдЧрд╛ред рдЕрдм рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрди рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдзреАрд░реЗ-рдзреАрд░реЗ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реИ

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ : рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЕрдореВрд░реНрдд рд▓реЛрдЧреЛрдВ рд╕реЗ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЕрдВрдд рдореЗрдВ рдЕрд╕реНрд╡реАрдХреГрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рдХреНрд╖рдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ рд▓реЗрдХрд┐рди рд╡рд┐рд░рд╛рд╕рдд рд╕реЗ рдХрднреА рдирд╣реАрдВ

рдХреНрдпрд╛ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ "рдЙрдмрд╛рдК" рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИрдВ?

рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдмрд╕ рдЗрд╕рдХреЗ рдЕрд░реНрде рдХреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕реЗ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рдУрд░реНрдЯреЛрдЧреЛрдирд▓ рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдЖрджрд┐ рджреЗрдирд╛)?

_рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ Point{Float64} <: Pointy{Real} рдЙрджрд╛рд╣рд░рдг рдХреЛ рднреА рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ)?_

рд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреБрдо рд╕рд╣реА рд╣реЛред рд╡рд░реНрддрдорд╛рди рдЬреВрд▓рд┐рдпрд╛ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдмрдврд╝рд╛рдХрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЙрдиреНрд╣реЗрдВ рдЬрд░реВрд░рдд рд╣реИ
1) рдПрдХрд╛рдзрд┐рдХ рд╡рд┐рд░рд╛рд╕рдд
2) рдлрдВрдХреНрд╢рди рд╕рд┐рдЧреНрдиреЗрдЪрд░
3) "рдЖрд▓рд╕реА рд╡рд┐рд░рд╛рд╕рдд", рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдирдпрд╛ рдЧреБрдг рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рдо рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЯреВрдЯ-рдлреВрдЯ рдХреЗ рдмрд┐рдирд╛ рдзреАрд░реЗ-рдзреАрд░реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рддреЛ рдХрдо рд╕реЗ рдХрдо рд╣рдореЗрдВ рд╡рд╣ рдорд┐рд▓ рдЧрдпрд╛;)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЬреЛ рднреА рдЪреБрдиреЗрдВрдЧреЗ рд╡рд╣ рдПрдХ рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛, рдПрдХ рдЬрд┐рд╕реЗ рд╣рдо 0.4 рдореЗрдВ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред рдЕрдЧрд░ рдореБрдЭреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рд╣реЛрддрд╛, рддреЛ рдореИрдВ рджрд╛рдВрд╡ рд▓рдЧрд╛рддрд╛ рдХрд┐ рд╣рдо рдкрд╛рд░рдВрдкрд░рд┐рдХ рдХрдИ рд╡рд┐рд░рд╛рд╕рддреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рд▓рдХреНрд╖рдгреЛрдВ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд░рдЦрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореЗрд░реА рдХреНрд░рд┐рд╕реНрдЯрд▓ рдмреЙрд▓ рдлрд╝реНрд░рд┐рдЯреНрдЬрд╝ рдкрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдмрд┐рдирд╛ рдХреЛрд╢рд┐рд╢ рдХрд┐рдП рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореИрдВрдиреЗ рд╕рд╛рдЗрдорди рдкреЗрдЯрди-рдЬреЛрдиреНрд╕ рдХреА рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕ рдХреА рдЪрд░реНрдЪрд╛ рдХреЛ рдиреАрдЪреЗ рдХреА рдмрд╛рддрдЪреАрдд рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдкрд╛рдпрд╛ рдХрд┐ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдмрджрд▓реЗ рд▓рдХреНрд╖рдгреЛрдВ рдХреА рддрд░рд╣ рдХреБрдЫ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП: http://research.microsoft.com/en-us/um/people/simonpj/ рдкреЗрдкрд░реНрд╕/рд╣рд╛рд╕реНрдХреЗрд▓-рд░реЗрдЯреНрд░реЛрд╕реНрдкреЗрдХреНрдЯрд┐рд╡/рдИрд╕реАрдУрдУрдкреА-рдЬреБрд▓рд╛рдИ09.рдкреАрдбреАрдПрдл

рд╣рд╛рдБ, рдХреАрдбрд╝реЗ рдХреА рдПрдХ рдкреВрд░реА рдХреИрди!

@johnmyleswhite , рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдкред рдпрд╣рд╛рдВ рдЗрд╕рдХреЗ рд╡реАрдбрд┐рдпреЛ рдХрд╛ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦрдиреЗ рд▓рд╛рдпрдХ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддреБрддрд┐ рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдорд┐рд▓реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдкрд░ рд╕реНрдкрд░реНрд╢ рдХрд░рддреА рд╣реИред рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк-рдХреНрд▓рд╛рд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рдлреА рд╣рдж рддрдХ Traits.jl (рдЯрд┐рдо рдХреА рдЪрд╛рд▓, рдбреЗрдЯрд╛рдЯрд╛рдЗрдк рд╣реЛрдиреЗ рдХреЗ рд▓рдХреНрд╖рдг) рдХреЗ рд╕рдорд╛рди рд╣реИред рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ https://www.haskell.org/haskellwiki/Multi-parameter_type_class рдмрд╣реБрдд рдХреБрдЫ Traits.jl рдЬреИрд╕рд╛ рд╣реИред рдмрд╛рддрдЪреАрдд рдореЗрдВ рдЙрдирдХрд╛ рдПрдХ рд╕рд╡рд╛рд▓ рд╣реИ: "рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдордиреЗ рдкреВрд░реЗ рджрд┐рд▓ рд╕реЗ рдЬреЗрдирд░рд┐рдХ рдХреЛ рдЕрдкрдирд╛рдпрд╛, рддреЛ рдХреНрдпрд╛ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИред" (рдЬреЗрдиреЗрд░рд┐рдХ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ-рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рджреЗрдЦреЗрдВ ) рдЬреЛ рдХрд┐ @skariel рдФрд░ @hayd рдКрдкрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВред

@skariel рдФрд░ @hayd рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░рддреЗ рд╣реБрдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рд▓рдХреНрд╖рдг (рдЬреИрд╕реЗ Traits.jl рдореЗрдВ) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИрдВ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рдкрджрд╛рдиреБрдХреНрд░рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛рдиреА рдПрдХрд╛рдзрд┐рдХ рд╡рд┐рд░рд╛рд╕рддред

рд▓реЗрдХрд┐рди рдорд▓реНрдЯреА-рдкреИрд░рд╛рдореАрдЯрд░ рд▓рдХреНрд╖рдг рдереЛрдбрд╝реЗ рдЕрд▓рдЧ рд▓рдЧрддреЗ рд╣реИрдВ, рдХрдо рд╕реЗ рдХрдо рд╡реЗ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдереЗред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрд╛, рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЯрд╛рдЗрдк-рдкреИрд░рд╛рдореАрдЯрд░ рдЬреНрдпрд╛рджрд╛рддрд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рднреАрддрд░ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рдирд┐рд╣рд┐рдд рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Associative{Int,String} рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рддрд╛рдирд╛ рдореЗрдВ Int рдХреБрдВрдЬрд┐рдпрд╛рдБ рдФрд░ String рдорд╛рдиред рдЬрдмрдХрд┐ Tr{Associative,Int,String}... рдХрд╣рдирд╛ рд╣реИ рдХрд┐ Associative , Int s рдФрд░ Strings рдмреАрдЪ рдХреБрдЫ "рдЕрдиреБрдмрдВрдз" рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░, рд╢рд╛рдпрдж Associative{Int,String} рдХреЛ рднреА рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛рдиреА getindex(::Associative, ::Int) -> String , setindex!(::Associative, ::Int, ::String) рдЬреИрд╕реА рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ ...

@ рдореМрд░реЛ 3 рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реЛрдЧреА рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ Associative рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдП, рддрд╛рдХрд┐ рд╡рд╣ рддрдм Associative{Int,String} рд╕реНрд╡рдпрдВ рдмрдирд╛ рд╕рдХреЗ:

function f(A::Associative)
  a = A{Int,String}()  # create new associative
  a[1] = "one"
  return a
end

рдЖрдк рдЗрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП f(Dict) рдХрд╣реЗрдВрдЧреЗред

@eschnett , рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред

@ рдореМрд░реЛ 3 рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рддрд░реАрдХреЗ рд╕реЗ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛; рдореБрдЭрдкрд░ рдзреНрдпрд╛рди рдордд рджреЛред

рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд╕рд╛рде Traits.jl рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛:

  • рд╡рд┐рд╢реЗрд╖рддрд╛ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди
  • рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░
  • рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП @doc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
  • рд╡рд┐рд╢реЗрд╖рддрд╛-рдХрд▓реНрдкрдирд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдмреЗрд╣рддрд░ рдкрд░реАрдХреНрд╖рдг

рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП https://github.com/mauro3/Traits.jl/blob/master/NEWS.md рджреЗрдЦреЗрдВред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!

@ рд░реЛрд░реА-рдлрд┐рдирдиреЗрдЧрди рдиреЗ рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреИрдХреЗрдЬ https://github.com/Rory-Finnegan/Interfaces.jl рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрд╛

рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ @mdcfrancis рдХреЗ рд╕рд╛рде рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдФрд░ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐

protocol Iterable
    start(::_)
    done(::_, state)
    next(::_, state)
end

рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ isa(Iterable, Protocol) рдФрд░ Protocol <: Type ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рдЗрди рдкрд░ рдкреНрд░реЗрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ T <: Iterable рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдпрд╣рд╛рдБ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдирд┐рдпрдо рд╣реИрдВ:

P, Q рдХреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рджреЗрдВ
рдЯреА рдХреЛ рдПрдХ рдЧреИрд░-рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рджреЗрдВ

| рдЗрдирдкреБрдЯ | рдкрд░рд┐рдгрд╛рдо |
| --- | --- |
| рдкреА <: рдХреЛрдИ рднреА | рд╕рдЪ |
| рдиреАрдЪреЗ <: рдкреА | рд╕рдЪ |
| (рд╕рдВрдШ, рд╕рдВрдШ, рд╡рд░) <: рдкреА | рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ; рдкреА рдХреЛ рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреЗрдВ |
| рдкреА <: (рд╕рдВрдШ, рд╕рдВрдШ, рд╡рд░) | рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдо рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ |
| рдкреА <: рдкреА | рд╕рдЪ |
| рдкреА <: рдХреНрдпреВ | рдЬрд╛рдБрдЪ рд╡рд┐рдзрд┐рдпрд╛рдБ (Q) <: рд╡рд┐рдзрд┐рдпрд╛рдБ (P) |
| рдкреА <: рдЯреА | рдЭреВрдард╛ |
| рдЯреА <: рдкреА | P рдХреА рд╡рд┐рдзрд┐рдпрд╛рдБ _ | . рдХреЗ рд╕реНрдерд╛рди рдкрд░ T рдХреЗ рд╕рд╛рде рдореМрдЬреВрдж рд╣реИрдВ

рдЖрдЦрд┐рд░реА рд╡рд╛рд▓рд╛ рдмрдбрд╝рд╛ рд╣реИ: рдЯреА <: рдкреА рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкреА рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ _ рдХреЗ рд▓рд┐рдП рдЯреА рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП method_exists рдХрд░рддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдлреЙрд▓рдмреИрдХ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдЬреЛ рдлреЗрдВрдХрддреА рд╣реИрдВ "рдЖрдкрдХреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛" рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдмрд╣реБрдд рдмреБрд░реА рдЪреАрдЬ рдмрди рдЬрд╛рддреА рд╣реИрдВред рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдХреЙрд╕реНрдореЗрдЯрд┐рдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЕрдзрд┐рдХ рд╣реИред

рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░рд┐рдкрддреНрд░ рд╣реИ рдпрджрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП start(::Iterable) рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдРрд╕реА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рд╣рдо рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕реЗ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рд╕рдмрдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдЗрд╕ рдЪрдХреНрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ 100% рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рд░рд▓ рдЪрдХреНрд░ рдкрд╣рдЪрд╛рди рдЗрд╕реЗ рдареАрдХ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд▓рдЧрддрд╛ рд╣реИред

рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ:

| рдЗрдирдкреБрдЯ | рдкрд░рд┐рдгрд╛рдо |
| --- | --- |
| рдкреА (рд╕рдВрдШ, Unionall, tvar) | рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдо рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ |
| рдкреА тИй рдХреНрдпреВ | рдкреА |
| рдкреА рдЯреА | рдЯреА |

P Q рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

  1. рдкреА рдпрд╛ рдХреНрдпреВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдХреЗ рдЕрдзрд┐рдХ рдЕрдиреБрдорд╛рдирд┐рдд (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬреЛ рднреА рдкрд╣рд▓реЗ рд╢рдмреНрджрд╛рд╡рд▓реА рд╣реИ)ред рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдзреНрд╡рдирд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╣реАрдВ рдФрд░ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  2. рдПрдХ рдирдпрд╛ рдПрдб-рд╣реЙрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд▓реМрдЯрд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рдкреА рдФрд░ рдХреНрдпреВ рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХрд╛ рд╕рдВрдШ рд╢рд╛рдорд┐рд▓ рд╣реИред
  3. рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдкреНрд░рдХрд╛рд░ред рд╢рд╛рдпрдж рдХреЗрд╡рд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рддрдХ рд╣реА рд╕реАрдорд┐рдд рд╣реИред

рдкреА тИй рдЯреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИред T рдПрдХ рдЕрдЪреНрдЫрд╛ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╕рдиреНрдирд┐рдХрдЯрди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЧреИрд░-рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рдХрд╛рд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ "рдЫреЛрдЯреЗ" рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдХрд┐ рд╡реЗ рдЖрдкрдХреЛ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдПрдХ рдХреНрд╖реЗрддреНрд░ рддрдХ рд╕реАрдорд┐рдд рд░рдЦрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ (рдЪреВрдВрдХрд┐ рдХреЛрдИ рднреА рдкреНрд░рдХрд╛рд░ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ) ) рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдмреЗрд╣рддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЯрд╛рд▓рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдУрд╡рд░рд╣рд╛рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╡рд░реНрдо-рдХреИрди рдХреЗ рдмрд╛рдж рд╡рд░реНрдо-рдХреИрди рдЦреЛрд▓рддрд╛ рд╣реИред

рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛: P рдХреЗрд╡рд▓ Q рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ рдЬрдм P<:Qред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдкреА тИй рдХреНрдпреВ рд╣рдореЗрд╢рд╛ рдЧреИрд░-рд░рд┐рдХреНрдд рд╣реЛрддрд╛ рд╣реИ, рдПрдХ рд╣реА рд╕реНрд▓реЙрдЯ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдЕрдХреНрд╕рд░ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛрддреА рд╣реИрдВ, рдЬреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдк рдХрд╣реЗрдВрдЧреЗ "рдЕрдЧрд░ рдПрдХреНрд╕ рдЗрдЯреЗрдмрд▓ рд╣реИ рддреЛ рдРрд╕рд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдПрдХреНрд╕ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рддреЛ рдХрд░реЗрдВ рд╡рд╣")ред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рдВрдмрджреНрдз рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╢рд╛рдпрдж рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

#13412 рдХреЗ рдмрд╛рдж, рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ UnionAll _ рдХреЗ рд░реВрдк рдореЗрдВ рдЯрдкрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдШ рдкрд░ "рдПрдиреНрдХреЛрдбреЗрдб" рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдЖрдВрддрд░рд┐рдХ рдЯрдкрд▓ рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ рдкреНрд░рд╢реНрди рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ)ред рдпрд╣ рдЙрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛ рдПрдХ рд▓рд╛рдн рд╣реИ рдЬреЛ рдореБрдЭреЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рд╣реБрдЖ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕реНрд╡рддрдГ рд╣реА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдмреЗрд╢рдХ, рдпреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ "рдПрдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░" рд╢реИрд▓реА рд╣реИрдВред рдореБрдЭреЗ рдЗрд╕рдХреА рд╕рд╛рджрдЧреА рдкрд╕рдВрдж рд╣реИ, рд╕рд╛рде рд╣реА рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдореВрд╣реЛрдВ рдХреЛ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдврдВрдЧ рд╕реЗ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ T <: Iterable ред

рдЕрддреАрдд рдореЗрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдереАрдВ, x-ref https://github.com/JuliaLang/julia/issues/5#issuecomment -37995516ред

рдХреНрдпрд╛ рд╣рдо рд╕рдорд░реНрдерди рдХрд░реЗрдВрдЧреЗ, рдЙрджрд╛

protocol Iterable{T}
    start(::_)::T
    done(::_, state::T)
    next(::_, state::T)
end

рд╡рд╛рд╣, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдкрд╕рдВрдж рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ @ рдХреЗрдиреЛ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕рд╛рде)!

+1 рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ!

@ рдХреЗрдиреЛ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрдкрдЧреНрд░реЗрдб рдкрде рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реИрдВред рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЬреБрдбрд╝реА рдХреЛрдИ рднреА рдЪреАрдЬ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрд╣реБрдд рд╣реА рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрд╡рдпрдВ рдЕрд╡рдзрд╛рд░рдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдареАрдХ рд╣реИ рдФрд░ рдпрд╣ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рдпреЛрдЬрдирд╛ рдореЗрдВ рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЬреВрддрд╛-рд╕реАрдВрдЧ (рдЬреИрд╕реЗ рдУ (1) рд╕рд░рдгреА-рдЬреИрд╕реА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд░реИрдЦрд┐рдХ рдЕрдиреБрдХреНрд░рдордг) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк hassomeproperty(::T) = true (рд▓реЗрдХрд┐рди _not_ hassomeproperty(::Any) = false ) рдЬреИрд╕реА рдПрдХ рдбрдореА рд╡рд┐рдзрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж

protocol MyProperty
hassomeproperty(::_)
end

рдХреНрдпрд╛ _ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рд╣реА рд╡рд┐рдзрд┐ рдореЗрдВ рдХрдИ рдмрд╛рд░ рдкреНрд░рдХрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ

protocol Comparable
  >(::_, ::_)
  =(::_, ::_0
end

рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рд╣реА рд╡рд┐рдзрд┐ рдореЗрдВ _ рдХрдИ рдмрд╛рд░ рдкреНрд░рдХрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рд╣рд╛рдВред рдЖрдк _ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдореНрдореАрджрд╡рд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред

@JeffBezanson рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рддрддреНрдкрд░ рд╣реИрдВред рдореЗрд░реЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдиреЛрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА 'рджреВрд░рд╕реНрдерддрд╛' рд╣реИред рдЙрд╕рдореЗрдВ рдореИрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЗрдЦрдХ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ/рдХрд╕реНрдЯрдо рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рд╕рдордп рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП @eval )? рдлрд┐рд░ рдХреНрдпрд╛ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдк-рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдЬрд╛рдирдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░реЗрд╖рдг рд╕реЗ рдмрдЪрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдХреВрд▓рди рдХреЛ рд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

рд╣рд╛рдВ, рдпрд╣ #265 рдХреЛ рдмрджрддрд░ рдмрдирд╛ рджреЗрддрд╛ рд╣реИ :) рдпрд╣ рд╡рд╣реА рдореБрджреНрджрд╛ рд╣реИ рдЬрд╣рд╛рдВ рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдкреНрд░реЗрд╖рдг рдФрд░ рдЬреЗрдирд░реЗрдЯ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдмрд╕ рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╕рд╛рдеред

рдЗрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реБрдП рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ! рдмреЗрд╢рдХ, рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдмрд╣реБ-рдкреИрд░рд╛рдореАрдЯрд░ рд▓рдХреНрд╖рдг рдЖрдЧреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИрдВред рд▓реЗрдХрд┐рди 95% рд▓рдХреНрд╖рдг рд╢рд╛рдпрдж рд╡реИрд╕реЗ рднреА рдПрдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдВрдЧреЗред рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рд╡реЗ рдХрдИ рдкреНрд░реЗрд╖рдг рдХреЗ рд╕рд╛рде рдЗрддрдиреА рдЕрдЪреНрдЫреА рддрд░рд╣ рдлрд┐рдЯ рд╣реЛрдВрдЧреЗ! рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдлрд┐рд░ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд░реНрдпрд╛рдкреНрдд рдХрдердиред

рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА:

@ рдХреЗрдиреЛ (рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЗрдл рдХреЗ рдореВрд▓ рдореЗрдВ state ) рдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЛ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡реЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд┐рдирд╛ рднреА рдЙрдкрдпреЛрдЧреА рд╣реИрдВред рдЬрдВрдЧ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рдореИрдиреБрдЕрд▓ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реИ ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдПрдХ рдЕрдЪреНрдЫреЗ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд░рд╕реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: Iterable рдкрд░ рдкреНрд░реЗрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ T рд╣реИред

рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, method_exists рдЗрд╕ (#8959) рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрд╡рд░реВрдк рдореЗрдВ рдЕрдиреБрдкрдпреЛрдЧреА рд╣реИред рд▓реЗрдХрд┐рди рд╕рдВрднрд╡рдд: рдпрд╣ #8974 (рдпрд╛ рдЗрд╕рдХреЗ рд╕рд╛рде) рдореЗрдВ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖рддрд╛-рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдЦрд┐рд▓рд╛рдл рдорд┐рд▓рд╛рди рд╡рд┐рдзрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ Traits.jl рдХрд░рддреЗ рд╕рдордп рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рдкрд╛рдпрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдФрд░ vararg рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЦрд╛рддреЗ ( рджреЗрдЦреЗрдВ )ред

рд╕рдВрднрд╡рддрдГ рд╡рд┐рд░рд╛рд╕рдд рднреА рд╕рдВрднрд╡ рд╣реЛрдЧреА?

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рддрдВрддреНрд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХреНрд▓рд╛рд╕рд┐рдХ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЗрд╡рд▓ = , < , > , <= , >= рджреЛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╢рд╛рдпрдж рдпрд╣реА рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЬреЗрдл рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЪрдХреНрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реБрдП, start(::Indexable) = 1 рдФрд░ done(i::Indexable,state)=length(i)==state рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╕реЗ рд╡реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрди рдЬрд╛рдПрдВрдЧреЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрдИ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХреЗрд╡рд▓ next рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдЕрдЪреНрдЫреЗ рдЕрдВрдХред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ Iterable{T} рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдХреБрдЫ рдЕрд▓рдЧ рд╣реИрдВред рдореЗрд░реЗ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ, рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗрд╡рд▓ рдЕрдВрджрд░ рд╕рдм рдХреБрдЫ рдкрд░ рдореМрдЬреВрдж рд╣реЛрдЧрд╛ --- "рдХреНрдпрд╛ рдХреЛрдИ рдЯреА рдореМрдЬреВрдж рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдлреВ рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ?"ред

рд╣рд╛рдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ protocol Foo <: Bar, Baz рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдмрд╕ рдмрд╛рд░ рдФрд░ рдмрд╛рдЬ рд╕реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдлреВ рдореЗрдВ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдмрд╣реБ-рдкреИрд░рд╛рдореАрдЯрд░ рд▓рдХреНрд╖рдг рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реЛрдЪрдирд╛ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЖрдкрдХреЗ рдкрд╛рд╕ TypePair{A,B} <: Trait рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдирд╣реАрдВ рд▓рдЧрддрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ (рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрд▓реЛрдЬрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрд╡рд┐рдлреНрдЯ рдХреА рддрд░рд╣ рд╣реИред

рдирд╛рдордорд╛рддреНрд░ (рдкреНрд░рдХрд╛рд░) рдФрд░ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ (рдкреНрд░реЛрдЯреЛрдХреЙрд▓) рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ (рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИ) рдорд┐рд╢реНрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ (рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдХреЗ рднреНрд░рдо рдХрд╛ рд╕реНрд░реЛрдд)ред

рдореИрдВ рдореИрде/рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╢рдХреНрддрд┐ рдкрд░ рднреА рдереЛрдбрд╝рд╛ рд╕рдВрджреЗрд╣ рдХрд░рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ (рдореИрдЯреНрд░рд┐рдХреНрд╕ рдСрдкрд░реЗрд╢рдВрд╕) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЛрдЪрдирд╛ рдЗрдЯрд░реЗрд╢рди рд╕реЗ рдЕрдзрд┐рдХ рдЬреНрдЮрд╛рдирд╡рд░реНрдзрдХ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП core.matrix рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреЗрдЦреЗрдВред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдБ; рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдПрдХрддреНрд░ рдХрд░рдиреЗ рдЪрд╛рд╣рд┐рдП рдФрд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╡реЗ рд╡рд╣реА рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдЗрд╕рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдирд╛рдорд╕реНрдерд╛рди рд╣реЛрдВрдЧреЗ рдЬреЛ рдЙрдирдХреЗ рддрд░реАрдХреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ? рдпрд╛рдиреА рдЬрдм рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ

protocol Iterable
    start(::_)
    done(::_, state)
    next(::_, state)
end

рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ start , done рдФрд░ next рдФрд░ рдЙрдирдХреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпреЛрдЧреНрдп рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП Iterable.start , Iterable.done рд╣реЛрдирд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдкреНрд░рддреАрдд рд╣реЛрдЧрд╛ред Iterable.next ред рдПрдХ рдкреНрд░рдХрд╛рд░ Iterable рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ рд▓реЗрдХрд┐рди Iterable рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред рдореИрдВрдиреЗ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдерд╛ (рдЕрдм рдЗрд╕реЗ рдирд╣реАрдВ рдвреВрдВрдв рд╕рдХрддрд╛), рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рддрд░рдл рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣ рдХрд░рддреЗ рд╣реИрдВ:

implement T <: Iterable
    # in here `start`, `done` and `next` are automatically imported
    start(x::T) = something
    done(x::T, state) = whatever
    next(x::T, state) = etcetera, nextstate
end

рдпрд╣ " рджреВрд░рд╕реНрдерддрд╛ " рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░реЗрдЧрд╛ @mdcfrancis рдиреЗ рдХрд┐рдпрд╛ рд╣реИ, рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░, рдореБрдЭреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ "рдЧрд▓рддреА рд╕реЗ" рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХрд╛ рд▓рд╛рдн рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдлрд╛рдпрджреЗрдордВрдж рд╣реИ, @mdcfrancis? рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдЗрд╕рдореЗрдВ рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЧреЛ рдбрдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЬреЛ рдЬреВрд▓рд┐рдпрд╛ рдХрд░ рд╕рдХрддреА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣реЛрдиреЗ implement рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рд╕рднреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдЦрддреНрдо рдХрд░реЗрдЧрд╛ import рдХреЗ рдмрдЬрд╛рдп using , рд╡реНрдпрд╛рдкрдХ рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛ред

рдореИрдВрдиреЗ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдерд╛ (рдЕрдм рдЗрд╕реЗ рдирд╣реАрдВ рдвреВрдВрдв рд╕рдХрддрд╛)

рд╢рд╛рдпрдж https://github.com/JuliaLang/julia/issues/6975#issuecomment -44502467 рдФрд░ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ https://github.com/quinnj/Datetime.jl/issues/27#issuecomment -31305128? (рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ https://github.com/JuliaLang/julia/issues/6190#issuecomment-37932021ред)

рд╣рд╛рдБ, рдмрд╕ рдЗрддрдирд╛ рд╣реАред

@StefanKarpinski рддреНрд╡рд░рд┐рдд рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ,

  • рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗрд╡рд▓ рдЖрдзрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд╛ рдЬреЛрдбрд╝рдХрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рд╕рднреА рдореМрдЬреВрджрд╛ рд╡рд░реНрдЧреЛрдВ рдХреЛ 'рд▓рд┐рдлреНрдЯ' рдХрд░реЗрдЧрд╛ред
  • рдЕрдЧрд░ рдореИрдВ MyModule.MySuperIterable рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рддрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмреЙрдпрд▓рд░ рдкреНрд▓реЗрдЯ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
  • рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдк рдЬреЛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рд╡рд╣ рджреВрд░рджрд░реНрд╢рд┐рддрд╛ рдХрд╛ рдкреНрд░рддрд┐рдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рд╕реАрдзрд╛ рд╕рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЙрд╕реА рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рд▓рд┐рдЦрдиреЗ рд╣реЛрдВрдЧреЗред

рдпрджрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рд░рд╛рд╕рдд рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рдереА, MySuperIterabe,
рдореМрдЬреВрджрд╛ рддрд░реАрдХреЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╕.рдЗрдЯрд░реЗрдмрд▓ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдореБрджреНрджрд╛ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рддрд░реАрдХреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ a
рдкреНрд░реЛрдЯреЛрдХреЙрд▓, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рд╢реБрд░реВ рд╕реЗ рдПрдХ рд╕рдордЧреНрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реЛред

@mdcfrancis - рдкрд╣рд▓рд╛ рдмрд┐рдВрджреБ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЬреЛ рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдХрд┐рд╕реА рднреА рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рдирд╣реАрдВ

рдХреНрдпрд╛ рдЖрдк MyModule.MySuperIterable рдкреЙрдЗрдВрдЯ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВ рдирд╣реАрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрдмреЛрд╕рд┐рдЯреА рдХрд╣рд╛рдВ рд╕реЗ рдЖрддреА рд╣реИред рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

protocol Enumerable <: Iterable
    # inherits start, next and done; adds the following:
    length(::_) # => Integer
end

рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ @ivarne рдиреЗ рдХрд╣рд╛ рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рдореЗрд░реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдирд╛рдорд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИрдВ, рдХреЗрд╡рд▓ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрдпрд╛рди рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдХреЛрд░ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪреАрдиреА рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдореЙрдбреНрдпреВрд▓ рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рдВрдпреЛрдЬрди рддрдХ рдлреИрд▓рддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

module Iterable

function start end
function done end
function next end

jeff_protocol the_protocol
    start(::_)
    done(::_, state)
    next(::_, state)
end

end

рдлрд┐рд░ рдЙрди рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ Iterable рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо Iterable.the_protocol ред

рдореБрдЭреЗ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╕рдВрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ jeff/mdcfrancis рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдпрд╣рд╛рдВ рдмрд╛рдХреА рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╣реА рдСрд░реНрдереЛрдЧреЛрдирд▓ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рддрдХ рдЖрдк рдореБрдЭреЗ "рдЬреВрд▓рд┐рдпрди" рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ, рддрдм рддрдХ "рдПрдХреНрд╕ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреНрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд╛рдИ" рдХрд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдХреНрдпреЛрдВ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдпрд╛ рдФрд░ рдХрдм рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣рд╛рдВ рдЙрдард╛рдП рдЧрдП рдкреНрд░рд╢реНрди рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░ рд╕рдХрддрд╛

рдореЗрд░реЗ рдкрд╛рд╕ рддрдХрдиреАрдХреА рдЖрдзрд╛рд░ рдкрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рдЬрдВрдЧрд▓реА рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ "рдкреНрд░реЛрдЯреЛрдХреЙрд▓" рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ (рдкреНрд░рдХрд╛рд░) рдПрдХ рд╕реЙрд▓реНрд╡рд░ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ JuMP рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

https://github.com/JuliaOpt/JuMP.jl/blob/master/src/solvers.jl#L223 -L246

        # If we already have an MPB model for the solver...
        if m.internalModelLoaded
            # ... and if the solver supports updating bounds/objective
            if applicable(MathProgBase.setvarLB!, m.internalModel, m.colLower) &&
               applicable(MathProgBase.setvarUB!, m.internalModel, m.colUpper) &&
               applicable(MathProgBase.setconstrLB!, m.internalModel, rowlb) &&
               applicable(MathProgBase.setconstrUB!, m.internalModel, rowub) &&
               applicable(MathProgBase.setobj!, m.internalModel, f) &&
               applicable(MathProgBase.setsense!, m.internalModel, m.objSense)
                MathProgBase.setvarLB!(m.internalModel, copy(m.colLower))
                MathProgBase.setvarUB!(m.internalModel, copy(m.colUpper))
                MathProgBase.setconstrLB!(m.internalModel, rowlb)
                MathProgBase.setconstrUB!(m.internalModel, rowub)
                MathProgBase.setobj!(m.internalModel, f)
                MathProgBase.setsense!(m.internalModel, m.objSense)
            else
                # The solver doesn't support changing bounds/objective
                # We need to build the model from scratch
                if !suppress_warnings
                    Base.warn_once("Solver does not appear to support hot-starts. Model will be built from scratch.")
                end
                m.internalModelLoaded = false
            end
        end

рдХреВрд▓, рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИред рдХреНрдпрд╛ рдпрд╣ m.internalModel рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдЬреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рджреЛрдиреЛрдВ рддрд░реНрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ?

рд╣рд╛рдВ, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП m.internalModel рд▓рд┐рдП рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЕрдиреНрдп рддрд░реНрдХ рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рд┐рд░реНрдл рд╡реИрдХреНрдЯрд░ рд╣реИрдВред

рд╣рд╛рдВ, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП m.internalModel рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ

рдЬрдВрдЧрд▓реА рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЦреЛрдЬрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╢рд╛рдпрдж applicable рдФрд░ method_exists рдХреЙрд▓ рдХреА рдЦреЛрдЬ рдХрд░рдирд╛ рд╣реИред

рдЕрдореГрдд рднреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ (рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рд╣рдЯрдХрд░) рдХрд╛рдлреА рд╕реАрдорд┐рдд рд▓рдЧрддреА рд╣реИред

рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдХреНрдпрд╛ рд╕рдВрдмрдВрдз рд╣реЛрдЧрд╛? рдореВрд▓ рд╕рдорд╕реНрдпрд╛ рд╡рд┐рд╡рд░рдг рдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдПрдХ рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдЬреИрд╕рд╛ рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ (рдЕрдм рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ) рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЬрдм рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд┐рд╕реА рднреА рддрд░реАрдХреЗ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрджрд╛рдиреБрдХреНрд░рдо рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред

рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкреНрд░рд╢реНрдиред рд╡рд╣рд╛рдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛рдлреА рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╣реИрдВ, рднрд▓реЗ рд╣реА рд╡реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдореВрд╣рдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рджреЛрдиреЛрдВ рддрд░реАрдХреЗ рд╣реИрдВред рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдирд╛рдордорд╛рддреНрд░ рд╣реИрдВ; рд╡реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реЗрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЯреИрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╣реИрдВ; рдХреЛрдИ рд╡рд╕реНрддреБ рд╕рдореБрдЪреНрдЪрдп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрддреА рд╣реИ рдпрджрд┐ рдЙрд╕рдореЗрдВ рдХреБрдЫ рдЧреБрдг рд╣реЛрдВред рддреЛ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ

  1. рдмрд╕ рджреЛрдиреЛрдВ рд╣реЛред
  2. рдПрдХ рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд╛рдХрд┐ рдЬрдм рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдЦреБрдж рдХреЛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░реЗ, рддреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдПред
  3. рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВред

рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ (2) рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рдЪрд╛рдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдирд╛рдордорд╛рддреНрд░ рдФрд░ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рд╕рдВрдпреЛрдЬрди рд╣реИред

рдПрдХ рдЪреАрдЬ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдЙрдирдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд▓рдЧрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП convert(AbstractArray{Int}, x) рд▓рд┐рдЦрдирд╛ред рдпрджрд┐ AbstractArray рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдереЗ, рддреЛ рддрддреНрд╡ рдкреНрд░рдХрд╛рд░ Int рдХреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, _aside_ рдЬрд┐рд╕рд╕реЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддреЛ AbstractArray{T} рдФрд░ AbstractArray{S} рд╕рдорд╛рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдЕрднреА рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдирд╛рдордорд╛рддреНрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИред рддреЛ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдирд╛рдордорд╛рддреНрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рддреЛ рдХреНрдпрд╛ 2. рд╣рдореЗрдВ рдХрдИ рдЕрдореВрд░реНрдд рд╡рд┐рд░рд╛рд╕рдд рджреЗрдВрдЧреЗ?

рддреЛ рдХреНрдпрд╛ 2. рд╣рдореЗрдВ рдХрдИ рдЕрдореВрд░реНрдд рд╡рд┐рд░рд╛рд╕рдд рджреЗрдВрдЧреЗ?

рдирд╣реАрдВред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдПрдХреАрдХреГрдд рдпрд╛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рд╕реБрд╡рд┐рдзрд╛ рдореЗрдВ рдЕрднреА рднреА рдЧреБрдг рд╣реЛрдВрдЧреЗред

рдореБрдЭреЗ рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХрдИ рдЕрдореВрд░реНрдд рд╡рд┐рд░рд╛рд╕рдд рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЕрднреА рддрдХ рдПрдХ рдФрд░ рд▓рдЧрднрдЧ-рдСрд░реНрдереЛрдЧреЛрдирд▓ рдбрд┐рдЬрд╝рд╛рдЗрди рдирд┐рд░реНрдгрдп рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдореВрд░реНрдд рдирд╛рдордорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ (1) рдЖрдк рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЦреЛ рд╕рдХрддреЗ рд╣реИрдВ (рд╡реНрдпрдХреНрддрд┐ рдП рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╡реНрдпрдХреНрддрд┐ рдмреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдП рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди), (2) рдЖрдк рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЙрдкрдкреНрд░рдХрд╛рд░ рдЦреЛ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдореМрдЬреВрджрд╛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдирд┐рд╣рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ рдЙрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ: ndims{T,n}(::AbstractArray{T,n}) = n рдФрд░ рдХрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдп рднреА рдХрд░рддреЗ рд╣реИрдВред

рддреЛ, рдПрдХ рдирдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ + рдЕрдореВрд░реНрдд рд╡рд┐рд░рд╛рд╕рдд рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ AbstractArray{T,N} рдФрд░ ProtoAbstractArray ред рдЕрдм рдПрдХ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдирд╛рдордорд╛рддреНрд░ рд░реВрдк рд╕реЗ AbstractArray рдЙрд╕реЗ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ T рдФрд░ N рдкреИрд░рд╛рдореАрдЯрд░ рдХреНрдпрд╛ рд╣реИрдВ, рд╕рдВрднрд╡рддрдГ рд╣рд╛рд░реНрдб-рдХреЛрдбрд┐рдВрдЧ eltype рдФрд░ ndims ред рдлрд┐рд░ AbstractArray s рдкрд░ рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрдЬрд╛рдп eltype рдФрд░ ndims рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рддреЛ, рд╢рд╛рдпрдж рдпрд╣ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рднреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдареЛрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрднреА рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред)

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, @malmaud рдХреА рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдореВрд╣: https://github.com/JuliaLang/julia/issues/6975#issuecomment -161056795 рдирд╛рдордорд╛рддреНрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд╕рдорд╛рди рд╣реИ: рд╕рдореВрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рдХрд╛рд░ рдЪреБрдирдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реИ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ (рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп) рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред рддреЛ рд╢рд╛рдпрдж рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛рдлреА рд╣рдж рддрдХ рдУрд╡рд░рд▓реИрдк рдХрд░рддреЗ рд╣реИрдВ?

рд╣рд╛рдВ, рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИрдВ, рдФрд░ рдХреБрдЫ рд╣рдж рддрдХ eltype рдФрд░ ndims рд╕рд╛рде рдмреЗрдорд╛рдиреА рд╣реИрдВред рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рд╕реАрдзреЗ рдЙрди рдкрд░ рдкреНрд░реЗрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╣рдо рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓/рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реЛрдВрдЧреЗред рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ? рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдпрд╣ рд╡рд┐рдзрд┐ рдХреЙрд▓рд┐рдВрдЧ рд╕реЗ рдХрдордЬреЛрд░ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЙрдк-рдЯрд╛рдЗрдкрд┐рдВрдЧ рдФрд░ рд╡рд┐рдзрд┐ рдХреЙрд▓рд┐рдВрдЧ рдХреЗ рдмреАрдЪ рдЧреЛрд▓рд╛рдХрд╛рд░ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

рд╢реЗрд╖ рдкреНрд░рд╢реНрди рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирдиреЗ рдХреЗ рдмрд┐рдирд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рддрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рдФрд░ рдЕрдиреБрдХреНрд░рдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп "рд╕реНрдХреЗрд▓рд░" рдорд╛рддреНрд░рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХрд┐рддрдиреА рдмрд╛рд░ рдЙрдарддрд╛ рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВ рдЖрдкрдХреЗ "рд╡рд┐рдзрд┐ рдХреЙрд▓рд┐рдВрдЧ" рдХрдерди рдХреЛ рдХрд╛рдлреА рд╕рдордЭрддрд╛ рд╣реВрдВред рддреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реБрдЭрд╛рд╡ рд╡рд╣ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдиреЗ рдорд╛рдВрдЧрд╛ рдерд╛:

protocol PAbstractArray{T,N}
    size(_)
    getindex(_, i::Int)
    ...
end

type MyType1
    a::Array{Int,1}
    ...
end

impl MyType for PAbstractArray{Int,1}
    size(_) = size(_.a)
    getindex(_, i::Int) = getindex(_.a,i)
    ...
end

# an implicit definition could look like:
associatedT(::Type{PAbstractArray}, :T, ::Type{MyType}) = Int
associatedT(::Type{PAbstractArray}, :N, ::Type{MyType}) = 1
size(mt::MyType) = size(mt.a)
getindex(mt::MyType, i::Int) = getindex(mt.a,i)


# parameterized type
type MyType2{TT, N, T}
    a::Array{T, N}
    ...
end

impl MyType2{TT,N,T} for PAbstractArray{T,N}
    size(_) = size(_.a)
    getindex(_, i::Int) = getindex(_.a,i)
    ...
end

рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреЛ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпрд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджрд┐рдпрд╛ рдЧрдпрд╛

protocol PAbstractArray{eltype,ndims}
    size(_)
    getindex(_, i::Int)
    ...
end

protocol Indexable{eltype}
    getindex(_, i::Int)
end

рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ PAbstractArray{Int,1} <: Indexable{Int} ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рд╢рд╛рдпрдж рдЙрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рднреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ eltype(x) рдХреЛ eltype рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ x рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓реМрдЯрд╛ рджреЗрддреА рд╣реИред

рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ impl рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рд╡рд┐рдзрд┐ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдбрд╛рд▓рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдПрдХ рд╡рд┐рдзрд┐ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрдИ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИред

рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдЕрдм рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред AbstractArray{T,N} рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрди рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХрд╛рдзрд┐рдХ рд╡рд┐рд░рд╛рд╕рдд (рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ) рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдареЛрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рдиреЗ рдХреА рдЕрд╕рдВрднрд╡рддрд╛ (рдЬреЛ рдХрд┐ рдПрдХ рд╢рд┐рдХрд╛рдпрдд рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдХрднреА-рдХрднреА рдирд╡рд╛рдЧрдВрддреБрдХреЛрдВ рд╕реЗ рд╕реБрдирддреЗ рд╣реИрдВ) рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛: Callable рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╡рд╛рдХрдИ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛:

protocol Callable
    ::TupleCons{_, Bottom}
end

рдЬрд╣рд╛рдВ TupleCons рдЕрд▓рдЧ рд╕реЗ рдПрдХ рдЯрдкрд▓ рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдФрд░ рдмрд╛рдХреА рддрддреНрд╡реЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рддрдм рддрдХ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ _ рд▓рд┐рдП рд╡рд┐рдзрд┐ рддрд╛рд▓рд┐рдХрд╛ рдЧреИрд░-рд░рд┐рдХреНрдд рд╣реИ (рдиреАрдЪреЗ рдкреНрд░рддреНрдпреЗрдХ рддрд░реНрдХ рдЯрдкрд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдк рдкреНрд░рдХрд╛рд░ рд╣реИ)ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ Tuple{a,b} рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ TupleCons{a, TupleCons{b, EmptyTuple}} (рджреЗрдЦреЗрдВ рднреА # 11,242)ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕рдЪ рд╣реИ, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдорд╛рддреНрд░рд╛рдмрджреНрдз рд╣реИрдВ _ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде_ рдЗрд╕рд▓рд┐рдП рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реАрдзреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИрдВред

@jakebolewski рдХреНрдпрд╛ рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ? рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рд╡реЗ рдХрднреА рднреА рдПрдХ рдЬреИрд╕реЗ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ; рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рд╕рд╡рд╛рд▓ рдЕрдзрд┐рдХ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдПрдХ рдорд╛рд▓рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рд╣рдо рджреЛрдиреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рдпрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдорд╛рдореВрд▓реА рдЬрдЯрд┐рд▓ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдПрдиреНрдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐:

typealias BigMatrix тИГT, T <: Union{BigInt,BigFloat} AbstractArray{T,2}

рдирд╛рдордорд╛рддреНрд░ рдХреА рд╣рд░ рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рдЧрдгрдирд╛ рдХрд┐рдП рдмрд┐рдирд╛?

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд Protocol рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрдореВрд░реНрдд рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдЦреНрддреА рд╕реЗ рдХрдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдкреВрд░реНрдг рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рдерд╛ (рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдбрд┐рдЬрд╛рдЗрди рдХреЛ рдЗрд╕рдХреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕реАрдорд╛рдУрдВ рддрдХ рдЦреАрдВрдЪрдирд╛):

BigMatrix = тИГT, T<:Union{BigInt, BigFloat} protocol { eltype = T, ndims = 2 }

рдЕрд╡рд▓реЛрдХрди рдХреЗ рд╕рд╛рде рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдпрд╛ рдирд╛рдорд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреБрдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде, рд╣рдо рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рдХрдЯ-рд╕рдВрдЧрддрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

AbstractArray = тИГT тИГN protocol { eltype=T, ndims=N }

рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рдХреНрдЪрд░рд▓ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдореБрдЭреЗ рдХрднреА рднреА рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди _types_ рдХреЗ рдЧреБрдгреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рдмрд╣реБрдд рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдпрд╣ рднреА рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреА рд╣реИрдЪ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рджреЛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдЦрд╛рд▓реА рд╣реИ рдпрджрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рдорд╛рди рд╣реИрдВред рддреЛ рдЕрдЧрд░ рд╣рдо рдПрдХ рд╕реНрдкрд╖реНрдЯ Number рдкреНрд░рдХрд╛рд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

protocol Number
    super = Number
    +(_, _)
    ...
end

рдпрд╣ super рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реИред

рдореБрдЭреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдиреЛрдЯреНрд╕ рд╣реИрдВред

рд▓реЗрдХрд┐рди рддрдм рдореИрдВ рд╕рдм рдХреБрдЫ рдЧрд▓рдд рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЬреВрд▓рд┐рдпрд╛ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдореИрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рдореБрдЭреЗ рдЕрднреА рддрдХ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреА рдкреВрд░реА рд╕рдордЭ рдирд╣реАрдВ рд╣реИред

(рдП) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдФрд░ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ @ рдореМрд░реЛ 3 рдКрдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХрд╛рдзрд┐рдХ рдкреНрд░реЗрд╖рдг рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдПрдХрд╛рдзрд┐рдХ рдкреНрд░реЗрд╖рдг рдХреНрдпрд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ! рдореИрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдмрд╛рдж рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдХреНрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╛рд░ "рдХреНрдпрд╛ рдЗрди рджреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреА рдЗрдЬрд╛рдЬрдд рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ"ред рдореБрдЭрд╕реЗ рдЧрд▓рддреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдЙрди рд╕рднреА рдХреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ:

protocol Foo{bar}
    ...
end

protocol Bar{foo<:Foo}
   ...
end

рдФрд░ рдпрд╣ рдлреВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдЙрд╕реА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдмрд╛рд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдиреЗ рдХреА рдкреНрд░рдореБрдЦ рд╕рдорд╕реНрдпрд╛ рдХреЛ рднреА рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИред

(рдмреА)

рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ PAbstractArray{Int,1} <: Indexable{Int} рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ _name_ рджреНрд╡рд╛рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдорд┐рд▓рд╛рди рдХреНрдпреЛрдВ рдХрд░рдирд╛ рд╣реИ (рдореИрдВ рдЗрд╕реЗ eltype рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗ рд░рд╣рд╛ рд╣реВрдВ, рдЕрдЧрд░ рдореБрдЭреЗ рдЧрд▓рдд рд╕рдордЭрд╛ рдЧрдпрд╛ рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ)ред рдХреНрдпреЛрдВ рди рдХреЗрд╡рд▓ рд╕рдВрднрд╛рд╡рд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХрд╛ рдорд┐рд▓рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПред рдирд╛рдордХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдореЗрд░реА рдкреНрд░рд╛рдердорд┐рдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ:

module SomeBigLibrary
  # Assuming required definitions

  protocol Baz{el1type}
    Base.foo(_, i::el1type) # say `convert`
    baz(_)
  end
end

module SomeOtherLibrary
  # Assuming required definitions

  protocol Bar{el2type}
    Base.foo(_, i::el2type)
    bar(_)
  end
end

module My
  # Assuming required definitions

  protocol Protocol{el_type} # What do I put here to get both subtypes correctly!
    Base.foo(_, i::el_type)
    SomeBigLibrary.baz(_)
    SomeOtherLibrary.bar(_)
  end
end

рджреВрд╕рд░реА рдУрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗрд╡рд▓ рдЙрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдорд┐рд▓рд╛рди Iterable рдирд╛рдо рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдкреБрдирд░рд╛рд╡рд░реНрддрдиреАрдп рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдн рдирд╣реАрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ (рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рдмрдврд╝рдд рднреА рдирд╣реАрдВ рд▓реЗрддреЗ рд╣реИрдВ)ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ _gain_s рдХреНрдпрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ ...

(рд╕реА) рддреЛ, рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рд╛рдердорд┐рдХ рдЙрджреНрджреЗрд╢реНрдп рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рдирд╛рдорд┐рдд рдкреНрд░рдХрд╛рд░ рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВ рдпрд╣ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реИ рдХрд┐ рд╕реБрдкрд░рд╕реЗрдЯ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рднрд╛рдЧ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ? Number рдкрджрд╛рдиреБрдХреНрд░рдо рдФрд░ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ Signed рдФрд░ Unsigned , рджреЛрдиреЛрдВ Integer рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдХрд╛рдлреА рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВрдЧреЗред рдЙрдирдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЕрдм рд╣рдо рдХреЗрд╡рд▓ Signed рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ negate рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реИрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХрдард┐рди рдЬрд╣рд╛рдВ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Unsigned рдкреНрд░рдХрд╛рд░ рдХреЛ рдирдХрд╛рд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдк super = Number рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рд╣рдо bitstype Int16 <: Signed рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдореЗрд░рд╛ рджреВрд╕рд░рд╛ рдкреНрд░рд╢реНрди рдпрд╣ рднреА рд╣реИ рдХрд┐ рдХреИрд╕реЗ Number рдпрд╛ Signed рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдХрдВрдХреНрд░реАрдЯ рдкреНрд░рдХрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?) Signed ( super = Signed ) рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЗрд╕реЗ Unsigned рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдЪрд┐рд╣реНрдирд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдПрдХ рдЕрдЬреАрдм рд╕рдорд╛рдзрд╛рди рд╣реИ, рдФрд░ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐ рдореБрдЭреЗ рдирд╛рдорд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдЬреАрдм рд▓рдЧрддреЗ рд╣реИрдВред рдпрджрд┐ рджреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реБрдкрд░ рдореЗрдВ рд░рдЦреЗ рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдмрд┐рд▓реНрдХреБрд▓ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рд╡реИрд╕реЗ рднреА рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ? рдФрд░ рдЕрдЧрд░ рдЕрдВрддрд░ рдПрдХ рдмрдбрд╝реЗ рдкреНрд░рдХрд╛рд░ (рдкреНрд░реЛрдЯреЛрдХреЙрд▓) рдХреЗ рд╕рдмрд╕реЗрдЯ рдХреЗ рдмреАрдЪ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ?

(рдбреА) рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдХреБрдЫ рдХреНрд╖рдорддрд╛рдУрдВ (рдЕрдХреНрд╕рд░ рдЕрдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛) рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡реНрдпрдХреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рдЙрди рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣рдореЗрдВ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рд╡рд┐рднрд╛рдЬрди рдХрд░рддреЗ рд╣реИрдВред

рдЬрд┐рд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рд╣рдо рдЕрдХреНрд╕рд░ рдХреВрдж рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ "рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдЕрдиреБрдкрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рдЕрдкрдиреЗ рдЗрд░рд╛рджреЗ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ" рдХреА рддрд░реНрдЬ рдкрд░ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИ (рдкрд░рд┐рдкрддреНрд░ рд╕рдВрджрд░реНрдн, рдкреНрд░рдХрд╛рд░ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рдгреА рд╣реИ рдпрд╛ impl рдмреНрд▓реЙрдХ), рдФрд░ рдореМрдЬреВрджрд╛ рддрд░реАрдХреЛрдВ рдФрд░ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдЕрдЪреНрдЫреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред рдпреЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╡реИрд╕реЗ рднреА рдЕрдореВрд░реНрдд рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдбрд╛рд▓рдиреЗ рд╕реЗ рд░реЛрдХрддреА рд╣реИрдВред

рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ (рдЬреИрд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐) рдореЗрдВ рдЬрдЯрд┐рд▓ рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЪрд╛рд╣реЗ рдЗрд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЖрджреЗрд╢ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП)ред рджреВрд╕рд░реА рдУрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ + рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрдпреЛрдЬрди рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдкрд░ рдЕрдкрдирд╛ рд╣рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рдореЗрдВ рдХреНрд╖рдорддрд╛рдУрдВ (рдХреНрд╖рдорддрд╛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ), рд╡реНрдпрд╡рд╣рд╛рд░ (рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рд╡рд┐рдзрд┐рдпреЛрдВ), рдпрд╛ рджреЛрдиреЛрдВ (рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг) рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рддрд░реАрдХреЗ)ред

(рдИ) рдпрджрд┐ рд╣рдо рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдХрдИ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ (рд╡реЗ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╣реИрдВ) рдФрд░ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХрд╛рдзрд┐рдХ рд╕рд╛рд░ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдмрд┐рдирд╛, рдПрдХ) рд╣рдо рд╢реБрджреНрдз рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рдХрд╛рд░, рд╢реБрджреНрдз рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ + рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрд░реЛрдХреНрдд Signed рдмрдирд╛рдо Unsigned рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИ:

  • рджреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ, рджреЛрдиреЛрдВ рд╕рд╛рдорд╛рдиреНрдп IntegerProtocol (рдЬреЛ рднреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдВрд░рдЪрдирд╛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ, NumberAddingProtocol , IntegerSteppingProtocol , рдЖрджрд┐) рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рдПрдХ AbstractSignedInteger рдФрд░ рджреВрд╕рд░рд╛ рдЗрд╕рд╕реЗ AbstractUnsignedInteger )ред
  • рдлрд┐рд░ Signed рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ (рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реЗ) рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ (рд╕рд╛рд░ рдкрджрд╛рдиреБрдХреНрд░рдо рд╕реЗ) рджреЛрдиреЛрдВ рдХреА рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛рддреА рд╣реИред
  • рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдмрд┐рдирд╛ рдПрдХ AbstractSignedInteger рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп _anyway_ рдирд╣реАрдВ рд╣реИред
  • рд▓реЗрдХрд┐рди рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ (рдФрд░ рдПрдХ рднрд╡рд┐рд╖реНрдп рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рд╣рдо рдЕрдВрддрддрдГ рд▓рд╛рдкрддрд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдХреЗрд╡рд▓ IntegerSteppingProtocol (рдЬреЛ рдХрд┐ рддреБрдЪреНрдЫ рд╣реИ рдФрд░ рдореВрд▓ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдирд╛рдо) рдореМрдЬреВрдж рд╣реИ рдареЛрд╕ AbstractUnsignedInteger рд╣рдо рдЗрд╕рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдиреНрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ Signed рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╢рд╛рдпрдж convert рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рднреАред

рд╕рднреА рдореМрдЬреВрджрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд░рдЦрддреЗ рд╣реБрдП рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ + рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдмрджрд▓рдХрд░, рдФрд░ рдХреБрдЫ рдХреЛ рд╢реБрджреНрдз рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: (рдПрдл) рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдЙрджрд╛рд╣рд░рдг (рднрд╛рдЧ (рдП) рд╕рд╣рд┐рдд)ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ 2 : рдХреБрдЫ рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ ( :< рдмрдЬрд╛рдп <: ), рдПрдХ рдЦрд░рд╛рдм рд╡рд┐рдХрд▓реНрдк рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ ( Foo рдмрдЬрд╛рдп ::Foo )

protocol {T<: Number}(Foo <: AbstractFoo; Bar <: AbstractBar) # Abstract inheritance
    IterableProtocol(::Foo) # Explicit protocol inheritance.

    # Implicit protocol inheritance.
    start(::Bar)
    next(::Bar, state) # These states should really share an anonymous internal type
    done(::Bar, state)

    # Custom method for protocol involving both participants, defines Foo / Bar relationship.
    set(::Foo, ::Bar, v::T)

    # Custom method only on Bar
    bar(::Bar)
end

# Protocols both Foo{T} and Bar{T}.

рдореБрдЭреЗ рдЗрд╕ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ:

  • рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЕрдирд╛рдо рдЖрдВрддрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ (рдЬреИрд╕реЗ рд░рд╛рдЬреНрдп рдЪрд░)ред
  • рд╡рд╛рдкрд╕реА рдХреЗ рдкреНрд░рдХрд╛рд░ред
  • рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

_рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░_ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЗрдХрд╛рдИ рдХреНрдпрд╛ рд╣реИ ред _Protocol_ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЗрдХрд╛рдИ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИ ред рдПрдХ рдкреИрдХреЗрдЬ рдХреЗ рднреАрддрд░, рдпреЗ рджреЛ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рд╡рд┐рдирд┐рдореЗрдп рд╣реИрдВ: рдПрдХ рдЗрдХрд╛рдИ _is_ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ _ред рдФрд░ "рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░" рдЕрдзрд┐рдХ рдкреНрд░рддреНрдпрдХреНрд╖ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рджреЛ рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рдмреАрдЪ, рдПрдХ рдЕрдВрддрд░ рд╣реИ: рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХреНрд▓рд╛рдЗрдВрдЯ "рд╣реИ" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдкрдХрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ "рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ"ред рдпрд╣рд╛рдБ, "рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░" рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдПрдХ рдПрдХрд▓ рдкреНрд░реЗрд╖рд┐рдд рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рд╣реИред рдпрд╣ рдкреИрдХреЗрдЬ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рд╕рд╣рдпреЛрдЧ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдкреИрдХреЗрдЬ рдХреЗ рднреАрддрд░, рдЬрд╣рд╛рдВ рд╕рдВрд╕реНрдерд╛рдПрдВ рдирд┐рдХрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рд╡рд┐рдХрд╛рд╕ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдПрдХрд╛рдзрд┐рдХ рдкреНрд░реЗрд╖рдг рд╕реЗ рд▓рд╛рдн рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ); рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рдмреАрдЪ, рдЬрд╣рд╛рдВ рд╕рдВрд╕реНрдерд╛рдПрдВ рдЕрдзрд┐рдХ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдЦрд┐рдо рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

@ рд░рд╛рдЬрдорд┐рд╕реНрддреНрд░реА

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдирд╛рдо рд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдорд┐рд▓рд╛рди рдХреНрдпреЛрдВ рдХрд░рдирд╛ рд╣реИ

рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдирд╛рдо рд╕реЗ рдорд┐рд▓рд╛рди рдХрд░рдирд╛ _as рдХреЗ рд╡рд┐рдкрд░реАрдд_ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдорд┐рд▓рд╛рди рдХрд░рдирд╛ред рдпреЗ рдирд╛рдо рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдмрдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд░рд┐рдХреЙрд░реНрдб рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ

protocol Collection{T}
    eltype = T
end

рдлрд┐рд░ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ eltype рдХреА рдПрдХ рдЙрдк-рдкреНрд░рдХрд╛рд░ рд╣реИ Collection ред рдЗрди "рдкреИрд░рд╛рдореАрдЯрд░" рдХрд╛ рдХреНрд░рдо рдФрд░ рд╕реНрдерд┐рддрд┐ рдХреЛрдИ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддреАред

рдпрджрд┐ рджреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реБрдкрд░ рдореЗрдВ рд░рдЦреЗ рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдмрд┐рд▓реНрдХреБрд▓ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рд╡реИрд╕реЗ рднреА рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ? рдФрд░ рдЕрдЧрд░ рдЕрдВрддрд░ рдПрдХ рдмрдбрд╝реЗ рдкреНрд░рдХрд╛рд░ (рдкреНрд░реЛрдЯреЛрдХреЙрд▓) рдХреЗ рд╕рдмрд╕реЗрдЯ рдХреЗ рдмреАрдЪ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ?

рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рдмрд┐рдВрджреБ рд╣реИред рдирд╛рдорд┐рдд рдкреИрд░рд╛рдореАрдЯрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдИ рдЧреБрдгреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛рддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╣рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рджреЛрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдлрд┐рд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдПрдХреАрдХреГрдд рдФрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЬрдм рдЖрдк рд╡рд░реНрддрдорд╛рди рдореЗрдВ type Foo <: Bar рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрд┐рд╕реА рд╕реНрддрд░ рдкрд░ рдЖрдкрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЛ рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ Foo.super === Bar рд╕реЗрдЯ рд╣реИред рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреБрдВрдЬреА/рдореВрд▓реНрдп рдЬреЛрдбрд╝реЗ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рдЖрдк рд╕рдВрдмрджреНрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

"рдкреНрд░рдХрд╛рд░реЛрдВ рдиреЗ рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдЕрдиреБрдкрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рдЕрдкрдиреЗ рдЗрд░рд╛рджреЗ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рд╣реИ"

рд╣рд╛рдВ, рдореИрдВ рдЙрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрдирд╛рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реВрдВред

рдпрджрд┐ рд╣рдо рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдХрдИ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ ... рдФрд░ рдХрдИ рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "рдЯреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреА рдХрд╛ рдЙрдк рдкреНрд░рдХрд╛рд░ рд╣реИ рдпрджрд┐ рдЗрд╕рдореЗрдВ рдПрдХреНрд╕, рд╡рд╛рдИ, рдЬреЗрдб рд╣реИ, рдФрд░ рдЦреБрдж рдХреЛ рд╕рд╛рд░ рдПрд░реЗ рдХрд╛ рдЙрдк рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ"? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ "рдкреНрд░реЛрдЯреЛрдХреЙрд▓ + рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрдЯ рдЯрд╛рдЗрдк" рдореЗрд░реЗ super = T рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдорд┐рд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рдорд╛рди рд╣реИред рдмреЗрд╢рдХ, рдореЗрд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдореБрдЭреЗ рдЕрднреА рддрдХ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдХрд╛ рдкрд░рд┐рдЪрдп рдХреИрд╕реЗ рджрд┐рдпрд╛ рдЬрд╛рдП (рдЬреИрд╕реЗ Integer <: Real <: Number )ред

рдПрдХ (рдирд╛рдордорд╛рддреНрд░) рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рд╣реЛрдирд╛ рдЙрд╕ рдкрд░ рдПрдХ рдмрд╣реБрдд рдордЬрдмреВрдд рдмрд╛рдзрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдХреНрдпрд╛ рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реЛрдВрдЧреЗ рдЬреЛ _not_ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рдереЗ? рдореЗрд░реА рдЖрдВрдд рдорд╣рд╕реВрд╕ рдХрд░ рд░рд╣реА рд╣реИ рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдЪреАрдЬреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

protocol {T :< Number}(Foo :< AbstractFoo; Bar :< AbstractBar) # Abstract inheritance
    IterableProtocol(Foo) # Explicit protocol inheritance.

    # Implicit protocol inheritance.
    start(Bar)
...

рдореИрдВ рдЗрд╕ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддрд╛ред

  • рдХреНрдпрд╛ рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдХреЛрдИ рдирд╛рдо рд╣реИ?
  • { } рдФрд░ ( ) рдЕрдВрджрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ?
  • рдЖрдк рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдкрд░ рдкреНрд░реЗрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ f(x::ThisProtocol)=... рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрдИ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ?

рддреЛ eltype рдирд╛рдордХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдк рдкреНрд░рдХрд╛рд░ рд╣реИред рдЗрди "рдкреИрд░рд╛рдореАрдЯрд░" рдХрд╛ рдХреНрд░рдо рдФрд░ рд╕реНрдерд┐рддрд┐ рдХреЛрдИ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддреАред

рдЖрд╣, рдореЗрд░реА рдЧрд▓рддрдлрд╣рдореА рдереА, рдЬреЛ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛:

el1type = el_type
el2type = el_type

рдореЗрд░реА рдЙрджрд╛рд╣рд░рдг рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреБрдВрдЬреА/рдореВрд▓реНрдп рдЬреЛрдбрд╝реЗ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рдЖрдк рд╕рдВрдмрджреНрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдФрд░ рдпрд╣ рдХреА/рд╡реИрд▓реНрдпреВ рдлреАрдЪрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдкрд░ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдмреНрд╕рдЯреНрд░реИрдХреНрдЯ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗред рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рд╣реИред рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рдЕрдм рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдмреЗрд╢рдХ, рдореЗрд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдХрд╛ рдкрд░рд┐рдЪрдп рдХреИрд╕реЗ рджрд┐рдпрд╛ рдЬрд╛рдП рдЬреИрд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдгрд╛рдВрдХ <: рд╡рд╛рд╕реНрддрд╡рд┐рдХ <: рд╕рдВрдЦреНрдпрд╛)ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ super (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Integer рдХреЗ рд╕реБрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ Real ) рдФрд░ рдлрд┐рд░ рдпрд╛ рддреЛ super рд╡рд┐рд╢реЗрд╖ рдмрдирд╛рдПрдВ рдФрд░ рдирд╛рдорд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░реЗрдВ рдпрд╛ рдЬреЛрдбрд╝реЗрдВ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЛрдб (рдЕрд▓рд╛ рдкрд╛рдпрдерди) рдЬреЛрдбрд╝рдиреЗ рдФрд░ super рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рдпрдо рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ред

рдПрдХ (рдирд╛рдордорд╛рддреНрд░) рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рд╣реЛрдирд╛ рдЙрд╕ рдкрд░ рдПрдХ рдмрд╣реБрдд рдордЬрдмреВрдд рдмрд╛рдзрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдХреНрдпрд╛ рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реЛрдВрдЧреЗ рдЬреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рдереЗ? рдореЗрд░реА рдЖрдВрдд рдорд╣рд╕реВрд╕ рдХрд░ рд░рд╣реА рд╣реИ рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдЪреАрдЬреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

рдЕрд░реЗ рд╣рд╛рдБ, рдЕрдореВрд░реНрдд рдмрд╛рдзрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдереА! рдореЗрд░рд╛ рдкреВрд░рд╛ рдореБрджреНрджрд╛ рдпрд╣ рдерд╛ рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╣реИрдВред рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░ + рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рд╡реНрдпрд╡рд╣рд╛рд░ _рдФрд░_ рд╕рдВрдмрджреНрдз рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрди рдкреНрд░рд╛рдкреНрдд рд╣реЛред рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдХреНрд╖рдорддрд╛рдУрдВ (рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП) рдпрд╛ рдХреЗрд╡рд▓ рд╡реНрдпрд╡рд╣рд╛рд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдСрд░реНрдереЛрдЧреЛрдирд▓реА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдХреЛрдИ рдирд╛рдо рд╣реИ?

рджреЛ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рджреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ ( Foo , рдФрд░ Bar ) рдЬреЛ рдПрдХ рдмреНрд▓реЙрдХ рд╕реЗ рдЖрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореБрдЭреЗ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рдХреА рдХрдИ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореЗрд░реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдпрд╣ рднрд╛рдЧ part (a) рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдкреНрд░рдпрд╛рд╕ рдерд╛ред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЗрд╡рд▓ protocol Foo{T <: Number, Bar <: AbstractBar} <: AbstractFoo (рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде, Bar рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ, рдкрд░рд┐рднрд╛рд╖рд╛)ред рд╕рд╛рде рд╣реА, рд╕рднреА Number , AbstractBar рдФрд░ AbstractFoo рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реЛрдВрдЧреЗ, рдЬреИрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ,

{ } рдФрд░ ( ) рдХреЗ рдЕрдВрджрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

{} рдорд╛рдирдХ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдЕрдиреБрднрд╛рдЧ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Float64 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Foo рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Foo{Float64} рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ред () рдореВрд▓ рд░реВрдк рд╕реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмреЙрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд▓рд┐рд╕реНрдЯ рд╣реИ (рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕рд╛рде рдХрдИ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдЖрдкрдХрд╛ рднреНрд░рдо рд╢рд╛рдпрдж рдореЗрд░реА рдЧрд▓рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдореВрд▓ рдореЗрдВ <: рдмрдЬрд╛рдп :< рдЧрд▓рдд рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдерд╛ред <<name>> <<parametric>> <<bindings>> рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡реИрдк рдХрд░рдирд╛ рднреА рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ <<name>> рдХрднреА-рдХрднреА рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреА рд╕реВрдЪреА рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЖрдк рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдкрд░ рдкреНрд░реЗрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ f(x::ThisProtocol)=... рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрдИ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ?

рдЖрдкрдХрд╛ рдкреНрд░реЗрд╖рдг рдЙрджрд╛рд╣рд░рдг рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд▓рдЧрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

protocol FooProtocol # Single protocol definition shortcut
    foo(::FooProtocol) # I changed my syntax here, protocol names inside the protocol block should referenced as types
end

abstract FooAbstract

# This next line could use better syntax, like a type alias with an Intersection or something.
protocol Foo <: FooAbstract
    FooProtocol(::Foo)
end

type Bar <: FooAbstract
  a
end

type Baz
  b
end

type Bax <: FooAbstract
  c
end

f(f::Any) = ... # def (0)

foo(x::Bar) = ... # def (1a)
foo(x::Baz) = ... # def (1b)

f(x::FooProtocol) = ... # def (2); Least specific type (structural)

f(Bar(...)) # Would call def (2)
f(Baz(...)) # Would call def (2)
f(Bax(...)) # Would call def (0)

f(x::FooAbstract) = ... # def (3); Named type, more specific than structural

f(Bar(...)) # Would call def (3)
f(Baz(...)) # Would call def (2)
f(Bax(...)) # Would call def (3)

f(x::Foo) = ... # def (4); Named structural type, more specific than equivalent named type

f(Bar(...)) # Would call def (4)
f(Baz(...)) # Would call def (2)
f(Bax(...)) # Would call def (3)

рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдирд╛рдорд┐рдд рд╢реАрд░реНрд╖ рдкреНрд░рдХрд╛рд░ (рдХреЛрдИ рднреА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп typealias Foo Intersect{FooProtocol, Foo} (_рдПрдбрд┐рдЯ: рдЗрдВрдЯрд░рд╕реЗрдХреНрдЯ рдЧрд▓рдд рдирд╛рдо рдерд╛, рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрдВрдЯрд░рд╕реЗрдХреНрдЯ рд╕рд╣реА рдкрд╣рд▓реА рдмрд╛рд░_) рдЬреИрд╕реЗ рдХреБрдЫ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЖрд╣ рдмрдврд╝рд┐рдпрд╛, рдпрд╣ рдЕрдм рдореБрдЭреЗ рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ! рдПрдХ рд╣реА рдмреНрд▓реЙрдХ рдореЗрдВ рдПрдХ рд╕рд╛рде рдХрдИ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ; рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛ред

рдореИрдВрдиреЗ рдХреБрдЫ рдорд┐рдирдЯ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рд╕рд╛рдлрд╝ рдХрд░ рджрд┐рдП рд╣реИрдВред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рд╕реВрддреНрд░ рдореЗрдВ рдХрд┐рд╕реА рдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред

рдПрдХ рд╣реА рдмреНрд▓реЙрдХ рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдПрдХ рдкрд╛рд▓рддреВ рд╢рд┐рдЦрд░ рдХреА рддрд░рд╣ рд╣реИ рдЬрдм рдореИрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рдЬрдЯрд┐рд▓ рд╕рдВрдмрдВрдзреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рдЬрдм рдЖрдк рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд/рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдерди; рдЬрд╛рд╡рд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП ' рдЯреА рд╕рдорд╕реНрдпрд╛ рд╣реИ)ред рджреВрд╕рд░реА рддрд░рдл, рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрддрд░ рд╢рд╛рдпрдж рдЖрд╕рд╛рдиреА рд╕реЗ рддрдп рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдмрд╣реБ-рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡реИрд╕реЗ рднреА; рд▓реЗрдХрд┐рди рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рднреАрддрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рд╕реЗ рдмрд╛рд╣рд░ рдЖ рд╕рдХрддреЗ рд╣реИрдВ (рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ vtables рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рджреЗрдХрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛)ред

рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ ::Any рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ (рдирдХрд▓реА рд░реВрдк рд╕реЗ) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЖрдпрд╛ рддреЛ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЖрд╕рд╛рди рдорд╛рдорд▓рд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдзрд┐ ::Any рдкрд░ рднреЗрдЬреА рдЬрд╛рддреА рд╣реИ рддреЛ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рджреВрд╕рд░реА рдУрд░ рдореИрдВ рдирд╣реАрдВ рдмреЗрдЪ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рдЬрд░реВрд░реА рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдпрджрд┐ рддрдереНрдп рдХреЗ рдмрд╛рдж ::Any рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИ (рдХрд╣рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛) рдпрд╣ рдЕрднреА рднреА рдПрдХ рд╡реИрдз рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рдо рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреБрдХреВрд▓рди рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдХрд░рддреЗ рд╣реИрдВ рддреЛ ::Any рдкреНрд░реЗрд╖рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕реНрдХрд░рдг рдЕрднреА рднреА рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рддреЛ рдЕрдВрдд рдореЗрдВ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рд░рд╣реВрдВрдЧрд╛ред

рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реЛ рдЬреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рджреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ (рдЬрд┐рд╕реЗ рд╣рдо рдХрднреА рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рджреВрд╕рд░реЗ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ)ред рдкрд╣рд▓реЗ рдХреЗ рд▓рд┐рдП, ::Any рдкреНрд░реЗрд╖рдг рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЧреНрд░реЗрд╖рдг рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕, рд╡реИрд╢реНрд╡рд┐рдХ рдХреАрд╡рд░реНрдб рдХрд╣реЗрдВ (рдЕрдЧрд▓рд╛ рдЕрдиреБрднрд╛рдЧ рднреА рджреЗрдЦреЗрдВ)ред рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдореИрдВ рдПрдХ рдореМрдЬреВрджрд╛ рдЙрдкрдпреЛрдЧреА рдХреАрд╡рд░реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╡реНрдпрд░реНрде рд╕рд╛рдорд╛рди рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╣рдЯрд╛ рджрд┐рдпрд╛ред

рдЖрдкрдХрд╛ Join рдмрд┐рд▓реНрдХреБрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ "рдорд┐рд▓рдирд╛" рд╣реИред рдФрд░ рдЦреБрд╢реА рд╕реЗ, Join рдкреНрд░рдХрд╛рд░ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рдХрд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪреМрд░рд╛рд╣реЗ рдХреЗ рддрд╣рдд рдмрдВрдж рд╣реИрдВ: рдЪреМрд░рд╛рд╣реЗ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рджреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рд╢рд╛рдорд┐рд▓ рд╣реИред

рдореИрдВ ::Any рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рддреБрдЪреНрдЫ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рд╣реВрдВред рдореЗрд░реЗ рд▓рд┐рдП рдирд┐рдпрдо " Any рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ" рдУрдХрд╛рдо рдХреЗ рд░реЗрдЬрд░ рд╕реЗ рджреВрд░ рдЪрд▓рддрд╛ рд╣реИред рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ "рдХрд┐рд╕реА рдХреЛ рднреА рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ" рдзреНрд╡рдЬ рдХреЛ рдереНрд░реЗрдб рдХрд░рдирд╛ рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рди рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдпрд╣ рднреА рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдореА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╕реБрд╕рдВрдЧрдд рд╣реИред

рдореБрдЭреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдмрд╣реБрдд рдкрд╕рдВрдж рд╣реИ (рдореБрдЭреЗ рдХреБрдЫ CLUsters рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ), рдореИрдВ рдмрд╕ рдЙрддреНрд╕реБрдХ рд╣реВрдВ, рдпрд╣ рдирдП рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдлрд┐рдЯ рд╣реЛрдЧрд╛ рдЬрд┐рд╕ рдкрд░ рдЬреЗрдл рджреНрд╡рд╛рд░рд╛ рдЬреВрд▓рд┐рдпрд╛рдХреЙрди рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереА, рдФрд░ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде? (рджреЛ рдЪреАрдЬреЗрдВ рдЬреЛ рдореИрдВ рдЕрднреА рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛)ред

рдпрд╣ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдирд┐рдпрдореЛрдВ (https://github.com/JuliaLang/julia/issues/6975#issuecomment-160857877) рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рд╡реЗ рдмрд╛рдХреА рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдмрд╕ рдкреНрд▓рдЧ рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛рдлреА рд╣рдж рддрдХ @mauro3 рдХреЗ рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ "рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░" рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВред

рдЖрдкрдХрд╛ Join рдмрд┐рд▓реНрдХреБрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рд╣реИред

рдореИрдВрдиреЗ рдХрд┐рд╕реА рддрд░рд╣ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЖрд╢реНрд╡рд╕реНрдд рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВ рдкрд╣рд▓реЗ рдЧрд▓рдд рдерд╛ рдЬрдм рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдпрд╣ рдЪреМрд░рд╛рд╣рд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╣рдореЗрдВ рдЕрднреА рднреА рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (рдЬреИрд╕реЗ Union )ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

рдореБрдЭреЗ рдЕрднреА рднреА рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдирд╛ рдФрд░ рдЙрдирдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдирд┐рдпрдореЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдкрд╕рдВрдж рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП super рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╕рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рдХрд╕реНрдЯрдо рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдЕрдВрддрддрдГ рдЙрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рд╣реА рдХреАрд╡рд░реНрдб рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рд╣рдо abstract рдХреЛ рдореИрдХреНрд░реЛ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдЧреЗрд╣реВрдБ рдХреЗ рдЦреЗрддреЛрдВ рд╕реЗ: рдЧрдВрддрд╡реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдирдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ рд╕рд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдорд╛рдирддрд╛ рдХреЛ рдЙрдард╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

рдХреНрдпрд╛?

рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдордВрд╢рд╛, рдХреНрд╖рдорддрд╛ рдФрд░ рдХреНрд╖рдорддрд╛ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЙрдирдХреЗ рдЧреБрдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рд╕рдВрддреЛрд╖рдЬрдирдХ рд╕рдВрд╢реНрд▓реЗрд╖рдг рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдХрдо рдкреНрд░рднрд╛рд╡реА рд╣реИред рдпрд╣ рдЙрджреНрджреЗрд╢реНрдп, рдкреИрдЯрд░реНрди, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЙрдирдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдорд╛рдирддрд╛рдУрдВ рдХреЛ рд╕рдореЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЙрд╕ рд╕рдордЭ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВ, рдЬрд┐рд╕рд╕реЗ рдХрд┐рд╕реА рдХреЗ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдХреЗ рд╢реЛрдзрди рдХреЛ рд╕рдВрд╢реНрд▓реЗрд╖рдг рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред

рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЬреЛ рднреА рдлрд▓рджрд╛рдпреА рдЕрд╣рд╕рд╛рд╕ рд╣реЛ, рд╡рд╣ рдЙрд╕ рдордЪрд╛рди рдкрд░ рдирд┐рд░реНрдорд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕рдВрд╢реНрд▓реЗрд╖рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯ рд╕рдВрд╢реНрд▓реЗрд╖рдг рд░рдЪрдирд╛рддреНрдордХ рд╢рдХреНрддрд┐ рдФрд░ рдЖрдЧрдордирд╛рддреНрдордХ рд╢рдХреНрддрд┐ рд╣реИред

рдХреНрдпрд╛?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдо рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ рдХреНрдпреЛрдВ рдЙрдкрдпреЛрдЧреА рд╣реИрдВред рдлрд┐рд░ рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╣ рдФрд░ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рдЙрдирдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╢реНрд▓реЗрд╖рдг рдХреЗ рд╕рд╛рде рдЖрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдорд╛рддреНрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓

(1) рд╡рдХрд╛рд▓рдд рдХрд░рдирд╛

рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ (рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд) рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ (рдХрдо рд╡рд┐рд╕реНрддреГрдд) рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ [рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдореЗрдВ] рдЕрдиреБрд░реВрдк рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЕрдиреБрд░реВрдкрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реЗ рдкреВрдЫрддрд╛рдЫ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

(2) рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛

рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдХрд┐рд╕реА рддрд░реАрдХреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛:
рдЬрдм рдХреЛрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛ, рддреЛ рд╕рд╣реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдВ; рдЬрдм рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕
рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдПрдХ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдХреЗ рдкреНрд░рддрд┐ рд╡рдлрд╛рджрд╛рд░ рд╣реИ рдФрд░ рд╕рдВрд╡рд░реНрдзрд┐рдд рд╣реЛрдиреЗ рдкрд░ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛,
рдЕрдзреВрд░рд╛ рдЬрд╡рд╛рдм рджреЗрдВ, рдФрд░ рдЕрдиреНрдпрдерд╛ рдЧрд▓рдд рдЬрд╡рд╛рдм рджреЗрдВред рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рднреА рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЕрдзреВрд░рд╛ рд╣реИ рдХрд┐ рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╡реГрджреНрдзрд┐ред

(3) рд╕рдВрдЧреАрдд

рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореЙрдбреНрдпреВрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд╛рдо рдХрд░реЗрдЧрд╛
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рддреБрд▓рдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рдХрд┐ рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрдиреБрд░реВрдк рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ [рдирд┐рд░реНрдпрд╛рдд] рдкреНрд░рдХрд╛рд░ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
@abstract , @type , @immutable рдФрд░ @function рд╕рд╣рдЬ рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

[рдкрд╛рдУ: рдХреЛрдб-рдХреЛрдЯреНрд╕ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬрдм рдЖрдк рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рдж рдРрд╕рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдШреЛрдбрд╝рд╛ рдкрд╣рд▓реЗ рд╣реА рдЦрд▓рд┐рд╣рд╛рди рдЫреЛрдбрд╝ рдЪреБрдХрд╛ рд╣реИ ...]

(рдЖрдкрдХреЛ @mentions рдЙрджреНрдзреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ!)

рдзрдиреНрдпрд╡рд╛рдж - рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛

рдмреБрдзрд╡рд╛рд░, 16 рджрд┐рд╕рдВрдмрд░, 2015 рдХреЛ рд╕реБрдмрд╣ 3:01 рдмрдЬреЗ, рдореМрд░реЛ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

(рдЖрдкрдХреЛ @рдЙрд▓реНрд▓реЗрдЦреЛрдВ рдХреЛ рдЙрджреНрдзреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ!)

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/JuliaLang/julia/issues/6975#issuecomment -165026727ред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореБрдЭреЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛: рдХреЛрдб-рдЙрджреНрдзрд░рдг ` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдирд╣реАрдВ "

рдЙрджреНрдзрд░рдг рдлрд┐рдХреНрд╕ рдлрд┐рдХреНрд╕реНрдбред

рдзрдиреНрдпрд╡рд╛рдж - рдореЗрд░реА рдкреВрд░реНрд╡ рдЕрдЬреНрдЮрд╛рдирддрд╛ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ

рдореИрдВрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рд╣рд╛рд▓рд┐рдпрд╛ рдЪрд░реНрдЪрд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХреБрдЫ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдирд╛рдорд┐рдд рдХрд░рдирд╛ рдХреНрдпреЛрдВ рдЬрд░реВрд░реА рд╣реИ?

рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ рдХрд╛рдлреА рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИред рдмрд╣реБрдд рдХреБрдЫ рд╢реБрд░реВ рдореЗрдВ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЬреЗрдлреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде

abstract Iterable
    start(::_)
    done(::_, state)
    next(::_, state)
end

рдЗрд╕ рдорд╛рд░реНрдЧ рдкрд░ рдЬрд╛рддреЗ рд╕рдордп рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдХрд┐ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдмреЗрд╣рддрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдмреЗрд╣рддрд░ рд╕рддреНрдпрд╛рдкрди рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрдВрддреНрд░ рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рд▓рдХреНрд╖реНрдп IMHO рд╣реИред

рддреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдЬреИрд╕реЗ:

type Foo <: Iterable
  ...
end

рдХреНрдпрд╛ рд╣рдо ... рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдо рд▓рд╛рдкрддрд╛ рдХрд╛рд░реНрдпреЛрдВ (рдФрд░ рдЙрд╕рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЬрдЯрд┐рд▓рддрд╛рдУрдВ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдм рддреНрд░реБрдЯрд┐ рдХрд░рддреЗ рд╣реИрдВ? рд╕рд╛рде рд╣реА, рдХрдИ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпрд╛ рд╣рдо рдПрдХрд╛рдзрд┐рдХ рд╕рд╛рд░ рд╡рд┐рд░рд╛рд╕рдд рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ? рд╣рдо рд╕реБрдкрд░-рд╡рд┐рдзрд┐ рд╕рдВрдХрд▓реНрдк рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ? рдпрд╣ рдПрдХрд╛рдзрд┐рдХ рдкреНрд░реЗрд╖рдг рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ (рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрдВ рдФрд░ рд╡рд╣рд╛рдВ рдЬрд╛рд╡рд╛-рдПрд╕реНрдХреНрдпреВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд┐рд╕реНрдЯрдо рдЪрд┐рдкрдХрд╛рдПрдВ)? рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдо рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирдП рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ? рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдо рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ?

рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдХрд░ (рдпрд╛ рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реВрддреНрд░реАрдХрд░рдг рдмрдирд╛рдХрд░) рдЗрди рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ (рд╢рд╛рдпрдж рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рднреА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рд╡рд░реНрддрдорд╛рди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЧреБрдгрдХреЛрдВ рдХреЛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рд╡рд░реНрдгрди рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рд╣реИред

  • рд╕рд╛рд░ рдПрдХрд╛рдзрд┐рдХ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо (рдПрдХрд╛рдзрд┐рдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛) рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЬреЗрдл рджреНрд╡рд╛рд░рд╛ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ)ред рддреЛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╡рд╣ рд╕реБрд╡рд┐рдзрд╛ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдорд┐рд▓рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред
  • рдЖрдкрдХреА рдЕрдЧрд▓реА рдЯрд┐рдкреНрдкрдгреА рдЗрд╕ рдкреНрд░рд╢реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдХрдм рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЗрди-рдмреНрд▓реЙрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рдЬреВрд▓рд┐рдпрди рдирд╣реАрдВ рд▓рдЧрддрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рддреАрди рд╕рд░рд▓ рдЙрдкрд╛рдп рд╣реИрдВ:

    1. рдЬреИрд╕реЗ # 7025 рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ verify_interface рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдпрд╛ рддреЛ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмрд╛рдж рдпрд╛ рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

    2. рдХреЛрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ "MethodError" рдореЗрдВ рдПрдХ рдмреЗрд╣рддрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП рд╕реНрдердЧрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрд╕рд▓ рдореЗрдВ рдпрд╣ 1 рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдлреЙрд▓рдмреИрдХ рд╣реИред

    3. рд╕рдВрдХрд▓рди рд╕рдордп рдЗрдХрд╛рдИ рдХреЗ рдЕрдВрдд рдореЗрдВ рдпрд╛ рдореЙрдбреНрдпреВрд▓ рд▓реЛрдбрд┐рдВрдЧ рдЪрд░рдг рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ:

function a()
  b()
end

function b()
end

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣рд╛рдВ рдЗрди-рдмреНрд▓реЙрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

  • рдЖрдк рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдРрд╕реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ "рдЗрдЯрд░реЗрдмрд▓" рдкреНрд░реЛрдЯреЛрдХреЙрд▓)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рдпрд╣ рдХрдИ рдЕрдореВрд░реНрдд рд╡рд┐рд░рд╛рд╕рдд рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рд╣реИред рдпрджрд┐ рдпрд╣ рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдПрдХ рдирдИ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ рд╕рд╛рд░ рдПрдХрд╛рдзрд┐рдХ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдЬреЛрдбрд╝рдиреЗ рджреЗрдВред рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХрд╛рдзрд┐рдХ рдЗрдВрдЯрд░рдлреЗрд╕ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдФрд░ рдпрд╣ рдЬрд╛рд╡рд╛/рд╕реА # рдореЗрдВ рдкреВрд░реНрдг рдЖрдо рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдкреНрд░реЛрдЯреЛрдХреЙрд▓" рдЬреИрд╕реА рдЪреАрдЬрд╝ рдФрд░ рдПрдХрд╛рдзрд┐рдХ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдкреИрдХреЗрдЬ (рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛) рдХреЛ рдореМрдЬреВрджрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдХреЛрдИ рднреА рд╕реГрдЬрди рдХреЗ рдмрд╛рдж рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реБрдкрд░рдЯреЗрдкреНрд╕ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рд╕рдордп рдЗрд╕реЗ "рдкреНрд░реЛрдЯреЛрдХреЙрд▓" рдпрд╛ рдХреБрдЫ рдРрд╕рд╛ рдХрд╣рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

рдПрдЪрдПрдо рддреЛ рдпрд╣ рдореМрдЬреВрджрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ/рдЙрдиреНрдирдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рдЕрднреА рднреА рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╣рд╛рдБ рд╣реЛрдЧреАред рдЬрдм рдХреЛрдИ рдореМрдЬреВрджрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХреБрдЫ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ (рдЬрдм рд╣рдо рдУрдкреА рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ) рддреЛ рдХреЛрдИ рдмрд╕ рдЙрдк-рдкреНрд░рдХрд╛рд░ рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдк-рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдЙрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рдпрд╣ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реНрдХреЗрд▓ рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг: рдорд╛рди рд▓реЗрдВ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдкреИрдХреЗрдЬ рдерд╛ рдЬреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддрд╛ рд╣реИред рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ tobits рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдЙрд╕ рдкреИрдХреЗрдЬ рдХреЗ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдЖрдЗрдП рдЗрд╕реЗ Serializer рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╣рддреЗ рд╣реИрдВ (рдпрд╛рдиреА tobits рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдЕрдм рдореИрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ Array рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдпрд╛ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░) tobits ред рдПрдХрд╛рдзрд┐рдХ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде рдореИрдВ Array Serialzer рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рдж Array рдПрдХ рд╕реБрдкрд░рдЯрд╛рдЗрдк рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдЗрд╕реЗ рд╕рдордЭреЛред https://github.com/JuliaLang/IterativeSolvers.jl/issues/2 рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕рдорд╛рдзрд╛рди рдореВрд▓ рд░реВрдк рд╕реЗ рдбрдХ-рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдврдВрдЧ рд╕реЗ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдкреНрд░реЗрд╖рдг рд╕реНрддрд░ рдкрд░ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдЙрдкрд░реЛрдХреНрдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ рддреЛ рдХреЛрдИ рднреА рдПрдХ рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдпрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЯрд╛рдЗрдк рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдЗрди рджреЛрдиреЛрдВ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдПрдХ рдРрд╕реЗ рдЙрдкрдХрд░рдг рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдкрд░реНрдпрд╛рдкреНрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реЛред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ: рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рджреЛрдиреЛрдВ рдХрд╛ рд╣реЛрдирд╛ рдмрд╣реБрдд рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛ред рдЕрдЧрд░ рдореБрдЭреЗ рд╕рд╣реА рд╕реЗ рдпрд╛рдж рд╣реИ, рддреЛ рдКрдкрд░ рдпрд╣ рддрд░реНрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджрд╛рд░реНрде рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рддреИрдпрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдорд╛рдорд▓рд╛ рд╣реИ (рдореИрдВ рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдВ), рдпрд╣ рдЕрднреА рднреА рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рджреЛ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЗрддрдирд╛ рдмрдбрд╝рд╛ рдУрд╡рд░рд▓реИрдк рд╣реИред рддреЛ, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдКрдкрд░ рдЖрдо рд╕рд╣рдорддрд┐ рд╣реИ, рд╡реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдкрд░ рдЬреЛрд░ рджреЗрддреЗ рд╣реИрдВред рдЙрд╕ рдЕрдиреБрдкрд╕реНрдерд┐рдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдирдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЙрдкрдпреЛрдЧ рд╣реИред рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреНрдпрд╛ рд▓рд╛рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдХрднреА рднреА рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрддрдирд╛ рдирд╣реАрдВ рдорд╛рдирд╛ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рдЯрд╛рдЗрдкреЛрд▓реЙрдЬреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдЯрд╛рдЗрдкреЛрд▓реЙрдЬрд┐рдХрд▓ рд▓рдЪреАрд▓реЗрдкрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдлреЗрдВрдХрдирд╛ рдорд╣рдВрдЧрд╛ рд╣реИред

@JeffreySarnoff +1

рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдХрд╛рд░ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВред рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдЬреИрд╕реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд, рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд, рдЙрдирдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВред рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдХреЛрдИ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ рдЬреЛ "рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд" рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдмрд╕ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рдШреЛрд╖рдгрд╛ рд╣реИред

рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВред рдпрджрд┐ Signed рдФрд░ Unsigned рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдПрдХ рд╣реА рд╕реЗрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рдорд╛рди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рджреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рднреА, рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ Signed рдХреЗ рдмрдЬрд╛рдп Unsigned (рдЕрд▓рдЧ рдврдВрдЧ рд╕реЗ рдПрдХ рд╣реА рд╕рдорд╛рд░реЛрд╣ рдЕрдзрд┐рдирд┐рдпрдо рдХреЗ рдпрд╛рдиреА рддрд░реАрдХреЛрдВ) рдкреНрд░реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдХреБрдВрдЬреА рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдШреЛрд╖рдгрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдпред

рд▓реЗрдХрд┐рди рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рд╕рдВрдмрджреНрдз рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реЛрдирд╛ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ https://github.com/JuliaLang/julia/issues/6975#issuecomment -168499775

рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рди рдХреЗрд╡рд▓ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ (рдпрд╛ рддреЛ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ, рдпрд╛ рдорд╢реАрди-рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ) рдЧреБрдгреЛрдВ рдХреЛ рдзрд╛рд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬреИрд╕реЗ рдХрд┐:

abs(x::Unsigned) == x
signbit(x::Unsigned) == false
-abs(x::Signed) <= 0

Signed рдФрд░ Unsigned рдмреАрдЪ рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдВрддрд░ рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рддрд╛ рд╣реИред

рдпрджрд┐ рдРрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдореМрдЬреВрдж рд╣реИ рдЬреЛ рдЗрддрдирд╛ "рдЕрдореВрд░реНрдд" рд╣реИ рдХрд┐ рдЗрд╕реЗ рддреБрд░рдВрдд рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдмрд╛рд╣рд░ рд╕реЗ, рддреЛ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рд╕рд╣реА рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╡рд░реНрддрдорд╛рди abstract рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╢рд╛рдпрдж рдмреАрдЬреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред

рдРрд╕рд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд╕рдореВрд╣ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рдд рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ (рдФрд░ рдпрд╣ рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "рд╡рд░реНрддрдорд╛рди" рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рд╣реИ: https://github.com/JuliaLang/julia/issues/ 6975#рдореБрджреНрджреЗ-161056795)ред (рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ, рдпрд╣ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред)

(Un)signed рдЙрджрд╛рд╣рд░рдг рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП: рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ Signed рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдк-рдкреНрд░рдХрд╛рд░ рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддреЛ рдореИрдВ рдХреНрдпрд╛ рдХрд░реВрдВрдЧрд╛? рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

@eschnett : рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░, рдЗрд╕ рд╕рдордп, рдЙрдирдХреЗ рдЙрдкрдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ: #4935ред

рдмреАрдЬреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬрд╣рд╛рдВ рдХреНрд░рдорд┐рдХ рд╢реЛрдзрди рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╛рд░реНрдердХ рд╣реИред
рдХреЛрдИ рднреА рд╡рд░реНрдЧреАрдХрд░рдг рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдореЗрд▓рдЬреЛрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдзрд┐рдХ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИред

рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреЛрдЯ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╡рд╛рджреА рд╢рдХреНрддрд┐ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕реМрджрд╛ рд╣реИ рдЬреЛ рдЕрдореВрд░реНрддрддрд╛ рдХреА рдХрдИ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИред

@ рдореМрд░реЛ3 рд╣рд╛рдБ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИред рдореИрдВ рднреЗрджрднрд╛рд╡ рд╡рд╛рд▓реЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдмрд░рд╛рдмрд░ рдХреБрдЫ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрдЬрд╛рдп рдЯреБрдкрд▓реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ (рдЬреИрд╕рд╛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдпрд╣ рдПрдирдо, рдЕрд╢рдХреНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХрдо рдХрд░ рджреЗрдЧрд╛, рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдирд╛рдо рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдЯреБрдкрд▓реНрд╕ рдХреА рддрд░рд╣:

DiscriminatedUnion{Int16, UInt32, Float64}

рдпрд╛ рдирд╛рдорд┐рдд рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде:

discriminated_union MyType
    i::Int16
    u::UInt32
    f::Float64
end

рдЬрд┐рд╕ рдмрд┐рдВрджреБ рдХреЛ рдореИрдВ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдореИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред

рдРрд╕рд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд╕рдореВрд╣ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛рдиреА рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ (рдФрд░ рдпрд╣ рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "рд╡рд░реНрддрдорд╛рди" рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рд╣реИ: # 6975 (рдЯрд┐рдкреНрдкрдгреА))ред (рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ, рдпрд╣ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдкреНрд░рджрд░реНрд╢рди рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рд╣реЛрдЧрд╛, рдРрд╕рд╛ рд╡рд┐рдЪрд╛рд░ рдЬреЛ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЕрдХреНрд╕рд░ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рдорд╛рдирддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЧреИрд░-рдХрд┐рд╕реА рднреА рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рдВрдХрд▓рдХ рдЕрднреА рднреА рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдЪреБрди рд╕рдХреЗ (рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╕рд╣реА рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдирд┐рд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЙрдирдХреЗ рдкрд░рд┐рдгрд╛рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЯреИрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ рд╕рд╛рд░ "рд╡рд┐рд░рд╛рд╕рдд" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рдЬреНрдЮрд╛рди рдХреЛ рдХрдо рд╕реЗ рдХрдо рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рдореИрдХреНрд░реЛ рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдореИрдХреНрд░реЛ рдХреЗ рдПрдХ рдЕрдЬреАрдм рд╣реИрдХ рдХреА рддрд░рд╣ рдорд╣рд╕реВрд╕ рд╣реЛрдЧрд╛; рдЕрдЧрд░ рд╣рдо рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ @ рдЬреЗрдлрдмреЗрдЬрд╛рдирд╕рди рдХрд╛ рдПрдХреАрдХреГрдд рд╕рдорд╛рдзрд╛рди рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рдареАрдХ рдХрд░реЗрдЧрд╛)ред

(рдЕрди) рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЙрджрд╛рд╣рд░рдг рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП: рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдк-рдкреНрд░рдХрд╛рд░ рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддреЛ рдореИрдВ рдХреНрдпрд╛ рдХрд░реВрдВрдЧрд╛? рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдПрдХрд╛рдзрд┐рдХ рд╕рд╛рд░ рд╡рд┐рд░рд╛рд╕рддред


рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдореИрджрд╛рди рдкрд╣рд▓реЗ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдмрд╛рддрдЪреАрдд рдордВрдбрд▓рд┐рдпреЛрдВ рдореЗрдВ рдЬрд╛ рд░рд╣реА рд╣реИ (рдпрджреНрдпрдкрд┐ рд╣рд░ рдмрд╛рд░ рдХрдбрд╝реЗ рдШреЗрд░реЗ)ред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдПрдХ рдХреЙрд░реНрдкрд╕ рдпрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдЕрдзрд┐рдЧреНрд░рд╣рдг рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╣рдореЗрдВ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдиреНрдпрд╛рдп рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдЬрдмрдХрд┐ рд╣рдо рдЪреАрдЬреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛ рд░рд╣реЗ рд╣реИрдВ :) рдореИрдВ рд╕рднреА рдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдирд╛рдордорд╛рддреНрд░ рд╣реИрдВ рдЬрдмрдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдРрд╕реЗ рдбрд┐рдЬрд╛рдЗрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддреЗ рд╣реИрдВ, _unless_ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп "рдПрдиреНрдХреЛрдбрд┐рдВрдЧ" рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВ (рд╢рд╛рдпрдж рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЪрддреБрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде)ред рдмреЛрдирд╕ рдЕрдВрдХ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрджрд┐ рдпрд╣ рдХрдИ рдЕрдореВрд░реНрдд рд╡рд┐рд░рд╛рд╕рдд рднреА рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рд▓реЗрдХрд┐рди рд╣рдо рдЕрднреА рддрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд╣реИрдВред

@JeffBezanson рдХреНрдпрд╛ "рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░" "[рдП] рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реЗ рдЬреБрдбрд╝реЗ рдареЛрд╕ рдкреНрд░рдХрд╛рд░" рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВ?

рд╣рд╛рдВ, рдореЗрд░рд╛ рдРрд╕рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ; рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ "рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░" рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рддрдХрдиреАрдХреА рдЕрд░реНрдереЛрдВ рдореЗрдВ рдХреБрдЫ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдЬреЛрдбрд╝реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ "рдорд╛рди" рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рд╡реИрд╕реЗ рд╣реА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "рдЯрд╛рдЗрдк рдлреВ рдХрдВрдЯреЗрдирд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЙрд╕рдХреЗ рдкрд╛рд╕ eltype " рдпрд╛ "рдЯрд╛рдЗрдк рдлреВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЗрд╕рдХрд╛ ndims рдкреИрд░рд╛рдореАрдЯрд░ 2 рд╣реИ"ред

рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдирд╛рдордорд╛рддреНрд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░
рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдЧреБрдгрд╛рддреНрдордХ рд╣реЛрддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдСрдкрд░реЗрдЯрд┐рд╡ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░
рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ (рдПрдХрд╛рдзрд┐рдХ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде) рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЖрдЪрд░рдг рдХрд░рддреЗ рд╕рдордп рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдПрдХ рджреВрд╕рд░реЗ рдореЗрдВ рдПрдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдереА, "рдЕрд░реЗ рд╡рд╣рд╛рдБ, рд╣рд╛рдп .. рдЖрдк рдХреИрд╕реЗ рд╣реИрдВ? рдЪрд▓реЛ рдХрд░рддреЗ рд╣реИрдВ!" рдЬреВрд▓рд┐рдпрд╛ рдХреЛ рджреЛрдиреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдЖрдо рддреМрд░ рдкрд░ рдЙрджреНрджреЗрд╢реНрдпрдкреВрд░реНрдг рдзрд╛рд░рдгрд╛ рдФрд░ рдмрд╣реБ-рд╡рд┐рд░рд╛рд╕рдд рдпреЛрдЧреНрдп рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ (рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЙрджреНрджреЗрд╢реНрдп рдХреА рдзрд╛рд░рдгрд╛)ред рдпрджрд┐ рдХреЛрдИ рдХрд▓рд╛рддреНрдордХ рдЦреБрд▓рд╛рд╕рд╛ рд╣реИ рдЬреЛ рдЬреВрд▓рд┐рдпрд╛ рдХреЛ рджреЛрдиреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрд▓рдЧреНрди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд╕реЗ рдПрдХ рдФрд░ рджреВрд╕рд░реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред

@ рдореЗрд╕рди-рдмрд┐рд▓реА: рддреЛ рд╣рдореЗрдВ рдХрдИ рд╡рд┐рд░рд╛рд╕рдд рднреА рдЬреЛрдбрд╝рдиреА рдЪрд╛рд╣рд┐рдП? рдпрд╣ рдЕрднреА рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдЧрд╛ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж рд╕реБрдкрд░рдЯреЗрдкреНрд╕ рдХреЛ рдЬреЛрдбрд╝рд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ (рдЬрдм рддрдХ рдХрд┐ рдЗрд╕рдХреА рднреА рдЕрдиреБрдорддрд┐ рди рд╣реЛ)ред

@JeffBezanson : рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдирд╛рдордорд╛рддреНрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд░реЛрдХреЗрдЧрд╛ред

@ рдореМрд░реЛ 3 рдкреЛрд╕реНрдЯ рдлреИрдХреНрдЯреЛ рд╕реБрдкрд░рдЯреЗрдк рд╕рдореНрдорд┐рд▓рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рдПрдХрд╛рдзрд┐рдХ рд╡рд┐рд░рд╛рд╕рдд рд╕реЗ рдХреНрдпреЛрдВ рдЬреБрдбрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдФрд░ рд╕реБрдкрд░рдЯреЗрдк рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдХреБрдЫ рдкреЗрдЯреЗрдВрдЯ рд░реВрдк рд╕реЗ рд╣рд╛рдирд┐рд░рд╣рд┐рдд рд╣реИрдВ рдЬреЛ рдПрдХ рдирдП рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реИрдВ-рд╡реЗ рд╣реИрдВ: рдореИрдВ рд░рд┐рдпрд▓ рдФрд░ рдПрдмреНрд╕рдЯреНрд░реИрдХреНрдЯ рдлреНрд▓реЛрдЯ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдкреНрд░реЛрдЯреЛрдлреНрд▓реЛрдЯ рдХрд╣рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдореИрдВ рдбрдмрд▓ рдкрд░ рдкреНрд░реЗрд╖рдг рдХрд░ рд╕рдХреВрдВ- рдбрдмрд▓ рдлреНрд▓реЛрдЯреНрд╕ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рд╕рд╛рде рдлрд╝реНрд▓реЛрдЯ рдХрд░рддрд╛ рд╣реИ рдПрдмреНрд╕рдЯреНрд░реИрдХреНрдЯ рдлреНрд▓реЛрдЯ рдХреЗ рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ рдлреНрд▓реЛрдЯреНрд╕ред рд╢рд╛рдпрдж рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдореЗрдВ рдХрдо рдЖрд╕рд╛рди, рдЗрдВрдЯреАрдЬрд░ рдХреЗ рд╡рд░реНрддрдорд╛рди рдЙрдкрдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрдЧреА, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрдИ "рдЕрд╕реНрдкрд╖реНрдЯ .. рдкрд╣рд▓реЗ рдПрдл (рдмреВрд▓) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ .." рд╕рдВрджреЗрд╢реЛрдВ рд╕реЗ рдмрдЪреЗрдВ; рдпрд╛ рд╕рд╛рдЗрди рдХрд╛ рдПрдХ рд╕реБрдкрд░рдЯрд╛рдЗрдк рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЗрдВрдЯреАрдЬрд░ рдХрд╛ рдПрдХ рдЙрдк рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдкрд╛рд░рджрд░реНрд╢реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЦреЛрд▓реЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЦреНрдпрд╛ рдХрд╣реЗрдВред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдореИрдВрдиреЗ рдордВрдбрд▓реА рдХрд╛ рдПрдХ рдФрд░ рджреМрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИред рд╡рд┐рд╖рдп рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рддреЛ рд╣рдореЗрдВ рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ:

  • рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди
  • рдХреЛрдИ рдкреНрд░рджрд░реНрд╢рди рдЧрд┐рд░рд╛рд╡рдЯ рдирд╣реАрдВ
  • рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА (рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рднреА рдЖрд╕рд╛рди!)

рдЪреВрдВрдХрд┐ рд╢реБрд░реБрдЖрдд рдореЗрдВ # 6975 рдореЗрдВ рдЬреЛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡рд╣ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИ, рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЬреЗрдИрдкреА рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИред

рдЖрдк рдПрдХ рдФрдкрдЪрд╛рд░рд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд░реНрддрдорд╛рди 0.4 (рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдмрд┐рдирд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рдорд╛рдиреНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг, рдкреНрд░реЗрд╖рдг рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╢реИрд▓реА рдкреНрд░реЗрд╖рдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ gf.c рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдЯрд╛рдЗрдк рд╕реНрдкреЗрд╕ рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред

рдореИрдВ рдЗрд╕реЗ рдПрдХ рдбреАрдПрд╕рдПрд▓ рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдЪреЗрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рд╣рдо рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдЖрдкреВрд░реНрддрд┐ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рдХрд╛рд░ рддрд┐рдерд┐рдпреЛрдВ рдХрд╛ рдкреБрдирд░рд╛рд╡рд░реНрддрдХ рд╣реИред

рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реБрдкрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХрд╛рдзрд┐рдХ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, _super рдлрд╝реАрд▓реНрдб рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рдирдЯрд╛рдЗрдо рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреЛрдИ рднреА рдорд╛рдиреНрдп рдкреНрд░рддреАрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк _super Tuple рдХреЛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

https://github.com/mdcfrancis/tc.jl/blob/master/test/runtests.jl

рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдореИрдВрдиреЗ рдЬреВрд▓рд┐рдпрд╛рдХреЙрди рд╕реЗ https://github.com/JuliaLang/julia/issues/5#issuecomment -230645040 рдкрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдкрд░ рдПрдХ рдЕрдиреБрд╡рд░реНрддреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рд╣реИред

рдЧрд╛рдЗ рд╕реНрдЯреАрд▓ рдХреЗ рдкрд╛рд╕ рдХрдИ рдкреНрд░реЗрд╖рдг рднрд╛рд╖рд╛ (рдХрд┐рд▓реЗ) рдореЗрдВ рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ рдХреБрдЫ рдЕрдЪреНрдЫреА рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рд╣реИ, рдЙрдирдХрд╛ рдЬреВрд▓рд┐рдпрд╛рдХреЙрди 2016 рдореБрдЦреНрдп рд╡рдХреНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦреЗрдВ: https://youtu.be/EZD3Scuv02g ред

рдХреБрдЫ рд╣рд╛рдЗрд▓рд╛рдЗрдЯреНрд╕: рдмреАрдЬреАрдп рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рдгрд╛рд▓реА, рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛-рдЧреБрдгреЛрдВ рдХрд╛ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг, рдФрд░ рдпрд╣ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЬреЛ рдкреНрд░рдгрд╛рд▓реА рд▓рд╛рдЧреВ рдХреА рдереА рд╡рд╣ рд╢рд╛рдпрдж рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдереА рдФрд░ рд╡рд╣ рдЕрдм рдХреБрдЫ рдЖрд╕рд╛рди рдХрд░реЗрдЧрд╛ред

рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ рдХрдВрдкрд╛рдЗрд▓рд░ AD рдЙрдкрдпреЛрдЧрдХреЗрд╕ рдХреЗ рд▓рд┐рдП рдирдИ рд╕реНрд╡рд┐рдлреНрдЯ:
https://gist.github.com/rxwei/30ba75ce092ab3b0dce4bde1fc2c9f1d
@timholy рдФрд░ @Keno рдХреЛ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рд╕реНрдерд╛рди рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдкреНрд░рд╕реНрддреБрддрд┐ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред

рдЧреИрд░-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдЪрд╛рд░реЛрдВ рдФрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдВрдХ рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╡рдЪрди рд╕реВрддреНрд░ рд╢реБрд░реВ рдХрд░рдирд╛ рдФрд░ рд╡рд╣рд╛рдВ рдкреЛрд╕реНрдЯ рдХрд░рдирд╛ рдФрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рд╢реЛрдз рдореЗрдВ рд╕рд╛рдордиреЗ рдЖрдИ рдФрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд▓рдЧрднрдЧ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИрдВред рд╕реНрдЯреЗрдЯрд┐рдХ рднрд╛рд╖рд╛рдПрдВ рд▓рдЧрднрдЧ рдЕрдирдиреНрдп рд░реВрдк рд╕реЗ рдЙрд╕ рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ рдЬреЛ рд╡реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ рдЕрднреА рднреА рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ рдХрд┐ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рд╕рд┐рд╕реНрдЯрдо рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕реНрдерд┐рд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред

рд╣рдо рдЬрд┐рд╕ рдЪреАрдЬ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рдПрдХ рд╕рдВрд░рдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬрд┐рд╕реЗ рднрд╛рд╖рд╛ рддрдм рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ (рдЕрдЧреНрд░рд┐рдо рдореЗрдВ, рдЬрдм рд╕рдВрднрд╡ рд╣реЛ)ред рд╣рдо рд▓реЛрдЧреЛрдВ рдХреЛ рд▓рдХреНрд╖рдгреЛрдВ рдЬреИрд╕реА рдЪреАрдЬрд╝реЛрдВ рдкрд░ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рднреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ; рдпрд╣ рдЦреБрд▓рд╛ рд░рд╣рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдирд┐рдЪрд▓рд╛ рд░реЗрдЦрд╛: рдЬрдмрдХрд┐ рд╕реНрдерд┐рд░ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рдЕрдХрд╛рджрдорд┐рдХ рдХрд╛рд░реНрдп рд╕рд╛рдорд╛рдиреНрдп рд░реБрдЪрд┐ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИред

рд╣рдо рдЬрд┐рд╕ рдЪреАрдЬ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рдПрдХ рд╕рдВрд░рдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬрд┐рд╕реЗ рднрд╛рд╖рд╛ рддрдм рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ (рдЕрдЧреНрд░рд┐рдо рдореЗрдВ, рдЬрдм рд╕рдВрднрд╡ рд╣реЛ)ред рд╣рдо рд▓реЛрдЧреЛрдВ рдХреЛ рд▓рдХреНрд╖рдгреЛрдВ рдЬреИрд╕реА рдЪреАрдЬрд╝реЛрдВ рдкрд░ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рднреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ; рдпрд╣ рдЦреБрд▓рд╛ рд░рд╣рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

_рд╡рд╣ рд╣реИ_:рдЯрд┐рдХрдЯ:

рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рддреЛрдбрд╝рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдиреНрдореВрд▓рди рдФрд░ рдЧреЛрд▓рдВрдЧ-рд╢реИрд▓реА рдХреЗ рдирд┐рд╣рд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рд╢реБрд░реВрдЖрдд рд╕рдВрднрд╡ рд╣реЛрдЧреА?

рдирд╣реАрдВ, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ред

рдареАрдХ рд╣реИ, рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓/рд▓рдХреНрд╖рдг рд╣реИрдВ? рдХреБрдЫ рдЪрд░реНрдЪрд╛ рд╣реБрдИ рдХрд┐ рдХреНрдпрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдирд┐рд╣рд┐рдд рдпрд╛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 0.3 (2014) рдХреЗ рдмрд╛рдж рд╕реЗ, рдЕрдиреБрднрд╡ рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рдХрд┐ рдирд┐рд╣рд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ (рдпрд╛рдиреА рднрд╛рд╖рд╛/рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдирд╣реАрдВ) рдареАрдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рдХреБрдЫ рдкреИрдХреЗрдЬ рдХреИрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдмрд╛рдж рдореЗрдВ рдХреЗрд╡рд▓ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ (= рдкреНрд░рд▓реЗрдЦрд┐рдд) рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рднрд╛рд╖рд╛ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдФрдкрдЪрд╛рд░рд┐рдХ рд╡рд┐рд╡рд░рдг рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдпрд╣ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ (рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг, рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдФрд░ рд╕реНрдЯрд╛рдЗрд▓ рдЧрд╛рдЗрдб рдореЗрдВ):

  1. "рдЗрдВрдЯрд░рдлрд╝реЗрд╕" рд╕рд╕реНрддреЗ рдФрд░ рд╣рд▓реНрдХреЗ рд╣реЛрддреЗ рд╣реИрдВ, рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ (рд╣рд╛рдВ, рдкреНрд░рдХрд╛рд░ рдЧреНрд░реИрдиреНрдпреБрд▓реИрд░рд┐рдЯреА рдХрд╛ рд╕рд╣реА рд╕реНрддрд░ рд╣реИрдВ - x::T , T рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ x рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ)ред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдХреЛрдИ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЬ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝рд┐рдд рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

  2. рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдзреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ ред рдПрдХ рд╕рд╛рдорд╛рдиреНрдп (рдЧреИрд░-рддреБрдЪреНрдЫ) рд╕реБрдкрд░рдЯреЗрдк рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрдИ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

  3. рдЕрдЧреНрд░реЗрд╖рдг/рд░рдЪрдирд╛ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред "рдХреИрд╕реЗ рдПрдХ рд░реИрдкрд░ рдХреЛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╕рднреА рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдмрдирд╛рдпрд╛ рдЬрд╛рдП" рдПрдХ рдРрд╕рд╛ рд╕рд╡рд╛рд▓ рд╣реИ рдЬреЛ рдЕрдХреНрд╕рд░ рдлрд╕рд▓ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╣реА рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рд╣реИред рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдорд╛рдзрд╛рди рдПрдХ рдХреЛрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдирд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреЗрд╡рд▓ рд░реИрдкрд░ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред

  4. рд▓рдХреНрд╖рдг рд╕рд╕реНрддреЗ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЗрдиреНрд╣реЗрдВ рдЙрджрд╛рд░рддрд╛рдкреВрд░реНрд╡рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред Base.IndexStyle рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд╡рд┐рд╣рд┐рдд рдЙрджрд╛рд╣рд░рдг рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рдХреНрдпрд╛ рд╣реИ:

  1. рдХреНрдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рдХреНрд╡реЗрд░реА рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ Tables.istable рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреЛрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ, рдЕрдЧрд░ рдХреЛрдИ рдХреЙрд▓рд░ рд╡рд┐рднрд┐рдиреНрди рд╡реИрдХрд▓реНрдкрд┐рдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХрдорд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдиреАрдЪреЗ рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

  2. рдбреЙрдХрд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рдХреНрдпрд╛ рд╣реИ? рдореИрдВ рдКрдкрд░ рдХреНрд╡реЗрд░реА рдлрд╝рдВрдХреНрд╢рди рдХрд╣реВрдВрдЧрд╛ред

  1. рд╣рд╛рдВ, рдкреНрд░рдХрд╛рд░ рдЧреНрд░реИрдиреНрдпреБрд▓реИрд░рд┐рдЯреА рдХрд╛ рд╕рд╣реА рд╕реНрддрд░ рд╣реИрдВ

рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ? рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдХреБрдЫ рдкрд╣рд▓реБрдУрдВ рдХреЛ рдЗрдВрдЯрд░рдлреЗрд╕ (рдкреНрд░реЗрд╖рдг рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП), рдЬреИрд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛ рдЖрдкрдХреЛ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕рдВрд░рдЪрдирд╛ рд▓рд╛рдЧреВ рдХрд░рдиреА рд╣реЛрдЧреАред

  1. рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдзреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ ред

рд╢рд╛рдпрдж рдпрд╣ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛? рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддрдиреАрдп рдкреНрд░рдХрд╛рд░ рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░реЗрд╖рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдПрдХ рдЯрд╛рдЗрд▓ рд╡рд╛рд▓реЗ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЙрдиреНрд╣реЗрдВ рдирд╛рдордорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреНрдпреЛрдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдирд╛рдордорд╛рддреНрд░ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ рдпрджрд┐ рдЖрдк рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рд╕рд╛рд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рд▓рдХреНрд╖рдг рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХ рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рд╣реЛрдЧрд╛ред рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рд▓рдЧрднрдЧ рд▓рдХреНрд╖рдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЙрдирдХреА рд╕реАрдорд╛рдУрдВ (рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд) рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдирд╛рдордорд╛рддреНрд░ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ рдпрджрд┐ рдЖрдк рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рд╕рд╛рд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдкреНрд░реЗрд╖рдгтАФрдЖрдк рдирд╛рдордорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдкрд░ рдкреНрд░реЗрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдпрд╣ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рдмрддрдЦ рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣реА рд╡рд╣ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд▓реЛрдЧ рдЖрдорддреМрд░ рдкрд░ рдкрд╡рд┐рддреНрд░ рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: рд╡рд┐рд╢реЗрд╖рддрд╛ рдЖрдкрдХреЛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд╖рдг рдХрд░рдиреЗ рджреЗрддреА рд╣реИ рдЬреЛ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "рдЬреНрдЮрд╛рдд рд▓рдВрдмрд╛рдИ")ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рд╕рдВрдХреЗрдд рдХреА рдЙрд╕ рдкрд░рдд рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рд╣реИ, рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ? рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдХреБрдЫ рдкрд╣рд▓реБрдУрдВ рдХреЛ рдЗрдВрдЯрд░рдлреЗрд╕ (рдкреНрд░реЗрд╖рдг рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП), рдЬреИрд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛ рдЖрдкрдХреЛ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕рдВрд░рдЪрдирд╛ рд▓рд╛рдЧреВ рдХрд░рдиреА рд╣реЛрдЧреАред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ @tpapp рдХрд╣ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рди рдХрд┐ рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкреНрд░рдХрд╛рд░ рдкрджрд╛рдиреБрдХреНрд░рдореЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

MacroTools рдХреЗ forward рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдмрд╕ рдПрдХ рд╡рд┐рдЪрд╛рд░:

рдХрдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдирд╛ рдХрднреА-рдХрднреА рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛрддрд╛ рд╣реИ

<strong i="9">@forward</strong> Foo.x a b c d ...

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо Foo.x рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╡рд┐рдзрд┐ рдХреА рдПрдХ рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ? рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ inheritance рдФрд░ рдЗрд╕реЗ рдореМрдЬреВрджрд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ (рдореИрдХреНрд░реЛрдЬрд╝ + рдЬреЗрдирд░реЗрдЯ рдлрд╝рдВрдХреНрд╢рди) рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рднрд╛рд╖рд╛ рдореЗрдВ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрднреА рднреА рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖрдП рдЬреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ (рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕реНрдерд┐рд░ class рдореЙрдбрд▓ рдХрдо рд▓рдЪреАрд▓рд╛ рд╣реИ), рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЦреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ ( (рдХреЗ рдЙрдк-рдкреНрд░рдХрд╛рд░ рдЬреИрд╕реЗ рдХрд┐рд╕реА рдХреЛ рдПрдХ рдЖрд╡рд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ AbstractArray рдХреЗ рдЖрд╕рдкрд╛рд╕) Array , рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдмрд╕реЗ рдмрд╕ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ)

@datnamer : рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреНрдп рдиреЗ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рджрд╛рдиреЗрджрд╛рд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╛рдиреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрднреА рднреА рдореВрд▓реНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдкреНрд░рдХрд╛рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП)ред рдпрд╣ рд╕рдВрдХрд▓рдХ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреЛрдИ рдмрд╛рдзрд╛ рдирд╣реАрдВ рд╣реИред

рд╢рд╛рдпрдж рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдореЗрд░реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рдмрддрд╛рдирд╛ рдерд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд╕ рд╣рдж рддрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ рдЬреЛ рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИрдВ, рдФрд░ рд╡реЗ рд╣рд▓реНрдХреЗ, рддреЗрдЬ рдФрд░ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХ рддрдВрддреНрд░ рдХреЗ рдкрд░рд┐рдкрдХреНрд╡ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╛рдкрдХ рд╣реЛрддреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред

рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрдкрдЪрд╛рд░рд┐рдХ рдпреБрдХреНрддрд┐ рдЖрдИрдПрдордУ рдХреЛ рдереЛрдбрд╝рд╛ рдореВрд▓реНрдп рдЬреЛрдбрд╝рддреА рд╣реИ: рдпрд╣ рдХреЗрд╡рд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдФрд░ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреБрдЫ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░рд╛ рднрд╛рдЧ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╢рдмреНрджрд╛рд░реНрде рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ A рдПрдХ рд╕рд░рдгреА рд╣реИ, рддреЛ axes(A) рдореБрдЭреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ getindex рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реИрдВ

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдЬреЛ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ рд╡рд╣ рд╣реИ

  1. рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди (рдПрдХ рдбреЙрдХрд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ),

  2. рдирдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдкрдХреНрд╡ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ T <: AbstractArray eltype(::T) рдФрд░ eltype(::Type{T}) ред

@tpapp рдЕрдм рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рджред

@StefanKarpinski рдореИрдВ рдХрд╛рдлреА рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ред рд▓рдХреНрд╖рдг рдирд╛рдордорд╛рддреНрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ (рджрд╛рдПрдВ?), рдлрд┐рд░ рднреА, рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореЗрд░реА рдмрд╛рдд рдореВрд▓ рд░реВрдк рд╕реЗ @tknopp рдФрд░ @mauro3 рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ: https://discourse.julialang.org/t/why-does-julia-not-support-multiple-traits/5278/43?u=datnamer

рдХрд┐ рд▓рдХреНрд╖рдг рдФрд░ рдЕрдореВрд░реНрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╣реЛрдиреЗ рд╕реЗ, рджреЛ рд╕рдорд╛рди рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рд╣реЛрдиреЗ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрдЯрд┐рд▓рддрд╛ рдФрд░ рднреНрд░рдо рд╣реЛрддрд╛ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рд╕рдВрдХреЗрдд рдХреА рдЙрд╕ рдкрд░рдд рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рд╣реИ, рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдпреВрдирд┐рдпрдиреЛрдВ рдФрд░ рдЪреМрд░рд╛рд╣реЛрдВ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣реАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде, рдордЬрдмреВрддреА рд╕реЗ? рдореИрдВрдиреЗ рдЗрд╕рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкреНрд░рдХрд╛рд░ рдбреЛрдореЗрди рдореЗрдВ рдЖрдИрдИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдорд╕реНрдпрд╛ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рдореЗрд░рд╛ рд╕рдВрдпреЛрдЬрди рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдмрд╕ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдкреЛрд╕реНрдЯ рдХрд░рдирд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдордЬреЗрджрд╛рд░ рд╣реИ: рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╕реА ++ 20 рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдЧрд╛ред рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╛рдорд╛рди!

https://herbsutter.com/2019/02/23/trip-report-winter-iso-c-standards-meeting-kona/
https://en.cppreference.com/w/cpp/language/constraints

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓рдХреНрд╖рдг рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ рдФрд░ рдкрд╡рд┐рддреНрд░ рд▓рдХреНрд╖рдг рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд▓рдВрдмрд╛ рд╕рдлрд░ рддрдп рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреВрд▓рд┐рдпрд╛ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдореВрд╣реАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рдЕрдм рддрдХ рдЬреЛ рджреЗрдЦрд╛ рд╣реИ, рдЙрд╕рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░рд╕реНрдЯ рдХреА рддрд░рд╣ рдПрдХ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдЗрдЯрд░реЗрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдВ рдЙрд╕ рддрд░рд╣ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ (рд▓рдВрдмрд╛ рдзрд╛рдЧрд╛ ...)

import Base: Generator
<strong i="6">@require</strong> getindex(AbstractArray, Vararg{Int})
function getindex(container::Generator, index...)
    iterator = container.iter
    if <strong i="7">@works</strong> getindex(iterator, index...)
        container.f(getindex(iterator, index...))
    else
        <strong i="8">@interfaceerror</strong> getindex(iterator, index...)
    end
end
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

wilburtownsend picture wilburtownsend  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

iamed2 picture iamed2  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

manor picture manor  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

i-apellaniz picture i-apellaniz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

omus picture omus  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ