Julia: рдЖрд▓рд╕реА рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрддрди

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

рдиреЛрдЯреЗрд╢рди f.(v) рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ f рдХреЛ рдПрдХ рд╕рд░рдгреА v рдкрд░ рдореИрдк рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдСрдкрд░реЗрд╢рди рдЖрд▓рд╕реА рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдореИрдк рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рдХреЛ рдЕрдорд▓ рдореЗрдВ рд▓рд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрд▓рд╕реА рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рдЕрдВрдХрди рд╣реЛрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╢рд╛рдпрдж f..(v) ? рдореИрдк рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рдХреЛ рдЕрдорд▓ рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЗрд╕реЗ рдЬрдирд░реЗрдЯрд░ рдХреЗ рдмрд░рд╛рдмрд░ рдХреБрдЫ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

(f(x) for x in v)

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

sum(f..(v))

рдЬреЛ рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рд╕рд░рдгреА рдХреЛ рднреМрддрд┐рдХ рдмрдирд╛рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реИ:

sum(f.(v))

рдмреЗрд╢рдХ рдЕрднреА sum рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ sum(f,v) рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рджреЗрдЦреЗрдВ: https://github.com/JuliaLang/julia/issues/19146ред рдЕрдЧрд░ рдХреЛрдИ sum(f,v) рд╡рд┐рдзрд┐ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдиреЛрдЯреЗрд╢рди sum(f..(v)) рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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

рдЕрдм рдЬрдм рдкреНрд░рд╕рд╛рд░рд┐рдд рд╡рд╕реНрддреБрдПрдВ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЧреИрд░-рднреМрддрд┐рдХ рдбреЙрдЯ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдмрд╛рдЗрдХрд╢реЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдмрд╕ рдЪреАрдЬреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢рд╛рдпрдж рдХреБрдЫ рдЧреИрд░-рдмреНрд░реЗрдХрд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдПрдХ рдЧреИрд░-рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╕реНрдЯреНрд░реЙ рдкреЛрд▓ (рдЬреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ f..(x) ):

  • :рдЕрдВрдЧреВрдард╛: for f.(x) (рд╡рд░реНрддрдорд╛рди x for y in z рдЬрдирд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рддрд░рд╣)
  • :рдЯрд╛рдбрд╛: .(f.(x))
  • :heart: <strong i="13">@lazy</strong> f.(x) ( Lazy.jl рд╕реЗ рдЯрдХрд░рд╛рддрд╛ рд╣реИ) рдпрд╛ <strong i="16">@lazy</strong> f(x) ( @. рддрд░рд╣ рдЕрднрд┐рдирдп)
  • ЁЯШХ рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ

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

рд╕рдВрджрд░реНрднред https://github.com/JuliaLang/julia/issues/16285#issuecomment -237320513 рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЪрд░реНрдЪрд╛ (рдХреЙрдореНрдкреИрдХреНрдЯ рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдХреЙрдореНрдкреИрдХреНрдЯ рдЙрдЪреНрдЪ-рдЖрджреЗрд╢ рдлрд╝рдВрдХреНрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░рдирд╛, рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ mapreduce рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ)ред рд╢реНрд░реЗрд╖реНрда!

рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ; рдЗрд╕рдореЗрдВ рд╕реЗ рдХрднреА рднреА рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд┐рдВрджреБ рдмрд╣реБрдд рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИрдВред рдХреНрдпрд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, f(2x + y) over x , рдЬреЛ f(2x_ + y) for x_ in x рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

f(2x + y) for x in x рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ f(2x + y) over x рд╕реЗ рдЕрдзрд┐рдХ рд╡рд░реНрдмреЛрдЬрд╝ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ over рдХреА рдмрдбрд╝реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рджрд┐рдЦрддреА рд╣реИред

(рдПрдХ рдЭреБрдВрдЭрд▓рд╛рд╣рдЯ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ: for рдкреНрд░рд╛рдердорд┐рдХрддрд╛ = рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП? рд╡рд░реНрддрдорд╛рди рдореЗрдВ, g = f(2x + y) for x in x рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред)

#16285 рдореЗрдВ рд╣рдордиреЗ sum..(f.(x)) (рдпрд╛ рд╢рд╛рдпрдж sum:(f.(x)) ) рдХреЛ sum(f, x) рдмрд░рд╛рдмрд░ рдмрдирд╛рдиреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреАред рдЗрд╕рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдлрд╝реНрдпреВрдЬрд╝рд┐рдВрдЧ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП sum..(f.(g.(x)) sum(x -> f(g(x)), x) рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ https://github.com/JuliaLang/julia/issues/16285 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рдерд╛

рд╡реИрд╕реЗ рднреА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рднреМрддрд┐рдХ рдмрдирд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрд▓рд╕реА рдирдХреНрд╢рд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдЖрдИрдПрдордПрдЪрдУ, рдореИрдВ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдХрд┐ f.(v) рдЬрдирд░реЗрдЯрд░ рд▓реМрдЯрд╛рдП:

(f(x) for x in v)

рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рдЕрдорд▓ рдореЗрдВ рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рддреЛ рдореИрдВ collect(f.(v)) ред

рджреВрд╕рд░реА рддрд░рдл, рдЕрдЧрд░ рдпрд╣ рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИ рддреЛ рдореИрдВ f.(v) "рдЕрдирдордЯреЗрд░рд┐рдпрд▓рд╛рдЗрдЬ" рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрд▓рд╕реА f.(v) рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, "рдлреНрдпреВрдЬрд┐рдВрдЧ" рдЖрд▓рд╕реА f.(v) рд╕рд╛рде рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣реИред

f.(v) рдПрдХ broadcast рдСрдкрд░реЗрд╢рди рд╣реИ, рдЬреЛ map рдпрд╛ рдЬрдирд░реЗрдЯрд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИред ( map рдФрд░ broadcast рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рди рддреЛ рджреВрд╕рд░реЗ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреА рд╣реИред)

рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╡рд╛рд▓ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдЖрд▓рд╕реА рдкреНрд░рд╕рд╛рд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдлрд╝реНрдпреВрдЬрд╝рд┐рдВрдЧ рднреМрддрд┐рдХрдХрд░рдг рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрд╢рд▓ рд╣реИред рдпрд╛рдиреА, рдорд╛рди рд▓реАрдЬрд┐рдП f.(x,y) рдиреЗ рдПрдХ AbstractArray рдЙрдкрдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рдпрд╛ рдЬреЛ рдЖрд▓рд╕реА рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЙрддреНрддрд░ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ "рдирд╣реАрдВ" рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдХреИрд╕реНрдХреЗрдб рдХрд░рддреЗ рд╣реИрдВ: z .= abs.(x.^2 .+ sin.(sqrt.(y .* 2))) ред рд╣рдорд╛рд░рд╛ рдлрд╝реНрдпреВрдЬрд╝рд┐рдВрдЧ рднреМрддрд┐рдХреАрдХрд░рдг рдкреНрд░рд╕рд╛рд░рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░рдЪрдирд╛ рдХреЗ рдКрдкрд░реА рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдорд┐рдЯрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╣рд╕реНрддрд▓рд┐рдЦрд┐рдд рд▓реВрдк рдХреЗ рд╕рдорд╛рди рдкреНрд░рджрд░реНрд╢рди рджреЗрддрд╛ рд╣реИ рдЬреЛ z рдХреЛ рдЬрдЧрд╣ рдореЗрдВ рд▓рд┐рдЦрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдиреЗ рдПрдХ рдЖрд▓рд╕реА AbstractArray , рддрд╛рдХрд┐ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рджрд╛рд╣рд┐рдиреЗ рд╣рд╛рде рдХреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЖрд▓рд╕реА getindex рдХреЙрд▓ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреИрд╕реНрдХреЗрдб рд╣реЛред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреЛрдИ рдмрдбрд╝реА рдЕрд╕реНрдерд╛рдпреА рд╕рд░рдгреА рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЗрдирд▓рд╛рдЗрди рдХрд░рдиреЗ рдФрд░ рдУрд╡рд░рд╣реЗрдб рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрди рд╕рднреА getindex рдХреЙрд▓реЛрдВ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рд╣реЛ рд╕рдХрддреА рд╣реИред

рд╣рд╛рдВ --- рдЖрд▓рд╕реНрдп рдХреЗ рд╕рд╛рде, рдкреНрд░рджрд░реНрд╢рди рднрд┐рдиреНрдирддрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред

рдореЗрд░реА рдЕрдЬреНрдЮрд╛рдирддрд╛ рдХреЛ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ рдХреЛ "рдлреНрдпреВрдЬ" рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рднреМрддрд┐рдХ рдкреНрд░рд╕рд╛рд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)? рдпрд╛рдиреА рдХреНрдпрд╛ рдлреНрдпреВрдЬ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ

abs.(sin.(v))

рдореЗрдВ

(abs(sin(x)) for x in v)

рдХреЗ рд╕реНрдерд╛рди рдкрд░

(abs(x) for x in (sin(y) for y in v))

рдХреНрдпрд╛ рдпрд╣ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдлрд┐рд░ рдЖрд▓рд╕реА f.(v) рдХреА рджрдХреНрд╖рддрд╛ рдХреЗ рдореБрджреНрджреЗ рджреВрд░ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рд╣реИ рдирд╛?

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

рдореЗрд░рд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЖрд▓рд╕реА f.(v) рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЕрдорд▓ рдореЗрдВ рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ ( collect(f.(v)) , рдЬреЛ рдЕрднреА рднреА рдмрд╣реБрдд рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ), рд▓реЗрдХрд┐рди рдЕрдЧрд░ f.(v) рдЕрдорд▓ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЖрд▓рд╕реА рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рдпрд╣ рддрдм рд╕реНрд╡рд╛рдж рдХреА рдмрд╛рдд рд╣реИ:

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

рдпрд╛ рдЖрдк рдкреНрд░рд╕рд╛рд░рдг рдХреЛ рдЕрдорд▓ рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдмрдбрд╝рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ ( collect(f.(v)) ) рдФрд░ рдЖрд▓рд╕реА рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ ( f.(v) )ред

