Julia: рдЖрд╢реНрд░рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕реНрд╡рдд: рдкреБрди: рд╕реНрдерд╛рдкрди

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

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

julia> function d2()
       a
       end

julia> function d()
         d2()
       end

julia> d()
in d: a not defined

julia> function d2()
       b=2
       end

julia> d()
in d: a not defined

julia> d2
Methods for generic function d2
d2() at prompt:2

julia> function d()
         d2()
       end

julia> d()
2

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

рд╡рд╛рд╣ред рдХреНрдпрд╛ рд╢рд╛рдирджрд╛рд░ рдкрд▓ рд╣реИ!

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

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

рдореИрдВ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреЛрдИ рднреА рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдирд╣реАрдВ рдерд╛ :)

рдпрд╣ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдордЬреЗрджрд╛рд░ рд╣реИ; рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЛ JIT рдХреЛ рдХрд╛рдо рдкрд░ рджреЗрдЦрдиреЗ рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рддрдХ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

julia> function f2()
       a
       end

julia> function f1()
       f2()
       end

julia> function f2()
       2
       end

julia> f1()
2

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

рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдерд╛рди рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХрд┐рд╕реА рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдкрд░ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ:

  • рд╡реЗ рд╕реНрдерд╛рди рдЬрд╣рд╛рдБ рд╡рд┐рдзрд┐ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХреЙрд▓ / рд░рд┐рдЯ)
  • рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЬрд╣рд╛рдВ рд╡рд┐рдзрд┐ рдХреЛ рдЗрдирд▓рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

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

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

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

рд╣рдореЗрдВ рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред

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

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

  • рдЬреЗрд╕рди

31 рдорд╛рд░реНрдЪ 2012 рдХреЛ, 11:02 рдмрдЬреЗ, рдЬреЗрд╕рди рдИред рдПрдЯреЗрди рдиреЗ рд▓рд┐рдЦрд╛:

рдкреНрд░рд┐рдп LLDB рдЙрддреНрд╕рд╛рд╣реА,

рдЕрдЧрд░ рдореИрдВ OSX рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ lldb рд▓рд╛рдЗрдмреНрд░реЗрд░реА / рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ рддреЛ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдЕрдм рдкреНрд░рддреАрдХреЛрдВ рдХреА рджреЛ рд╕реВрдЪрд┐рдпрд╛рдБ рд▓реМрдЯреЗрдВ- (dyldinfo -lazy_bind -exports) рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рдорд╛рди); рдпрд╛рдиреА рдореБрдЭреЗ рдмрд╛рдЗрдирд░реА рд╢реЗрдпрд░реНрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╛ рдмрдВрдбрд▓ рджреНрд╡рд╛рд░рд╛ рдЖрдпрд╛рдд рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдореЗрд░реА рдЖрд╢рд╛ рдереА рдХрд┐ рдПрдХ lldb рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдореИрдВ OSX рдкрд░ рдЙрд╕реА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдКрдВрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд▓рд┐рдирдХреНрд╕ рдкрд░ рд╣реИред (рдХреЛрдб рдХрд╛ рд▓рд┐рдирдХреНрд╕ рд╕рдВрд╕реНрдХрд░рдг рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП libbfd рдФрд░ libdld рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдереЛрдбрд╝рд╛ рдкреНрдпрд╛рд░ / рд░рдЦрд░рдЦрд╛рд╡ рд╣реЛ рд░рд╣рд╛ рд╣реИ)ред

рдореИрдВ рд╢рд╛рдорд┐рд▓ / lldb / рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП lldb рдХреЛ рдЗрд╕реА рдЬрд╛рдирдХрд╛рд░реА (рдЖрдпрд╛рддрд┐рдд рдкреНрд░рддреАрдХ рд╕реВрдЪреА, рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдХреА рдЧрдИ рдЪрд┐рд╣реНрди рд╕реВрдЪреА) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред Lldb рдореЗрдВ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕реБрдЭрд╛рд╡реЛрдВ / рд╕рдВрдХреЗрдд рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛!

рдзрдиреНрдпрд╡рд╛рджред
рдЬреЗрд╕рди

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

$ рдлрд╝рд╛рдЗрд▓ / tmp / sample_bundle
/ tmp / sample_bundle: Mach-O 64-рдмрд┐рдЯ рдмрдВрдбрд▓ x86_64

$ dyldinfo -lazy_bind -export / tmp / sample_bundle

рдЖрд▓рд╕реА рдмрд╛рдзреНрдпрдХрд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА (dyld рдЬрд╛рдирдХрд╛рд░реА рдХреЗ lazy_bind рднрд╛рдЧ рд╕реЗ):
рдЦрдВрдб рдЦрдВрдб рдкрддрд╛ рд╕реВрдЪрдХрд╛рдВрдХ dylib рдкреНрд░рддреАрдХ
__DATA __la_symbol_ptr 0x00001030 0x0000 рдлреНрд▓реИрдЯ-рдирд╛рдорд╕реНрдерд╛рди __mm_pop_chunk
__DATA __la_symbol_ptr 0x00001038 0x0015 рдлреНрд▓реИрдЯ-рдирд╛рдорд╕реНрдерд╛рди _dh_define
рдирд┐рд░реНрдпрд╛рдд рдЬрд╛рдирдХрд╛рд░реА (trie рд╕реЗ):
0x000008A0 _C_ipair
0x00000920 _init_ipair
0x00000BC0 _C_iprot
0x00000C40 _C_ipi2
0x00000CC0 _C_ipi1
0x00001040 _K_ipair_R43808f40
0x00001160 _K_ipi1_R5cb4475d
0x00001260 _K_ipi2_R5cb4475d
0x00001360 _K_iprot_Rfc8fe739
0x00001460 _majver_ipair
0x00001464 _minver_ipair

рд╕реЛрдо, 2 рдЕрдкреНрд░реИрд▓, 2012 рдХреЛ 3:13 рдмрдЬреЗ, рдЧреНрд░реЗрдЧ рдХреНрд▓реЗрдЯрди [email protected] рдиреЗ рд▓рд┐рдЦрд╛:

Yes you can do this with LLDB. If you load a binary and dump its symbol table, you will see the information you want. For symbols that are lazily bound, you can look for "Trampoline" symbols:

cd lldb/test/lang/objc/foundation
make
lldb a.out
(lldb) target modules dump symtab a.out
Symtab, file = .../lldb/test/lang/objc/foundation/a.out, num_symbols = 54:
              Debug symbol
              |Synthetic symbol
              ||Externally Visible
              |||