рдореИрдВ рд╕реНрдкрд╖реНрдЯ (рдЙрдЪреНрдЪ-рдХреНрд░рдо?) рдлрд╝рдВрдХреНрд╢рди рд╕рдВрд░рдЪрдирд╛ (#17184, https://github.com/FugroRoames/CoordinateTransformations.jl) рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд░рд╣рд╛ рдерд╛ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░рдЪрдирд╛рдПрдВ рдмрдирд╛рдирд╛ рдФрд░ рдлрд┐рд░ (рд╕рдВрднрд╡рддрдГ рдмрд╛рдж рдореЗрдВ) рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрд╛рд░реНрдп "рдЖрд▓рд╕реА" рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рддрд░реАрдХрд╛ рд╣реИред рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ f тИШ g рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди (рдпрд╛ рдлрд╝рдВрдХреНрд╢рди-рдЬреИрд╕реА рд╡рд╕реНрддреБ) рдмрдирд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ (fтИШg)(x) = f(g(x)) ред рдПрдХ рд╕рдорд╛рди рдСрдкрд░реЗрдЯрд░ рдмрдирд╛рдирд╛ рд╕реАрдзрд╛ рд╣реЛрдЧрд╛, рдЗрд╕реЗ .тИШ (рд╢рд╛рдпрдж рдЦрд░рд╛рдм рд╕рд┐рдВрдЯреИрдХреНрд╕) рдХрд╣рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рд╕рд╛рде рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ ( (f.тИШg)(x) = f.(g.(x)) )

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

рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ (рдмреА) рдЖрдк рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИ - рдФрд░ рдмрдбрд╝реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд░, рдХрдВрдкрд╛рдЗрд▓рд░ рдпрд╛ Base рд╕реЗ _any_ рдФрд░ рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдмрд╕ рдХрдИ рдЙрдкрд▓рдмреНрдз рдСрдкрд░реЗрдЯрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЪреБрдирд╛ рдФрд░ рдордЬрд╝реЗ рдХрд░реЗрдВ!

рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ #26891 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЖрд▓рд╕реА рдкреНрд░рд╕рд╛рд░рдг рд╡рд╕реНрддреБ рд╣реИ, рддреЛ рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдлреНрдпреВрдЬреНрдб рдбреЙрдЯ рдХреЙрд▓ x .+ f.(x) рдЬреИрд╕реЗ рдЖрд▓рд╕реА рд░реИрдкрд░ рдХреЗ рд▓рд┐рдП materialize(...) рдХреЙрд▓ рдХреЗ рдмрд┐рдирд╛ рдХрдо рд╣реЛред рд╕реАрд╕реА @mbauman.

рдЙрдкрд▓рдмреНрдз (рдЧреИрд░-рдмреНрд░реЗрдХрд┐рдВрдЧ) рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ .(x .+ f.(x)) , (for x .+ f.(x)) , <strong i="10">@lazy</strong> x .+ f.(x) ред

рдХреЛрдИ рдПрдХ рдореИрдХреНрд░реЛ @lazy рдпрд╛ @lazydot рднреА рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ @views рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдХреЛрдб рдХреЗ рдмреНрд▓реЙрдХ рдореЗрдВ рд╕рднреА рдбреЙрдЯ рдХреЙрд▓ рдХреЛ рдЖрд▓рд╕реА рдмрдирд╛ рджреЗрдЧрд╛ред

#16285 рдореЗрдВ, рд╕рд┐рдВрдЯреИрдХреНрд╕ sum:(x .+ f.(x)) рдФрд░ sum..(x .+ f.(x)) рднреА рд╕реБрдЭрд╛рдП рдЧрдП рдереЗред рдЪреВрдВрдХрд┐ : рдФрд░ .. рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдВрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИред

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

рд╢рд╛рдпрдж рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЕрдХреЗрд▓реЗ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ: x .+ f.(x);

[рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рджреВрд╕рд░реЗ рд╡рд┐рдЪрд╛рд░ рдкрд░, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЙрддрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдЬрд┐рддрдирд╛ рдпрд╣ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ a = x.+ f.(x); рдЬреЛ рдХрд┐ рдЕрдорд▓ рдореЗрдВ рд▓рд╛рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛]

рдореИрдХреНрд░реЛ рдПрдХ рдЖрд╕рд╛рди рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ <strong i="5">@discard</strong> f.(x, y, z) ред

@tkoolen , рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЧреИрд░-рднреМрддрд┐рдХ рдкреНрд░рд╕рд╛рд░рдг рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддрдм рд╕реЗ рдЖрдк рдХреЗрд╡рд▓ foreach рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдЧреИрд░-рднреМрддрд┐рдХ рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд▓рд┐рдП (for ...) рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрдкрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк foreach(for g.(f.(x))) ред

foreach(for g.(f.(x)))

рдпрд╣ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╡рд╛рдХреНрдп рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ Broadcasted s рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИрдВ ... рдФрд░ рдпрджрд┐ рд╡реЗ рдереЗ, рддреЛ рдореИрдВ foreach(::Broadcasted) рдХреЛ рдареАрдХ рдПрдХ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ (рдЬреИрд╕реЗ foreach(println) ) рд╣рдо рд╢рд╛рдпрдж рдЗрд╕реЗ рдЕрддреАрдд рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдЧрд╛:

bc = (for g.(f.(x))) # or whatever
foreach(i->bc[i], CartesianIndices(axes(bc)))

@mbauman , рдореЗрд░реА рд╕реЛрдЪ рдпрд╣ рд╣реИ рдХрд┐ рдЕрднреМрддрд┐рдХ Broadcasted рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдкрд░ рдкрд╛рд╕ рдХрд░ рд╕рдХреЗрдВред

(рдЕрднреА, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХрд▓-рддрд░реНрдХ foreach рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ foreach(itr) foreach(identity, itr) рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ред)

рдЖрд╣, рдмрд┐рд▓реНрдХреБрд▓ред рдореИрдВ рдХреЛрдб рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рдмреИрдардХрд░ рдЕрдВрдзрд╛ рд╣реЛ рдЧрдпрд╛ рд╣реВрдВред Broadcasted s (рдЕрднреА рддрдХ) рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЪрд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдРрд╕рд╛ рдмрдирд╛рддреЗ рд╣реИрдВред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╢реВрдиреНрдп-рддрд░реНрдХ рд╣реИ foreach :

julia> foreach(()->println("hello"))
hello

рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ vararg рдореЗрдВ рдкрддрд┐рдд 0-arg рдорд╛рдорд▓рд╛ рд╣реИ, f рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддрд░реНрдХ рдХреЗ рдПрдХ рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдирд╛ред рдПрдХ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп bc::Broadcasted , рдореИрдВ рдЗрд╕реЗ foreach(identity, bc) ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Broadcasted рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдиреЗ рд╕реЗ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдмрд╣реБрдд рдХреБрдЫ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, identity рдХреЗ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ foreach рд╣реЛрдирд╛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реИред f.(x, y, z) рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ f рдкрд╣рд▓рд╛ рддрд░реНрдХ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ identity рд╕рдВрд╕реНрдХрд░рдг рдЬреИрд╕реЗ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЧреИрд░-рдкреБрдирд░рд╛рд╡рд░реНрддреА рдорд╛рдорд▓реЗ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЖрдХрд░реНрд╖рдХ рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реЛ? рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

foreach(args -> f(args...), <strong i="12">@lazy</strong> tuple.(x, y, z))

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢рд╛рдпрдж рдирдП рдЯреБрдкрд▓ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХреЗ рд╕рд╛рде, do рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛:

foreach(<strong i="7">@lazy</strong> tuple.(x, y, z)) do (a, b, c)
    println(a + b * c)
end

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

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

рджреВрд╕рд░реА рд╢рд░реНрдд рдпрд╣ рд╣реИ рдХрд┐ рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЪрд▓рдиреЗ рд▓рд╛рдпрдХ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред

рджреВрд╕рд░реА рд╢рд░реНрдд рдпрд╣ рд╣реИ рдХрд┐ рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЪрд▓рдиреЗ рд▓рд╛рдпрдХ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред

https://github.com/JuliaLang/julia/issues/18618? рдФрд░ рдЪреВрдВрдХрд┐ рд╣рдо рдкреНрд░рд╕рд╛рд░рдг рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрди рд░рд╣реЗ рд╣реИрдВ (https://github.com/JuliaLang/julia/pull/26435, map ), рдпрд╣ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЯреНрд░рд╛рдЗрдПрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)?

рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯ рдХреА "рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐" рдХреЗ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд╣рд▓реВ рд╣реИрдВред рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЦреБрд▓рд╛ рдПрдкреАрдЖрдИ, рдФрд░ рд╕рдорд░реНрдерд┐рдд рддрд░реНрдХред рдореЗрд░реА рд╡рд░реНрддрдорд╛рди рдпреЛрдЬрдирд╛ рд╣реИ:

  • рдЕрдиреБрдХреНрд░рдордг рдкрд░ рдкреНрд░рд╕рд╛рд░рд┐рдд рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЖрдзрд╛рд░ рдмрдирд╛рдПрдВ тАФ рдпрдерд╛рд╕реНрдерд┐рддрд┐
  • рдХреЗрд╡рд▓ getindex рдкрд░ рдкреНрд░реЙрдХреНрд╕реА рдХрд░рдХреЗ рдПрдХ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп API (рдкреНрд░рд╕рд╛рд░рдг рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ - рдпрд╣ # 26987 рд╣реИред
  • рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЗрд╡рд▓ collect рджреНрд╡рд╛рд░рд╛ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рддрд░реНрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ - 0.7 рдмрд╣рд┐рд╖реНрдХрд░рдг рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рджред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ (рдФрд░ рдЕрдиреБрдХреНрд░рдордг рдирд╣реАрдВ) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рд╛рд░рдг рдХреЛ рджреЛрдмрд╛рд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдард┐рди рдФрд░ рд╕рдВрднрд╡рддрдГ рдЕрд╕рдВрднрд╡ рддрд░реНрдХреЛрдВ рдХреЗ рдХреБрдЫ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдкреНрд░рджрд░реНрд╢рдирдХрд╛рд░реА рдврдВрдЧ рд╕реЗ рдРрд╕рд╛ рдХрд░рдирд╛ рдФрд░ рднреА рдмреБрд░рд╛ рд╣реИред рд╣рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рдХреЗ рдХреНрд░рдо рдХреЛ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рд╣рдореЗрдВ рдЖрдпрд╛рдореЛрдВ рдХреЛ рдмреИрдХрдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред рд╕рд╛рде рд╣реА рдпрд╣ _рдкреНрд░рд╕рд╛рд░рдг_рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╢реБрджреНрдз рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде, f.(1:3) .+ g.([1 2]) .+ h.() рдореИрдВ f рдХреЛ рддреАрди рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ, g рджреЛ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ h рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдЦрдбрд╝рд╛ рд╣реИ, рддреАрдиреЛрдВ рдХрд╛рд░реНрдп 6 рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рд▓реЛрдЧ A .*= rand.() рдЬреИрд╕реА рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдЕрдХреЗрд▓рд╛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрддреБрд╖реНрдЯ рд╣реВрдВред

рдЕрдм рдЬрдм рдкреНрд░рд╕рд╛рд░рд┐рдд рд╡рд╕реНрддреБрдПрдВ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЧреИрд░-рднреМрддрд┐рдХ рдбреЙрдЯ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдмрд╛рдЗрдХрд╢реЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдмрд╕ рдЪреАрдЬреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢рд╛рдпрдж рдХреБрдЫ рдЧреИрд░-рдмреНрд░реЗрдХрд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдПрдХ рдЧреИрд░-рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╕реНрдЯреНрд░реЙ рдкреЛрд▓ (рдЬреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ f..(x) ):

  • :рдЕрдВрдЧреВрдард╛: for f.(x) (рд╡рд░реНрддрдорд╛рди x for y in z рдЬрдирд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рддрд░рд╣)
  • :рдЯрд╛рдбрд╛: .(f.(x))
  • :heart: <strong i="13">@lazy</strong> f.(x) ( Lazy.jl рд╕реЗ рдЯрдХрд░рд╛рддрд╛ рд╣реИ) рдпрд╛ <strong i="16">@lazy</strong> f(x) ( @. рддрд░рд╣ рдЕрднрд┐рдирдп)
  • ЁЯШХ рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ

for f.(x) рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓реВрдк рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЯрдХрд░рд╛рдПрдЧрд╛?

@cossio , рдирд╣реАрдВ, рдЗрд╕реЗ рдЬреЗрдирд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рддрд░рд╣ рд╣реА рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ред рд╡реИрд╕реЗ рд╣реА рдЬреИрд╕реЗ рдЖрдк рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ sum(x^2 for x in x) , рддреБрдо рдХрд░ рд╕рдХрддреЗ рд╣реЛ sum(for x.^2) ред

рдФрд░ рдПрдХ рдЬрдирд░реЗрдЯрд░ рдХреА рддрд░рд╣, рдЖрдк рдЕрдиреНрдп рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ (рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░) рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд╕рдВрдмрджреНрдз рд╣реЛрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ x = (y.^2 for y in 1:3) , рдФрд░ рдЗрд╕реА рддрд░рд╣ рдЖрдк x = (for y.^2) ред

sum(for x.^2) рдФрд░ x = (for y.^2) рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рдЯреВрдЯ-рдлреВрдЯ рдирд╣реАрдВ рд╣реЛрдЧреАред

рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ (for f.(x)) рдХрд╛ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рд╣реИ for : рдореЗрдВ f(x) for x in X , рдЙрд╕ рдХреАрд╡рд░реНрдб рдЪрд░ рдЗрдирдкреБрдЯ рдореЗрдВ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдпрд╣ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддрд╛рд░реНрдХрд┐рдХ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдХреБрдЫ рднреА рд╣реЛ, рддреЛ рдпрд╣ (f.(x) for) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдЬреАрдм рд╣реИред

рдХрдо рд╕реЗ рдХрдо @lazy рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛, рдЗрд╕ рдХрдореА рдХреЗ рд╕рд╛рде рдХрд┐ рдпрд╣ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реИред рд╣рдо @view / @views рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╕рд╛рд░рдг рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рджреГрд╢реНрдп рд╣реЛрдЧрд╛ (рдФрд░ рдЖрдк рдЖрд▓рд╕реА рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд╕рд╛рде рд╣реА рд╕рд░рдгреА рджреГрд╢реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд░рдЦрддреЗ рд╣реИрдВ рдпрджрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдЕрдиреБрдХреНрд░рдордг рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ)ред

рдореБрдЭреЗ sum:(f.(x)) рдпрд╛ sum..(f.(x)) рдХрд╛ рд╡рд┐рдЪрд╛рд░ рднреА рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди ..(f.(x)) рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ рдФрд░ :(f.(x)) рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдирд╣реАрдВ рд╣реИ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЖрд▓рд╕реА Broadcasted рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдорд╛рдзрд╛рдиред

for f.(x) рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдореИрдВ #2675 рдкрд░ рд╡рд╛рдкрд╕ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛: рдпрджрд┐ рдЖрдк for X рдмрдЬрд╛рдп for x in X рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ X рдХреЛ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ .

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ @lazy рдореЗрдВ рдПрдХ рдмреЛрдзрдЧрдореНрдпрддрд╛ рд▓рд╛рдн рд╣реИред рдПрдХ рд╡рд┐рдХрд▓реНрдк рдЬреЛ рдЗрд╕рдХреА рд╡рд╛рдЪрд╛рд▓рддрд╛ рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╣ рд╣реЛрдЧрд╛ @lazy рдХреЛ @. рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рдирд╛, рдЬрд┐рд╕рдореЗрдВ рдбреЙрдЯ рдХреЙрд▓ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВред рдпрд╛рдиреА рдЖрдк рд╕рд┐рд░реНрдл sum(<strong i="13">@lazy</strong> f(x^2)) рд╡рдЧреИрд░рд╣ рд▓рд┐рдЦреЗрдВрдЧреЗ рдФрд░ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП "рдбреЙрдЯреНрд╕ рдРрдб" рдХрд░реЗрдЧрд╛ред

sum:(f.(x)) рдФрд░ sum..(f.(x)) рдкрд░рд┐рд╡рд░реНрддрди рддреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рд╣реЛрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдЬрдм рддрдХ рд╣рдо рдЬреВрд▓рд┐рдпрд╛ 2.0 рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ, рд╡реЗ рдЧреИрд░-рд╢реБрд░реБрдЖрдд рд╣реИрдВред

рд╡реИрд╕реЗ, рдХреНрдпрд╛ broadcasted рдЕрдм рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд╕рдВрдж рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП broadcast рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП)? рдХреНрдпрд╛ рдЗрд╕реЗ Broadcast рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рд▓реЗрдХрд┐рди Base ( Iterators рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП) рдирд╣реАрдВ?

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ f.:(x) рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдкрд▓рдмреНрдз рд╣реИ, рд╣реИ рдирд╛?
.: 3 рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдкреИрдЯрд░реНрди рд╣реИред
рдмреГрд╣рджрд╛рдиреНрддреНрд░ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рд╛рдХреГрддрд┐рдХ "рдЗрд╕рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬрд╝ рдПрдХ рд╕реВрдЪреА рдХрд╛ рдкреНрд░рднрд╛рд╡ рд╣реИ,

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ f:.(x) рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдЗрд╕реЗ рдкрдврд╝рдирд╛ рдХрдард┐рди рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрд▓рди рдЦреБрд▓реЗ рдмреНрд░реИрдХреЗрдЯ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ Base.:(=)(a::Foo, b::Foo) = a.bar == b.bar рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд░рдПрдЪрдПрд╕ рдореВрд▓реНрдп рдореЗрдВ рд╣реИ,

@oscardssmith , рдпрджрд┐ @lazy рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдореЗрдВ рдбреЙрдЯреНрд╕ рдЬреЛрдбрд╝рддрд╛ рд╣реИ (рдЬреИрд╕реЗ @. ) рддреЛ рдЖрдк рдЗрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╢рд╛рдмреНрджрд┐рдХ рдбреЙрдЯ рдХреЙрд▓ рдЖрд▓рд╕реА рди рд╣реЛрдВред рдпрд╛рдиреА рдЕрдЧрд░ рдЖрдкрдиреЗ <strong i="8">@lazy</strong> f(g(h.(x))) рддреЛ f рдФрд░ g рдХреЙрд▓ рдлреНрдпреВрдЬ рдФрд░ рдЖрд▓рд╕реА рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди h.(x) рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдбреЙрдЯ рдХреЙрд▓ рд╣реЛрдЧрд╛ред

рдФрд░ @. рдЖрдк рдЙрди рдХреЙрд▓реЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП sum(<strong i="15">@lazy</strong> sqrt($sort(x))) рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ sort рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред

@lazy рдмрд╛рд░реЗ рдореЗрдВ рджреВрд╕рд░реА рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрдм рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ 1.1 рдореЗрдВ рдмреЗрд╕ рдореЗрдВ рдлреЛрд▓реНрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред (рдХреЗрд╡рд▓ рдЭреБрдВрдЭрд▓рд╛рд╣рдЯ Lazy.jl рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рд╣реИред рдкреИрдХреЗрдЬ рдХреЛ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛?)

рдкреИрдХреЗрдЬ рдХреЛ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛?

рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП IIRC рдХреЗ рд▓рд┐рдП Experimental / Future рдореЙрдбреНрдпреВрд▓ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдРрд╕реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджрд░реНрд╢ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреА рддрд░рд╣ рд▓рдЧрддреА рд╣реИ? рд╢реНрд░реЗрд╖реНрда!

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

рд╡реИрд╕реЗ, рдХреНрдпрд╛ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ materialize рд╕рд┐рд░реНрдл collect рддрд░реАрдХреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП?

collect рдпрд╣рд╛рдВ рдЧрд▓рдд рдХрд╛рд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ Array рд▓реМрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрдмрдХрд┐ broadcast рдХреЛ рдПрдХ рд╕реНрдХреЗрд▓рд░ ( 2 .+ 1 ), рдЯрдкрд▓ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ( (1, 2) .+ (3, 4) ) рдпрд╛ рдПрдХ Array , рд╕рд╛рде рд╣реА рдЕрдиреНрдп рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рдеред

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

@lazy рдореИрдХреНрд░реЛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ @dawbarton рдХреЗ _lazy рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ (рджреЗрдЦреЗрдВ https://discourse.julialang.org/t/19641/20), рдореИрдВрдиреЗ рдЕрднреА рджреЗрдЦрд╛ рдХрд┐ Broadcasted рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдбреЙрдЯ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореИрдХреНрд░реЛ рдХреЗ рдмрд┐рдирд╛ рднреА:

"""
    air.(broadcasting_expression)

Broadcast without materialization.
"""
air(::Any) =
    error("Function `air` must be called with a dot as in: ",
          "`air.(YOUR .+ BROADCASTING .* EXPRESSION ./ HERE)`")

struct Aired{T}
    value::T
end
Broadcast.broadcasted(::typeof(air), x) = Aired(x)
Base.materialize(x::Aired) = x.value

рдлрд┐рд░:

julia> air.(sin.(1:3))
Base.Broadcast.Broadcasted(sin, (1:3,))

рдРрд╕рд╛ рдХрд╣рдХрд░, рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ ...

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

рдпрд╣ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдФрд░ рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд╕рд╛рде рдЦрд┐рд▓рд╡рд╛рдбрд╝ рдХрд░рдиреЗ рдХреЗ рдпреЗ рд╡рд┐рдЪрд╛рд░ рдЪрддреБрд░ рд╣реИрдВред

рдЗрдиреНрд╣реЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдкреНрд░рд╡рдЪрди рд╕реВрддреНрд░ рдореЗрдВ рд╣реИ) рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡реЗ рдЙрддрдиреЗ рддреЗрдЬрд╝ рдирд╣реАрдВ рд╣реИрдВ рдЬрд┐рддрдиреЗ рд╡реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

julia> using BenchmarkTools, LazyArrays

julia> a = rand(10_000); b = rand(10_000); c = b';

julia> <strong i="8">@btime</strong> sum($a .+ $b);
  4.263 ╬╝s (2 allocations: 78.20 KiB)

julia> <strong i="9">@btime</strong> sum(air.($a .+ $b)); # or <strong i="10">@lazy</strong> $a .+ $b
  8.733 ╬╝s (2 allocations: 48 bytes)

julia> <strong i="11">@btime</strong> sum(BroadcastArray(+, $a, $b)); 
  1.471 ╬╝s (3 allocations: 80 bytes)

air -рд╕реНрдЯрд╛рдЗрд▓ рдЖрд▓рд╕реА рдкреНрд░рд╕рд╛рд░рдгреЛрдВ рдореЗрдВ рдХрдЯреМрддреА рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореБрдЭреЗ рдЪрд╛рд░ (рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: 5) рд╕рдорд╕реНрдпрд╛рдПрдВ/рдкреНрд░рд╢реНрди рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ:

  1. рд╣рдо рдХрдм рдЪреЗрдХ рдХрд░рддреЗ рд╣реИрдВ DimensionMismatch ? рд╡рд░реНрддрдорд╛рди air рдкрд╣реБрдБрдЪ рдкрд░ рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдХреГрддрд┐рдпреЛрдВ рдХреА рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рд╣реЛрдЧрд╛ред
  2. рдХреНрдпрд╛ рд╣рдо рдЫреЛрдЯреА Broadcasted рд╡рд╕реНрддреБ рдХреЗ рдЖрд╡рдВрдЯрди рд╕реЗ рднреА рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ? рдЗрд╕рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝реА рдорд╛рд▓рд┐рд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Broadcasted рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдкрдереЛрдВ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХреЗ? (рд▓рдХреНрд╖реНрдп: new рдмрдпрд╛рди рдЬреЛ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдкрде рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдПрдХ рдлреЗрдВрдХ рджреНрд╡рд╛рд░рд╛ рдЙрд▓рдЯрд╛-рд╡рд░реНрдЪрд╕реНрд╡ рд╡рд╛рд▓рд╛) рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рддреНрд░реБрдЯрд┐ рдкрде рдореЗрдВ рд╕реНрдердЧрд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ)
  3. рд╕реНрдерд┐рд░рддрд╛ рдЯрд╛рдЗрдк рдХрд░реЗрдВ (рдЦрд╛рд▓реА рдХрдЯреМрддреА рдХрд╛ рдореБрджреНрджрд╛)ред рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдЯреМрддреА рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдФрд░ eltype рдЙрдкрд▓рдмреНрдз рди рд╣реЛред
  4. рд╕рд┐рдордб.
  5. рдХреБрдЫ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рдХрдЯреМрддреА, рдЬреИрд╕реЗ sum(air.(a.*b), dims=1)

рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, air рд╕рдВрд╕реНрдХрд░рдг рдХреБрдЫ рдХрд╕реНрдЯрдо рдХрдЯреМрддреА рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИред рд╣рдо рд╢рд╛рдпрдж Broadcasted -рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рджреВрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

julia> air(::Any) =
           error("Function `air` must be called with a dot as in: ",
                 "`air.(YOUR .+ BROADCASTING .* EXPRESSION ./ HERE)`");
julia> struct Aired{T}
           value::T
       end
julia> Broadcast.broadcasted(::typeof(air), x) = Aired(x)
julia> Base.Broadcast.materialize(x::Aired)=x.value

julia> function ndot(a,b)
       length(a)==length(b)>0 || error()
       <strong i="23">@inbounds</strong> s=a[1]*b[1]
       <strong i="24">@simd</strong> for i=2:length(a)
       <strong i="25">@inbounds</strong> s += a[i]*b[i]
       end
       s
       end;
julia> Base.<strong i="26">@propagate_inbounds</strong> function airsum(x)
       s = x[1]
       <strong i="27">@simd</strong> for i=2:length(x)
       <strong i="28">@inbounds</strong> s += x[i]
       end
       s
       end

julia> airdot(a,b) = airsum(air.(a.*b));
julia> airdot_ib(a,b) = <strong i="29">@inbounds</strong> airsum(air.(a.*b));
julia> airdotsum(a,b)=<strong i="30">@inbounds</strong> sum(air.(a.*b))
julia> a=rand(10_000); b=copy(a);
julia> begin
       <strong i="31">@btime</strong> ndot($a,$b);
       <strong i="32">@btime</strong> airdot($a,$b);
       <strong i="33">@btime</strong> airdot_ib($a,$b);
       <strong i="34">@btime</strong> airdotsum($a,$b);
       end;
  3.784 ╬╝s (0 allocations: 0 bytes)
  3.798 ╬╝s (2 allocations: 48 bytes)
  3.786 ╬╝s (0 allocations: 0 bytes)
  18.308 ╬╝s (2 allocations: 48 bytes)

airsum рдХреА рддрд░реНрдЬ рдкрд░ рдореЗрд░рд╛ рдкреНрд░рдпрд╛рд╕ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ sum(air.(a .* b')) рднреА рдЗрд▓рд╛рдЬ рдХрд░рддрд╛ рд╣реИ:

julia> function bsum(bc)
           T = Broadcast.combine_eltypes(bc.f, bc.args)
           tot = zero(T)
           <strong i="8">@simd</strong> for I in eachindex(bc)
               <strong i="9">@inbounds</strong> tot += bc[I]
           end
           tot
       end;

рдХреНрдпрд╛ sum(air.(a .* b'), dims=1) рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ? рд╢рд╛рдпрдж рдпрд╣ рдЖрдкрдХреА рд╕реВрдЪреА рдореЗрдВ рдирдВрдмрд░ 5 рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

(рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЫреЛрдЯрд╛)

рд╢рд╛рдпрдж рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ air.(...) рд▓рд┐рдП рдХреБрдЫ <: AbstractArray рдореЗрдВ рдЕрдорд▓ рдореЗрдВ рд▓рд╛рдирд╛ рд╣реИред рдФрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ BroadcastArray рдХрд╛ рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЗрд╕ рдкреАрдЖрд░ рдореЗрдВ рдЖрдЬрдорд╛рдпрд╛ рдерд╛: https://github.com/JuliaArrays/LazyArrays.jl/pull/21

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

рдореИрдВрдиреЗ @: рд╕рд╛рде рдПрдХ рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдЪ #31088 рдмрдирд╛рдпрд╛, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рдореМрдЬреВрджрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреВрдЯрддрд╛ рдирд╣реАрдВ рд╣реИред #31020 рдХреЗ рд╕рд╛рде, рд╣рдо рдбреЙрдЯ рдЙрддреНрдкрд╛рдж рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП sum(@: x .* y) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд▓рдЧрднрдЧ LinearAlgebra.dot рдЬрд┐рддрдирд╛ рддреЗрдЬрд╝ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд╣реИред

рдЗрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ @: ред рдпрд╣ рдереЛрдбрд╝рд╛ рд╕рд╛ @. рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдбреЙрдЯ-рдХреЙрд▓ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ: рдпрд╣ рдХреЗрд╡рд▓ рдореМрдЬреВрджрд╛ рдбреЙрдЯ-рдХреЙрд▓ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ : рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рдкреНрд░рд╕рд╛рд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдКрдкрд░ @lazy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рдЕрд░реНрде рдХреЛ @views рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ Broadcasted рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрд╕рдХреЗ рдЗрдирдкреБрдЯ рдкрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рджреГрд╢реНрдп рд╣реИ (рдпрд╛рдиреА рдпрд╣ рдкреНрд░рддрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрддрд╛ рд╣реИ рдФрд░ рдЗрдирдкреБрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрдЧрд╛)ред

рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдФрд░ : рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рдкреНрд░рд╕рд╛рд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

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

рдКрдкрд░ @lazy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИред

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

рд╕рд╛рде рд╣реА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @lazy рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЖрд▓рд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВред рдпрд╣ рдкрд╣рд▓реЗ рд╣реА рдиреЛрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ рдХрд┐ рдирд╛рдо Lazy.jl рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдВрдХрди рд╣реЛрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

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

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

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

рдХреБрдЫ рдЙрдкрд╛рдп: @, , @gen , @.. ред

FWIW, рдЙрд╕ рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рддреАрди рдореИрдХреНрд░реЛ @: , @. , @views рдПрдХ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рдЦреЗрд▓рддреЗ рд╣реИрдВ: sum(@: @. <strong i="8">@views</strong> a[I] * b[I]) рдЫрд╣ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдореЗрдВ рднреА рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ @views рдЬреЛрдбрд╝рдирд╛ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛

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

рдЗрд╕ рд╕рдВрдХреЗрддрди рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдкреНрд░реЗрд░рдгрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ "рдкреНрд░рд╕рд╛рд░рдг рдпреЛрдЧреНрдп рдХреЙрд▓ рдЕрдзрд┐рднрд╛рд░" рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ: https://discourse.julialang.org/t/best-practice-for-broadcastable-callables/21000

рдЯреНрд░рд╛рдЗрдПрдЬ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ for f.(args...) https://github.com/JuliaLang/julia/pull/31088#issuecomment -473030504 #31553 рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдПрдХ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди ArrayReducer рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдХрдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдСрдкрд░реЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреБрдХреНрдд рдЖрдХрд╛рд░ рдерд╛ред рджреЗрдЦреЗрдВ https://discourse.julialang.org/t/is-there-something-like-broadcast-mapreduce/6076/15 (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЪрд╛рд▓рд╛рдХ рд╣реИ, рдХреНрдпрд╛ рдЖрдк @meggart рд╣реИрдВ?) рдлрд┐рд░ рдЖрдк рдЙрд╕ рдкрд░ рд╕рд╛рдзрд╛рд░рдг broadcast! рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИред

рд╣рдореЗрдВ "рдмрд╕" рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рддрдп рдХрд░рдирд╛ рд╣реИ (рдЬреЛ рд╢рд╛рдпрдж рд╣рдореЗрд╢рд╛ рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ ...) рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯреНрд░рд╛рдЗрдПрдЬ рдореЗрдВ рдХреЛрдИ рдЖрдо рд╕рд╣рдорддрд┐ рдирд╣реАрдВ рд╣реИ https://github.com/JuliaLang/julia/pull/31553#issuecomment -479758476ред рдореИрдВрдиреЗ рдкреНрд░реВрдл-рдСрдл-рдХреЙрдиреНрд╕реЗрдкреНрдЯреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдЪрд░реНрдЪрд╛ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдореИрдВ "рдмреБрд▓реЗрдЯ рд╕реЗ рдмрд╛рд╣рд░" рдПрдЯреАрдПрдо рд╣реВрдВред

рдкреНрд░рд╕рд╛рд░рдг рдореЗрдВ рдХрдореА рдХреЗ _рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди_ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА #31020 рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ mapreduce (рдФрд░ mapfoldl ) рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рджрд┐рд╢рд╛ рд╣реИ (рдмрдЬрд╛рдп "рд╣реИрдХрд┐рдВрдЧ" broadcast! рдЬреИрд╕рд╛ рдХрд┐ ArrayReducer , IIUC рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред

рдореИрдВ рдЗрд╕реЗ рджреВрд╕рд░рд╛ рдХрд░реВрдВрдЧрд╛ред ArrayReducer рд╣реИрдХ рдмрдбрд╝реЗ 1.0 рдкреНрд░рд╕рд╛рд░рдг рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдиреЗ рдореЗрд░реА рддрддреНрдХрд╛рд▓ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рджрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рдЬреЛрдбрд╝реЗрдЧрд╛, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ # 31020 рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИред

рд╡реИрд╕реЗ рднреА рдЖрд▓рд╕реА рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЦреЛрдЬрдиреЗ рдореЗрдВ рд╢реБрднрдХрд╛рдордирд╛рдПрдБ, рдореИрдВ рдЗрд╕реЗ рдЬреВрд▓рд┐рдпрд╛ рдмреЗрд╕ рдореЗрдВ рднреА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдБред

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

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

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

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

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

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

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

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