Index   UserID DSX Type         File Address/Value Load Address       Size               Flags      Name
------- ------ --- ------------ ------------------ ------------------ ------------------ ---------- ----------------------------------
[    0]      0 D   SourceFile   0x0000000000000000                    Sibling -> [   15] 0x00640000 /Volumes/work/gclayton/Documents/src/lldb/test/lang/objc/foundation/main.m
[    1]      2 D   ObjectFile   0x000000004f79f1ca                    0x0000000000000000 0x00660001 /Volumes/work/gclayton/Documents/src/lldb/test/lang/objc/foundation/main.o
[    2]      4 D   Code         0x00000001000010f0                    0x00000000000000c0 0x000e0000 -[MyString initWithNSString:]
[    3]      8 D   Code         0x00000001000011b0                    0x0000000000000090 0x000e0000 -[MyString dealloc]
[    4]     12 D   Code         0x0000000100001240                    0x00000000000000a0 0x000e0000 -[MyString description]
[    5]     16 D   Code         0x00000001000012e0                    0x0000000000000020 0x000e0000 -[MyString descriptionPauses]
[    6]     20 D   Code         0x0000000100001300                    0x0000000000000030 0x000e0000 -[MyString setDescriptionPauses:]
[    7]     24 D   Code         0x0000000100001330                    0x0000000000000030 0x000e0000 -[MyString str_property]
[    8]     28 D   Code         0x0000000100001360                    0x0000000000000050 0x000e0000 -[MyString setStr_property:]
[    9]     32 D   Code         0x00000001000013b0                    0x0000000000000040 0x000f0000 Test_Selector
[   10]     36 D   Code         0x00000001000013f0                    0x0000000000000130 0x000f0000 Test_NSString
[   11]     40 D   Code         0x0000000100001520                    0x0000000000000120 0x000f0000 Test_MyString
[   12]     44 D   Code         0x0000000100001640                    0x00000000000001b0 0x000f0000 Test_NSArray
[   13]     48 D   Code         0x00000001000017f0                    0x00000000000000e1 0x000f0000 main
[   14]     56 D X Data         0x0000000100002680                    0x0000000000000000 0x00200000 my_global_str
[   15]     58 D   SourceFile   0x0000000000000000                    Sibling -> [   19] 0x00640000 /Volumes/work/gclayton/Documents/src/lldb/test/lang/objc/foundation/my-base.m
[   16]     60 D   ObjectFile   0x000000004f79f1ca                    0x0000000000000000 0x00660001 /Volumes/work/gclayton/Documents/src/lldb/test/lang/objc/foundation/my-base.o
[   17]     62 D   Code         0x00000001000018e0                    0x0000000000000020 0x000e0000 -[MyBase propertyMovesThings]
[   18]     66 D   Code         0x0000000100001900                    0x000000000000001f 0x000e0000 -[MyBase setPropertyMovesThings:]
[   19]     82     Data         0x0000000100002000                    0x0000000000000460 0x000e0000 pvars
[   20]     83     ObjCIVar     0x0000000100002518                    0x0000000000000148 0x001e0000 MyBase.propertyMovesThings
[   21]     84   X Data         0x0000000100002660                    0x0000000000000008 0x000f0000 NXArgc
[   22]     85   X Data         0x0000000100002668                    0x0000000000000008 0x000f0000 NXArgv
[   23]     86   X ObjCClass    0x00000001000024d8                    0x0000000000000028 0x000f0000 MyBase
[   24]     87   X ObjCClass    0x0000000100002460                    0x0000000000000028 0x000f0000 MyString
[   25]     88   X ObjCIVar     0x0000000100002510                    0x0000000000000008 0x000f0000 MyString._desc_pauses
[   26]     89   X ObjCIVar     0x0000000100002508                    0x0000000000000008 0x000f0000 MyString.date
[   27]     90   X ObjCIVar     0x0000000100002500                    0x0000000000000008 0x000f0000 MyString.str
[   28]     91   X ObjCMetaClass 0x00000001000024b0                    0x0000000000000028 0x000f0000 MyBase
[   29]     92   X ObjCMetaClass 0x0000000100002488                    0x0000000000000028 0x000f0000 MyString
[   30]     97   X Data         0x0000000100002678                    0x0000000000000008 0x000f0000 __progname
[   31]     98   X Data         0x0000000100000000                    0x00000000000010b0 0x000f0010 _mh_execute_header
[   32]     99   X Data         0x0000000100002670                    0x0000000000000008 0x000f0000 environ
[   33]    101   X Data         0x0000000100002680                    0x0000000000000000 0x000f0000 my_global_str
[   34]    102   X Code         0x00000001000010b0                    0x0000000000000040 0x000f0000 start
[   35]    103     Trampoline   0x0000000100001938                    0x0000000000000006 0x00010200 NSLog
[   36]    104   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010400 OBJC_CLASS_$_NSArray
[   37]    105   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010200 OBJC_CLASS_$_NSAutoreleasePool
[   38]    106   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010400 OBJC_CLASS_$_NSDate
[   39]    107   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010400 OBJC_CLASS_$_NSObject
[   40]    108   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010200 OBJC_CLASS_$_NSString
[   41]    109   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010400 OBJC_METACLASS_$_NSObject
[   42]    110   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010400 __CFConstantStringClassReference
[   43]    111   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010100 _objc_empty_cache
[   44]    112   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010100 _objc_empty_vtable
[   45]    113     Trampoline   0x000000010000193e                    0x0000000000000006 0x00010300 exit
[   46]    114     Trampoline   0x0000000100001920                    0x0000000000000006 0x00010100 objc_getProperty
[   47]    115     Trampoline   0x0000000100001926                    0x0000000000000006 0x00010100 objc_msgSend
[   48]    116     Trampoline   0x000000010000192c                    0x0000000000000006 0x00010100 objc_msgSendSuper2
[   49]    117   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010100 objc_msgSend_fixup
[   50]    118     Trampoline   0x0000000100001932                    0x0000000000000006 0x00010100 objc_setProperty
[   51]    119     Trampoline   0x0000000100001944                    0x0000000000000006 0x00010300 printf
[   52]    120     Trampoline   0x000000010000194a                    0x0000000000000006 0x00010300 usleep
[   53]    121   X Undefined    0x0000000000000000                    0x0000000000000000 0x00010300 dyld_stub_binder
(lldb)


All lazily bound symbols will have type Trampoline:

[   45]    113     Trampoline   0x000000010000193e                    0x0000000000000006 0x00010300 exit
[   46]    114     Trampoline   0x0000000100001920                    0x0000000000000006 0x00010100 objc_getProperty
[   47]    115     Trampoline   0x0000000100001926                    0x0000000000000006 0x00010100 objc_msgSend
[   48]    116     Trampoline   0x000000010000192c                    0x0000000000000006 0x00010100 objc_msgSendSuper2
[   50]    118     Trampoline   0x0000000100001932                    0x0000000000000006 0x00010100 objc_setProperty
[   51]    119     Trampoline   0x0000000100001944                    0x0000000000000006 0x00010300 printf
[   52]    120     Trampoline   0x000000010000194a                    0x0000000000000006 0x00010300 usleep

The other symbols that are exernal are marked with an "X" (which is a boolean flag on each symbol).

The symbols can be accessed via the SBModule:

   size_t
   SBModule::GetNumSymbols ();

   lldb::SBSymbol
   SBModule::GetSymbolAtIndex (size_t idx);

And then you can get the symbol type from each SBSymbol:

   SymbolType
   SBSymbol::GetType ();


I just added the ability to see if a symbol is externally visible:
% svn commit
Sending        include/lldb/API/SBSymbol.h
Sending        scripts/Python/interface/SBSymbol.i
Sending        source/API/SBSymbol.cpp
Transmitting file data ...
Committed revision 153893.


   bool
   SBSymbol::IsExternal();


So your flow should be:

SBDebugger::Initialize();
SBDebugger debugger(SBDebugger::Create());
SBTarget target (debugger.CreateTarget (const char *filename,
                                       const char *target_triple,
                                       const char *platform_name,
                                       bool add_dependent_modules,
                                       lldb::SBError& error));

SBFileSpec exe_file_spec (filename);
SBModule exe_module (target.FindModule(exe_file_spec));
if (exe_module.IsValid()
{
   const size_t num_symbols = exe_module. GetNumSymbols();
   for (size_t i=0; i<num_symbols; ++i)
   {
       SBSymbol symbol (exe_module. GetSymbolAtIndex(i));
       if (symbol.IsExternal())
       {
       }

       if (symbol.GetType() == lldb::eSymbolTypeTrampoline)
       {
       }
   }
}




> _______________________________________________
> lldb-dev mailing list
> [email protected]
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

рд╕реЛрдо, 2 рдЕрдкреНрд░реИрд▓ 2012 рдХреЛ рд╢рд╛рдо 4:05 рдмрдЬреЗ, рдЧреНрд░реЗрдЧ рдХреНрд▓реЗрдЯрди [email protected] рдиреЗ рд▓рд┐рдЦрд╛:

A quick clarification on the args to CreateTarget:

"filename" is just a full path to the local object file you want to observer. "target_triple" is your <arch>-<vendor>-<os>, or something like "x86_64-apple-darwin" or "i386-pc-linux" and can be NULL if the file is only a single architecture. "platform_name" can be NULL. "add_dependent_modules" should be false, since you are only interested in seeing the one object file itself, an SBError instance  should be created and passed in.

рджреЗрд╡-рд╕реВрдЪреА рдЪрд░реНрдЪрд╛ рдпрд╣рд╛рдВ: https://groups.google.com/forum/?fromgroups=# -topic/julia -dev / snnGKJul4vgред

рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдиреЗ рдзрд╛рдЧреЗ рдХреЛ рддреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореИрдВ рд╕рдВрднрд╡рддрдГ рдЕрдкрдиреЗ рдХреЛрдбреЗрдХреНрд╕ рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЫреЗрдбрд╝рдЦрд╛рдиреА рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдмрд╛рд░-рдмрд╛рд░ Core.include() рдлрд╛рдЗрд▓ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рджреЛ рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВ, listTests() рдФрд░ runTests() ред рдореИрдВ рддрдм listTests() рдФрд░ runTests() рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рд╕реЗ рдлрд┐рд░ рд╕реЗ рдирдпрд╛ рд╕реНрд╡рд░реВрдк рддреИрдпрд╛рд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╣рд░ рдмрд╛рд░ рдЬрдм рдореИрдВ рдПрдХ рдирдИ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХрд░рддрд╛ рд╣реВрдВред рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ 2-рд╕реНрддрд░реАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ рд╕реВрдЪреАрдмрджреНрдз рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рднрд╛рдЧ рд▓реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА "рдПрдкреАрдЖрдИ" рдХреЗ рд╕рд╛рде рдХрдИ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд▓реЛрдб рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЪреАрдЬреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ?

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

рд╢рд╛рдпрдж рдПрдХ рдкреБрд░рд╛рдирд╛ рдзрд╛рдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХред
рд╢рд╛рдпрдж рдПрдХ рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг evalfile рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ "рд░рд┐рдЯрд░реНрди" рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЕрдирд╛рдо рдореЙрдбреНрдпреВрд▓ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ?

рдореИрдВ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд░рд╣рд╛ рдерд╛: https://github.com/JuliaLang/julia/issues/3661

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

рдпрд╣ рдЙрддрдирд╛ рд╣реА рдЙрдЪрд┐рдд рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рдХреЛрдИ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдорд╣рд╕реВрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЖрдЧреЗ рдмрдврд╝реЛ рдФрд░ рдЪрд▓реЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ!

рдпрджрд┐ рдХреЙрд▓рд▓реА рдХреЗ рдкреБрдирд░реНрд╕рдВрдпреЛрдЬрди рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдХреЗ _execution_ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?

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

_method_cache = Dict()
function myfunction(A::AbstractArray)
    N = ndims(A)
    if !haskey(_method_cache, N)
        func = eval(<an expression that generates the function definition for N dimensions>)
        _method_cache[N] = func
    else
        func = _method_cache[N]
    end
    return func(A)
end

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

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

рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

function myfunction(A::AbstractArray)
    bodyexpr = <an expression for the body of the function specific for N dimensions>
    f = <strong i="17">@eval</strong> begin
        function myfunction(A::$(typeof(A)))
            $bodyexpr
        end
    end
    return f(A)
end

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

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

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

# 5395 рднреА рджреЗрдЦреЗрдВред

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

abstract A
immutable B <: A; end
immutable C <: A; end

g(x::Vector{A}) = f(x[1])

f(::B) = 1
g(A[B()])

f(::C) = 0.5
g(A[C()])

рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ 4602678819172646912 ред рд╣рдореЗрдВ g рдХреЗ рд▓рд┐рдП рдХреЛрдб рдмрд╛рд╣рд░ рдлреЗрдВрдХрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ f(::A) рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХреА рдкреБрд╖реНрдЯрд┐ рдЕрдм рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред

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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХрддреА рд╣реИ

f() = x()
x() = 1
println(f())
x() = 2
println(f())

рджреЗрддрд╛ рд╣реИ

1
1

рдЬрдмрдХрд┐

g() = y()
precompile(g, ())
y() = 1
println(g())
y() = 2
println(g())

рджреЗрддрд╛ рд╣реИ

1
2

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

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

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

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

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

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

@JeffBezanson рдореИрдВ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдорд╛рдорд▓реЗ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд▓реЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ eval (рдЬреИрд╕реЗ REPL рдкреНрд░реЙрдореНрдкреНрдЯ рдкрд░ рджрд░реНрдЬ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХреА рдЧрдИ рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрддред рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ рдкреБрдирд░реНрдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдкрд░ display рдХрд╛ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╡реГрджреНрдзрд┐рд╢реАрд▓ рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд░реАрдм рдЖрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

julia> f(a, b) = a + b
f (generic function with 1 method)

julia> g(args...) = f(args...)
g (generic function with 1 method)

julia> g(1, 2)
3

julia> f(a::Int, b::Int) = a - b
f (generic function with 2 methods)

julia> g(1, 2)
-1

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

julia> f(a, b) = a + b
f (generic function with 1 method)

julia> g(a, b) = f(a, b)
g (generic function with 1 method)

julia> g(1, 2)
3

julia> f(a::Int, b::Int) = a - b
f (generic function with 2 methods)

julia> g(1, 2)
3

рджрд░рдЕрд╕рд▓, рдлрд╝рдВрдХреНрд╢рди рд╕рд╣реА рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди @code_typed рдЧрд▓рдд рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ .....

julia> f(a, b) = a + b
f (generic function with 1 method)

julia> g(args...) = f(args...)
g (generic function with 1 method)

julia> g(1, 2)
3

julia> <strong i="7">@code_typed</strong> g(1, 2)
1-element Array{Any,1}:
 :($(Expr(:lambda, Any[:(args::(top(apply_type))(Vararg,Any)::Any::Any)], Any[Any[],Any[Any[:args,(Int64,Int64),0]],Any[]], :(begin  # none, line 1:
        return (top(box))(Int64,(top(add_int))((top(tupleref))(args::(Int64,Int64),1)::Int64,(top(tupleref))(args::(Int64,Int64),2)::Int64))
    end::Int64))))

julia> f(a::Int, b::Int) = a - b
f (generic function with 2 methods)

julia> g(1, 2)
-1

julia> <strong i="8">@code_typed</strong> g(1, 2)
1-element Array{Any,1}:
 :($(Expr(:lambda, Any[:(args::(top(apply_type))(Vararg,Any)::Any::Any)], Any[Any[],Any[Any[:args,(Int64,Int64),0]],Any[]], :(begin  # none, line 1:
        return (top(box))(Int64,(top(add_int))((top(tupleref))(args::(Int64,Int64),1)::Int64,(top(tupleref))(args::(Int64,Int64),2)::Int64))
    end::Int64))))

рддрдерд╛

julia> f(a, b) = a + b
f (generic function with 1 method)

julia> g(args...) = f(args...)
g (generic function with 1 method)

julia> g(1, 2)
3

julia> f(a::Int, b::Int) = a - b
f (generic function with 2 methods)

julia> g(1, 2)
-1

julia> <strong i="12">@code_typed</strong> g(1, 2)
1-element Array{Any,1}:
 :($(Expr(:lambda, Any[:(args::(top(apply_type))(Vararg,Any)::Any::Any)], Any[Any[],Any[Any[:args,(Int64,Int64),0]],Any[]], :(begin  # none, line 1:
        return (top(box))(Int64,(top(sub_int))((top(tupleref))(args::(Int64,Int64),1)::Int64,(top(tupleref))(args::(Int64,Int64),2)::Int64))
    end::Int64))))

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

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

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕ рдорд╕рд▓реЗ рдХрд╛ рд╣рд▓ рдЖрд╕рд╛рдиреА рд╕реЗ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рддреЛ рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ред

рдЗрд╕рд▓рд┐рдП рдПрдХ рдХреЛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрдирд▓рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред (рд╡рд░реНрддрдорд╛рди рдирд┐рд╖реНрдкрд╛рджрди рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рдБрдЪ)

рдпрд╣рд╛рдБ рдореБрд╢реНрдХрд┐рд▓ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

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

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

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

julia> function f(x)
         1
       end 
f (generic function with 1 method)

julia> map(f, 1:10)
10-element Array{Int64,1}:
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1

julia> function f(x)
         2
       end
WARNING: Method definition f(Any) in module Main at REPL[9]:2 overwritten at REPL[11]:2.
f (generic function with 1 method)

julia> map(f, 1:10)
10-element Array{Int64,1}:
 1
 1
 1
 1
 1
 1
 1
 1
 1
 1

рд╡рд╣ рдЕрднреА рднреА рд╕рд┐рд░реНрдл # 265 рд╡реЗрдирд┐рд▓рд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдЬрд▓реНрдж рд╣реА v0.6-dev рдореЗрдВ рддрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ :)

@vtjnash рдХреЛрдИ рд░рдирдЯрд╛рдЗрдо рдкреНрд░рджрд░реНрд╢рди рдпрд╛ рдореЗрдореЛрд░реА рдЯреНрд░реЗрдбрдСрдлрд╝ рд╣реИ?

рдЗрд╕рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝реА рдореЗрдореЛрд░реА (140 рдПрдордмреА -> 170 рдПрдордмреА) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рджрд░реНрд╢рди (рд╕рдВрдХрд▓рди рдпрд╛ рд░рдирдЯрд╛рдЗрдо) рдкрд░ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрднреА рддрдХ рдмрд╣реБрдд рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

рдЕрдм рддрдХ рдХреЗ рдбреЗрдореЛ рдордЬреЗрджрд╛рд░ рд╣реИрдВ:

julia> f() = 1
f (generic function with 1 method)

julia> function g(x)
    <strong i="7">@eval</strong> f() = $x # this is the correct way to write `global f() = x` (which should be a syntax error, but isn't currently)
    return @eval(f)() # use `eval` to hide the value from optimization / inlining, but the call is not inside eval
end
g (generic function with 1 method)

julia> g(2)
WARNING: Method definition f() in module Main at REPL[1]:1 overwritten at REPL[2]:2.
1

julia> g(3)
WARNING: Method definition f() in module Main at REPL[2]:2 overwritten at REPL[2]:2.
2

julia> g(4)
WARNING: Method definition f() in module Main at REPL[2]:2 overwritten at REPL[2]:2.
3

рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ 2, 3, рдЖрджреЗрд╢ рдХреЗ рдХрд╛рд░рдг 4, рдЬрд┐рд╕рдореЗрдВ рдХрд╛ рд╕рдВрдХрд▓рди рд╣реИ g рдмрдирд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдХрд┐ Redefines f рд╣реЛрддрд╛ рд╣реИ?

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

рдареАрдХ рд╣реИ, рдпрд╣рд╛рдБ + рдЖрджрд┐рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдордЬрд╝реЗрджрд╛рд░ рдереЛрдбрд╝рд╛ рдбреЗрдореЛ рд╣реИ рдЬреЛ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрддрд╛ рд╣реИ:

julia> add_ctr = UInt(0)
0x0000000000000000

julia> Base.:+(a::Int, b::Int) = (global add_ctr += 1; Core.Intrinsics.add_int(a, b))

julia> add_ctr
0x0000000000000016

julia> last = 0;

julia> println(Int(add_ctr - last)); last = add_ctr;
287

julia> println(Int(add_ctr - last)); last = add_ctr;
17

рдпрд╣ рдПрдХ рдзреЛрдЦрд╛ рд╣реИ: рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ + рдЙрдкрдпреЛрдЧ рдмреЗрд╕ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдерд╛ред svd рддрд░рд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ, рдЬрд┐рд╕реЗ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ REPL рдХреЛ рджрд┐рдЦрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрдо рд╕реЗ рдХрдо 100 рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рддрдм рд╣рдо рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрдВрдЧреЗред

рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ / рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЗ рд▓рд╛рдЗрд╡ рд░реА-рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди рдХреЗ рдЕрд╡рд╕рд░ рдореБрдЭреЗ рдЙрдбрд╝рд╛ рд░рд╣реЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВред рдФрд░ рдпрд╣рд╛рдБ рдореИрдВ рдПрдХ рдирдпрд╛ рдХреАрдмреЛрд░реНрдб рдЦрд░реАрджрдиреЗ рд╡рд╛рд▓рд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрдХреНрд░рдо Ctrl-D; julia<Enter> рдХреЗрд╡рд▓ рдкрд╣рдирд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ред рд▓рдЧрддрд╛ рд╣реИ рдореБрдЭреЗ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рдиреЛрдЯреЛрдВ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд╛ рд░рд╣рд╕реНрдпрдордп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдордЭ рдЕрдм collect Generator рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ (рдкрд╛рд░реНрд╕ рд╕реНрддрд░ рдкрд░ рд╢рд╛рдпрдж рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд╡рд┐рдкрд░реАрдд) 0.4 рдореЗрдВ? - @which рд╡рд╣рд╛рдБ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)? рдпрд╣ рдЙрджрд╛рд╣рд░рдг, vchuravy рдХреЗ рдЙрдкрд░реЛрдХреНрдд рдХреЗ рд╕рдорд╛рди рд╣реИ, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рднреА рдПрдХ рдЧреЛрддреНрд░ рдХрд╛ рдПрдХ рд╕рд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдЕрдм 0.5 рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ:

               _
   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: http://docs.julialang.org
   _ _   _| |_  __ _   |  Type "?help" for help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.5.0-rc3+0 (2016-08-22 23:43 UTC)
 _/ |\__'_|_|_|\__'_|  |
|__/                   |  x86_64-linux-gnu

julia> f(x) = 1
f (generic function with 1 method)

julia> [f(x) for x in 1:5]
5-element Array{Int64,1}:
 1
 1
 1
 1
 1

julia> f(x) = 2
WARNING: Method definition f(Any) in module Main at REPL[1]:1 overwritten at REPL[3]:1.
f (generic function with 1 method)

julia> [f(x) for x in 1:5]
5-element Array{Int64,1}:
 1
 1
 1
 1
 1

julia> <strong i="9">@which</strong> [f(x) for x in 1:5]
collect(itr::Base.Generator) at array.jl:295

рдмрд┐рд▓рдХреБрд▓ рдареАрдХ рдирд╣реАрдВ?

рдлрд┐рдХреНрд╕ # 265 рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ

рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддрдп рд╣реИ ЁЯШ▓

рдХреНрдпрд╛ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рдЕрднреА рднреА 0.5.x рдкрд░ рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ?

рдирд╣реАрдВред

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

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдкреНрд░рдЧрддрд┐ рджреЗрдЦрдХрд░ рдмрд╣реБрдд рдЦреБрд╢ рд╣реВрдБ! рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ https://groups.google.com/forum/#/topic/julia -users / OBs0fmNmjCU рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдорд╛рдорд▓реЗ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рд╡рд╛рд╣ред рдХреНрдпрд╛ рд╢рд╛рдирджрд╛рд░ рдкрд▓ рд╣реИ!

рд╣рд╛рдп рджреЛрд╕реНрддреЛрдВ!

рдХреНрдпрд╛ рдЗрд╕ рдлрд┐рдХреНрд╕ рдХреЛ 0.5 рд╕реЗрд░реА рддрдХ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ? рдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ 0.6 рдореЗрдВ рдХреНрдпрд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛?

рдпрд╣ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ рдФрд░ рдХреЗрд╡рд▓ 0.6 рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛

рдпрд╣ рддрдп рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдмрдврд╝рд┐рдпрд╛ рд╣реИред рдкреБрд░рд╛рдиреА рдЖрджрддреЗрдВ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдорд░рддреА рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХрднреА-рдХрднреА рдЬреВрд▓рд┐рдпрд╛ рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдкреБрдирдГ рдЖрд░рдВрдн рдФрд░ / рдпрд╛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬрдм рдореБрдЭреЗ рдпрд╛рдж рдЖрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдЧреЗрдо-рдЪреЗрдВрдЬрд░ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