Julia: ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ์—๋Š” ํ•˜๋‚˜์˜ ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๋ฐ˜๋ณต์ž์™€ ์ƒ์„ฑ๊ธฐ๋ฅผ ํ†ตํ•œ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ).

์— ๋งŒ๋“  2016๋…„ 09์›” 21์ผ  ยท  69์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: JuliaLang/julia

broadcast ์ด ๋ฐ˜๋ณต์ž์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋†€๋ž์Šต๋‹ˆ๋‹ค.

dict = Dict(:a => 1, :b =>2)
<strong i="7">@show</strong> string.(keys(dict)) # => Expected ["a", "b"]
"Symbol[:a,:b]"

์ด๊ฒƒ์€ Broadcast.containertype ๋ฐ˜ํ™˜ํ•˜๋Š” Any https://github.com/JuliaLang/julia/blob/413ed79ec54f3a754ac8bc57c1d29835d17bd274/base/broadcast.jl#L31
https://github.com/JuliaLang/julia/blob/413ed79ec54f3a754ac8bc57c1d29835d17bd274/base/broadcast.jl#L265 ์—์„œ ๋Œ€์ฒด๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

containertype ๋ฅผ ํ•ด๋‹น iterator์— ๋Œ€ํ•ด Array ๋กœ ์ •์˜ํ•˜๋ฉด size ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. broadcast ๋Š” iterator ์ธํ„ฐํŽ˜์ด์Šค iteratorsize(IterType) ๋Œ€ํ•ด ํ™•์ธํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

map ๋Š” broadcast(f, Any, A) = f(A) ์˜ ํ˜„์žฌ ์ •์˜๋ณด๋‹ค ๋” ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ๋Š” ๋Œ€์ฒด map(f, A) = collect(Generator(f,A)) ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

broadcast

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๊ฒƒ์€ ์˜๋„์ ์ž…๋‹ˆ๋‹ค. broadcast ๋Š” ๋ชจ์–‘์ด ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ์šฉ์ด๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐœ์ฒด๋ฅผ ์Šค์นผ๋ผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. map ๋Š” ๋ชจ์–‘์ด ์—†๋Š” ์ปจํ…Œ์ด๋„ˆ์šฉ์ด๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋ฐ˜๋ณต์ž๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด broadcast ๋Š” ๋ฌธ์ž์—ด์„ "์Šค์นผ๋ผ"๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๋ฐ˜๋ฉด map ๋Š” ๋ฌธ์ž๋ฅผ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  69 ๋Œ“๊ธ€

์ด๊ฒƒ์€ ์˜๋„์ ์ž…๋‹ˆ๋‹ค. broadcast ๋Š” ๋ชจ์–‘์ด ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ์šฉ์ด๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐœ์ฒด๋ฅผ ์Šค์นผ๋ผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. map ๋Š” ๋ชจ์–‘์ด ์—†๋Š” ์ปจํ…Œ์ด๋„ˆ์šฉ์ด๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋ฐ˜๋ณต์ž๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด broadcast ๋Š” ๋ฌธ์ž์—ด์„ "์Šค์นผ๋ผ"๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๋ฐ˜๋ฉด map ๋Š” ๋ฌธ์ž๋ฅผ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๋ฌธ์ œ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ƒˆ๋กœ์šด ์  ๊ตฌ๋ฌธ์ด ๋„ˆ๋ฌด ํŽธ๋ฆฌํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ณผ๊ฑฐ์—๋Š” map ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ”๋žŒ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์  ๊ตฌ๋ฌธ์€ ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ @stevengj ๊ฐ€ ์ด์ „์— ์ง€์ ํ–ˆ๋“ฏ์ด map ์™€ broadcast ์‚ฌ์ด์—๋Š” ์ฐจ์ด๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋‘˜ ๋‹ค ๊ฐ–๋Š” ์˜๋ฏธ๊ฐ€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@stevengj ๊ทธ๋Ÿฌ๋‚˜ Iterator๋Š” ๋ชจ์–‘(ํŠนํžˆ ์ƒ์„ฑ๊ธฐ)์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. http://docs.julialang.org/en/release-0.5/manual/interfaces/#interfaces

๋‚˜๋Š” ๋ฐ˜๋ณต์ž๊ฐ€ ์ด ์–ด์ƒ‰ํ•œ ์˜์—ญ์— ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋กœ ํ•˜๊ณ  ์‹ถ์€ ๋Œ€๋ถ€๋ถ„์˜ ์ผ์ด๋ฉฐ, ๋ฐ˜๋ณต์ž๋กœ๋„ ํ•˜๊ณ  ์‹ถ์€ ์ผ์ด๋ฉฐ, ์•„๋งˆ๋„ ์ˆœ์ „ํžˆ . ๊ตฌ๋ฌธ์ด ๋„ˆ๋ฌด ํŽธ๋ฆฌํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์ด ์–ป๋Š” ์˜ค๋ฅ˜๋Š” ๋งค์šฐ ๋ถˆํˆฌ๋ช…ํ•ฉ๋‹ˆ๋‹ค).

@pabloferz map ์™€ broadcast ์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ ์Šค์นผ๋ผ ์ฒ˜๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ด์ œ ์Šค์นผ๋ผ์˜ ์ •์˜๋Š” ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ length(x) > 1 ๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์Šค์นผ๋ผ๋กœ ๊ฐ„์ฃผํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ž์ฒด ๋Œ€์‹  ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ธ์ˆ˜๋ฅผ ํ‘œ์‹œํ•˜๋ฉด ๋ชจํ˜ธ์„ฑ์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š”?

broadcast (์ผ๋ฐ˜์ ์œผ๋กœ ์ €๋„ ๋ฏฟ์Šต๋‹ˆ๋‹ค)์˜ ๊ฒฝ์šฐ ๋ชจ์–‘์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์€ size ( length ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ)๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ณ  ์ธ๋ฑ์‹ฑํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํŠœํ”Œ์„ ์ œ์™ธํ•˜๊ณ  size ๊ฐ€ ์—†๋Š” ๋‹ค๋ฅธ ๊ฒƒ์€ ์Šค์นผ๋ผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ตฌํ˜„์ด ์ฃผ์–ด์ง€๋ฉด ๋จผ์ € getindex ํ•˜๊ฑฐ๋‚˜ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๋ ค๋Š” ๊ฐœ์ฒด์— ๋Œ€ํ•ด ์ •์˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต์ž์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋„ ์ด๊ฒƒ์— ๋ถ€๋”ช์ณค๋‹ค. #16769์—์„œ ๊ณ ์ • ๊ฐ’ ๋Œ€์‹ ์— ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ‰๊ฐ€ํ•˜์—ฌ ๋ฐฐ์—ด์„ fill! ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ  ์žˆ๋Š”๋ฐ ์  ๊ตฌ๋ฌธ์ด ์ด๋ฏธ ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ a = zeros(2, 3); a .= [rand() for i=1:2, j=1:3] ์ž‘๋™ํ•˜๋ฉด ๋” ์ €๋ ดํ•œ a .= (rand() for i=1:2, j=1:3) ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ƒ์„ฑ๊ธฐ๋Š” HasShape() ์ด์ง€๋งŒ ์‹ค์ œ๋กœ ์ธ๋ฑ์‹ฑ ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ/์  ๊ตฌ๋ฌธ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋งค์šฐ ์ต์ˆ™ํ•˜์ง€๋งŒ ์ธ๋ฑ์‹ฑ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํŠน์„ฑ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์—ฌ๊ธฐ์— ๋„์›€์ด ๋ ๊นŒ์š”? ์ด๋ฏธ PR(#22489)์ด ์žˆ์Šต๋‹ˆ๋‹ค...

@rfourquet , ๋‹น์‹ ์€ a = zeros(2, 3); a .= rand.() ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

์˜ˆ, ํ•˜์ง€๋งŒ ๋” ์ •ํ™•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. a .= (f(i, j) for i=1:2, j=1:3) ์™€ ๊ฐ™์ด ์ธ๋ฑ์Šค๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

HasShape ๋ฐ˜๋ณต์ž์˜ ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ… ์ฐจ์›์˜ ๋‹จ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ๋‹น์—ฐํ•œ ์ผ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

@nalimilan , ์–ธ๋œป๋ณด๊ธฐ์— ํ•ฉ๋ฆฌ์ ์ด๊ณ  ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊นจ์งˆ ๊ฒƒ์ด๋ฏ€๋กœ 1.0๊นŒ์ง€ ์™„๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์˜ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๋Š” HasShape ๋ฐ˜๋ณต์ž๊ฐ€ ๋ฐ˜๋“œ์‹œ getindex ์ง€์›ํ•˜์ง€ ์•Š๊ณ  ๊ตฌํ˜„ํ•˜๊ธฐ ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ๊ฐ€๋Šฅ์„ฑ์€ ์ผ์‹œ์ ์œผ๋กœ(1.0์˜ ๊ฒฝ์šฐ) ๋ฐฉ๊ธˆ ๋ฐฐ์—ด์— ๋ณต์‚ฌํ•œ ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ตœ์ ํ™” ํฌ์ŠคํŠธ 1.0์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•œ ๊ฐ€์ง€ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋Š” HasShape ๋ฐ˜๋ณต์ž๊ฐ€ ๋ฐ˜๋“œ์‹œ getindex๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด #22489์— PR์ด ์žˆ์–ด ์ด๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒฝ์šฐ ๋ฐ˜๋ณต์ž์— ๋Œ€ํ•œ ์ธ๋ฑ์‹ฑ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ตœ์†Œํ•œ 1.x์—์„œ ๋™์ž‘์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก 1.0์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@nalimilan์ด ๋ฌธ์ œ ๋ฅผ ์ œ๊ธฐํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ €๋„ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ํ‘œํ˜„์‹์˜ ์˜ค๋ฅธ์ชฝ์— HasShape ์ƒ์„ฑ๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด 1.0์— ๋Œ€ํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์ƒ์„ฑ๊ธฐ๋ฅผ ์Šค์นผ๋ผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋Œ€์‹  ์ง€๊ธˆ ์ด๊ฒƒ์„ ์˜ค๋ฅ˜๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? 1.x์—์„œ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

:+1: Triage๋Š” ์ด๊ฒƒ์„ ์˜ค๋ฅ˜๋กœ ๋งŒ๋“ค๊ฑฐ๋‚˜(์•ˆ์ „ํ•œ ์„ ํƒ) collect ๋ฅผ ํ˜ธ์ถœํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค(์‰ฌ์šด ๊ฒฝ์šฐ).

map ๋Š” ๋ชจ๋“  ์ธ์ˆ˜๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ทจ๊ธ‰ํ•˜๊ณ  ๋ชจ๋“  ์ธ์ˆ˜์— ๋Œ€ํ•ด ๋ฐ˜๋ณต์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ด์ƒ์ ์ธ ์„ธ๊ณ„์—์„œ broadcast ๋Š” ๋น„์Šทํ•  ๊ฒƒ์ด๋ฉฐ ๋ชจ๋“  ์ธ์ˆ˜๊ฐ€ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ์–‘์„ ๊ฐ€์ง€๊ณ  ์ฒ˜๋ฆฌํ•˜๊ณ  size ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐ’์„ fill ๋กœ ๋ž˜ํ•‘ํ•˜์—ฌ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ์—์„œ ์Šค์นผ๋ผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ 0์ฐจ์› ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

julia> fill("a")
0-dimensional Array{String,0}:
"a"

julia> fill([2])
0-dimensional Array{Array{Int64,1},0}:
[2]

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์Šค์นผ๋ผ๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ œ์•ˆํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋ณ„๋กœ ์‹ค์šฉ์ ์ด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

iterable์„ ์ง€์›ํ•˜๊ฑฐ๋‚˜ ์ง€์›ํ•  ๋•Œ๊นŒ์ง€ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๋ฉด BroadcastStyle ์—์„œ iterator๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋•Œ๋ฌธ์—, ๋ถˆ๊ฐ€๋Šฅ์ด Base.iteratorsize ๋ฐ˜ํ™˜ HasLength ๋„ ๊ฐ™์€ ์Šค์นผ๋ผ์— ๋Œ€ํ•œ Symbol . Base.isiterable ํŠธ๋ ˆ์ž‡(๋‹ค๋ฅธ ์šฉ๋„๋กœ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Œ)์„ ๋„์ž…ํ•˜๊ฑฐ๋‚˜ Base.iteratorsize ๋ฅผ NotIterable ๊ธฐ๋ณธ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( HasLength ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์œผ๋กœ๋„ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค

(ํ–ฅํ›„ ๋…ผ์˜๋ฅผ ์œ„ํ•œ ๊นŒ๋‹ค๋กœ์šด ์‚ฌ๋ก€: UniformScaling .)

@timholy broadcast ์˜ ์žฌ์„ค๊ณ„๋ฅผ ์™„๋ฃŒํ•œ ํ›„ ์ œ์•ˆ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@JeffBezanson , broadcast ์š”์ ์€ ์ปจํ…Œ์ด๋„ˆ์™€ ์ผ์น˜ํ•˜๋„๋ก ์Šค์นผ๋ผ๋ฅผ "๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ"ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: ["bug", "cow", "house"] .* "s" ----> ["bugs", "cows", "houses"] . ์ด๊ฒƒ์€ map ์˜ ๋™์ž‘๊ณผ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด broadcast ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐœ์ฒด๋ฅผ ์Šค์นผ๋ผ๋กœ ์ทจ๊ธ‰ํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์™€ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ธ์‹ํ•  ์ˆ˜ ์—†๋Š” ์œ ํ˜•์— ๋Œ€ํ•ด ์˜ค๋ฅ˜๋ฅผ ๋˜์ง€๋ฉด ํ›จ์”ฌ ๋œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ ์ ˆํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜์—ฌ ํŠน์ • ์œ ํ˜•์„ broadcast ์— ๋Œ€ํ•œ ์ปจํ…Œ์ด๋„ˆ๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์Šค์นผ๋ผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ณ„์†๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ จ์ด ์—†๋Š” PR(https://github.com/JuliaLang/julia/pull/25339)์—์„œ @Keno ๋Š” applicable(start, (x,)) ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ x ๊ฐ€ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋„ ๊ฐ™์€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋ฐ˜๋ณต์ž์— ๋Œ€ํ•œ ๋ณด๋‹ค ๋ช…ํ™•ํ•œ ์ •์˜( Base.iteratorsize ๋˜๋Š” ํŠน์„ฑ ๊ธฐ๋ฐ˜)๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ๋” ๋ช…ํ™•ํ•˜์ง€๋งŒ start ๊ฒƒ๋„ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ applicable(start, (x,)) ์ธ ๋ช…์‹œ์  ํŠน์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜๊ณผ ๋‹จ์ ์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด #25356์„ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.

@stevengj ์˜ ์˜ˆ์ œ ["bug", "cow", "house"] .* "s" ----> ["bugs", "cows", "houses"] ์—์„œ ๋ฌธ์ž์—ด์€ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์Šค์นผ๋ผ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋ณต ๊ฐ€๋Šฅ์„ฑ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ํŠน์„ฑ์„ ์ •์˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ๋ฐ˜๋ณต์ž์— ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ์— ๋Œ€ํ•œ ์˜ตํŠธ์ธ์„ ๊ณ„์† ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹คํ–‰ํžˆ keys(dict) ์ด์ œ ๋ฐ˜ํ™˜ AbstractSet , ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฉ์†ก์˜ ํŠน์„ฑ์„ ์ถ”๊ฐ€ ํ•œ ๊ฒฝ์šฐ AbstractSet ๊ฐ€ ์˜์—… ์ด์ต์˜ ์˜ˆ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋ฅผ ํฌ์ฐฉํ•˜๊ธฐ ์œ„ํ•ด Generator ๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

AbstractSet ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•œ ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…์€ ๋ณธ์งˆ์ ์œผ๋กœ ์•ฝ๊ฐ„ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. AbstractSet ๋ฅผ ์Šค์นผ๋ผ์™€ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ˜๋ณต ์ˆœ์„œ๊ฐ€ ์„ธํŠธ์— ๋Œ€ํ•ด ์ง€์ •๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์™€๋Š” ๊ฒฐํ•ฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜๋Š” "๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ" ์ž‘์—…์˜ ์ผ๋ฐ˜์ ์ธ ์˜๋ฏธ๋ฅผ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค.

๋„ค, PR์„ ์ค€๋น„ํ•˜๋ฉด์„œ set์ด ๋ฐฉ์†ก์„ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” iterator์˜ ๊ฐ€์žฅ ์ข‹์€ ์˜ˆ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. Generator ๋ฐ ProductIterator ๊ฒƒ์€ ํ›จ์”ฌ ๋” ํฅ๋ฏธ๋กœ์šด ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๋Œ€๋‹ต์€ HasShape ๊ฐ€ ์žˆ๋Š” ๋ฐ˜๋ณต์ž๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์„ ์Šค์นผ๋ผ๋กœ ๊ณ„์† ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. OP๋ฅผ ์ˆ˜์ •ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ฝค ์šฐ์•„ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ž„์˜์ ์ธ ์ƒ๊ฐ: ์•„๋งˆ๋„ ํ•˜๋‚˜์˜ ์ธ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…ํ•˜๋Š” ๊ฒƒ( string.(x) )์€ ๋ชจ์–‘ ํ˜ธํ™˜์„ฑ์ด ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— map ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๋Œ€๋‹ต์€ HasShape๊ฐ€ ์žˆ๋Š” ๋ฐ˜๋ณต์ž๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์„ ์Šค์นผ๋ผ๋กœ ๊ณ„์† ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ? OP๋ฅผ ์ˆ˜์ •ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ฝค ์šฐ์•„ํ•ฉ๋‹ˆ๋‹ค.

HasLength ๋ฐ˜๋ณต์ž๋ฅผ ์ œ์™ธํ•  ๊ฐ•๋ ฅํ•œ ์ด์œ ๊ฐ€ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํŠœํ”Œ์„ ํ†ตํ•œ ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค( size ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Œ). ๋”ฐ๋ผ์„œ ํ˜•ํƒœ๊ฐ€ ์—†๋Š” ๋ฐ˜๋ณต์ž๋ฅผ ํŠœํ”Œ๊ณผ ๊ฐ™์ด ์ทจ๊ธ‰ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด, keys(::OrderedDict) ์™€ ํ•จ๊ป˜ broadcast keys(::OrderedDict) ์˜ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์‚ฌ๋žŒ๋“ค์€ broadcast (๊ทธ๋ฆฌ๊ณ  ์ข‹์€ ์  ๊ตฌ๋ฌธ)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋ณต์ž๋ฅผ HasShape ๋กœ ์ •์˜ํ•˜๊ณ  ์‹ถ์–ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์Šคํ‹ฐ๋ธŒ์˜ ๋ง์„ ์ธ์šฉํ•˜์ž๋ฉด,

broadcast ๋Š” ๋ชจ์–‘์ด ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ์šฉ์ž…๋‹ˆ๋‹ค.

HasShape ๋Š” ๊ทธ๊ฒƒ์„ ๋ณด๋‹ค ์ •ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•˜๋Š” ํ•ฉ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋™์ž‘์„ ์ค‘๋‹จํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŠœํ”Œ์€ ์ปจํ…Œ์ด๋„ˆ๋กœ, ๋ฌธ์ž์—ด์€ ์Šค์นผ๋ผ๋กœ ๊ฐ„์ฃผํ•˜๋Š” ๋“ฑ ์ด๋ฏธ ๋ถˆ์ผ์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๋ฌธ์ž์—ด์€ ๋งค์šฐ ํŠน๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๊ทธ๋“ค์˜ ํ–‰๋™์ด ๋ชจ์–‘์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ๋ฌธ์ž์—ด์ด ์ปจํ…Œ์ด๋„ˆ๋ณด๋‹ค ์Šค์นผ๋ผ๋กœ ๋” ์ž์ฃผ ๊ฐ„์ฃผ๋˜๋Š” ์œ ์ผํ•œ ์ปฌ๋ ‰์…˜์ด๋ผ๋Š” ์‚ฌ์‹ค๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@stevengj ๋Š” broadcast ๊ฐ€ ๋ชจ์–‘์ด ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋งŒ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ํŠœํ”Œ๋„ ์Šค์นผ๋ผ๋กœ ๊ฐ„์ฃผํ•˜๋Š” ๊ฒƒ์„ ์ง€์ง€ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

broadcast (#16986)์—์„œ ํŠœํ”Œ์„ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ทผ๊ฑฐ๋Š” ์‹ค์ œ๋กœ๋Š” ์ข…์ข… ๋ณธ์งˆ์ ์œผ๋กœ ์ •์  ๋ฒกํ„ฐ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ broadcast ์—์„œ "์Šค์นผ๋ผ"๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์€ ์–ด์จŒ๋“  ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์กฐ์ ์œผ๋กœ ๋ฌธ์ž์—ด (a)๋Š” ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ ์ž‘์—…์—์„œ "์›์ž"๋กœ ์ทจ๊ธ‰๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ณ  (b) ์ผ๋ฐ˜์ ์œผ๋กœ ์—ฐ์† ์ธ๋ฑ์‹ฑ์ด ์—†์œผ๋ฏ€๋กœ broadcast ํ”„๋ ˆ์ž„์›Œํฌ์— ๋งค์šฐ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์›์น™์ ์œผ๋กœ broadcast ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‚ฌ์šฉ๋˜๋Š” HasShape ๋ฐ˜๋ณต์ž๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ฃผ์š” ๋ฌธ์ œ๋Š” HasShape ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด์„œ getindex ์ž‘๋™ํ•œ๋‹ค๋Š” ๋ณด์žฅ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ฃผ์š” ๋ฌธ์ œ๋Š” HasShape๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด์„œ getindex๊ฐ€ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

#22489์™€ ๊ฐ™์€ ๊ฒƒ์ด ๋„์›€์ด ๋ ๊นŒ์š”? ์ฆ‰, ๋ฐ˜๋ณต์ž๊ฐ€ ์ธ๋ฑ์‹ฑ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ˜๋ณต์ž ํŠน์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

#22489์™€ ๊ฐ™์€ ๊ฒƒ์ด ๋„์›€์ด ๋ ๊นŒ์š”? ์ฆ‰, ๋ฐ˜๋ณต์ž๊ฐ€ ์ธ๋ฑ์‹ฑ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ˜๋ณต์ž ํŠน์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋Ÿฌ๋‚˜ ์ธ๋ฑ์‹ฑ ๊ฐ€๋Šฅํ•œ ๋ฐ˜๋ณต์ž๋งŒ broadcast ๋ฉ๋‹ˆ๊นŒ? ๋ชจ๋“  iterable(์˜ˆ: keys(::OrderedDict) ์˜ ๊ฒฐ๊ณผ)์— ๋Œ€ํ•ด string.(itr, "1") ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•˜๊ณ  ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ธ๋ฑ์‹ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋„ˆ๋ฌด ์ œํ•œ์ ์œผ๋กœ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. 0.7/1.0์—์„œ ์ธ๋ฑ์‹ฑ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๋ฐ˜๋ณต์ž์— ๋Œ€ํ•ด ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ํ›„์† ๋ฆด๋ฆฌ์Šค์—์„œ ์ง€์›ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๋ฐ˜๋ณต์ž๋ฅผ ์Šค์นผ๋ผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์€ ๋ณ„๋กœ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ 1.x ๋ฆด๋ฆฌ์Šค์—์„œ ์›ํ•˜๋Š” ๋ชจ๋“  ๋™์ž‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@stevengj ๋ฌธ์ž์—ด๊ณผ ํŠœํ”Œ์— ๊ด€ํ•œ ๋‹น์‹ ์˜ ์ฃผ์žฅ์— ๋™์˜ํ•˜์ง€๋งŒ, ์™œ HasLength ๋ฐ˜๋ณต์ž๋ฅผ ํŠœํ”Œ๋กœ ์ทจ๊ธ‰ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ง€๊ธˆ๊นŒ์ง€ ์ด์— ๋Œ€ํ•œ ๊ทผ๊ฑฐ๋ฅผ ์ฝ์ง€ ๋ชปํ–ˆ๋‹ค.

@nalimilan , indexable+hasshape ๋ฐ˜๋ณต์ž๋งŒ broadcast ์ง€์›๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜์— ์ผ๋ฐ˜ ๋ฐ˜๋ณต์ž๋ฅผ ์ง‘์–ด๋„ฃ๋Š” ๊ฒƒ์€ ๊ทธ ์˜๋ฏธ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ํ˜ผ๋™ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋Š ์‹œ์ ์—์„œ๋Š” map ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  iterable์— ๋Œ€ํ•ด string.(itr, "1") ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋งค์šฐ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ... ์–ด์จŒ๋“  iterator๋ฅผ ์Šค์นผ๋ผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ๋Š” ์ด์™€ ๋ชจ์ˆœ๋ฉ๋‹ˆ๋‹ค. "1" ์ธ์ˆ˜ ์ž์ฒด๋Š” ์˜ˆ์ œ์—์„œ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋ฌผ์˜ ํ†ค์€ ๋ฐ˜๋ณต์ž์ž…๋‹ˆ๋‹ค (์˜ˆ : PyObject PyCall์—์„œ์˜ ์ •์˜ start ๋“ฑ)์— ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์„ธํŠธ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ํฌํ•จ, broadcast ๊ฐœ๋…์€ ์ •๋ง ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ #24990 ์€ map ์ง€๊ธˆ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด map(string(_,"1"), itr) ์žˆ์Šต๋‹ˆ๋‹ค.

@nalimilan , ์ธ๋ฑ์‹ฑ ๊ฐ€๋Šฅํ•œ + ํ•ด์‹œ ๋ชจ์–‘ ๋ฐ˜๋ณต์ž๋งŒ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ์—์„œ ์ง€์›๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๋ฐ˜๋ณต์ž๋ฅผ ์ด ํ•จ์ˆ˜์— ์ง‘์–ด๋„ฃ๋Š” ๊ฒƒ์€ ๊ทธ ์˜๋ฏธ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ํ˜ผ๋™ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋Š ์‹œ์ ์—์„œ๋Š” map์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ธ๋ฑ์‹ฑ ๊ฐ€๋Šฅํ•œ ๋ฐ˜๋ณต์ž์— ๋Œ€ํ•œ ํŠน์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๊ฑด๋„ค์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚ด WIP PR #25356์€ ์ธ๋ฑ์‹ฑ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ฐ˜๋ณต์ž์— ๋Œ€ํ•ด ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต์ž๋ฅผ ์Šค์นผ๋ผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์Šค์นผ๋ผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ๋‹ค๋ฅธ ํŠน์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์™„์ „ํžˆ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ˜๋“œ์‹œ ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š์€ ๊ธฐ๋ณธ ๋™์ž‘(์˜ˆ: ์ผ๋ถ€ ๋ฐ˜๋ณต์ž๋ฅผ ์Šค์นผ๋ผ๋กœ ์ฒ˜๋ฆฌ)์— ๊ฐ€๋‘๊ธฐ๋ณด๋‹ค๋Š” ๋ฏธ๋ž˜์— ๋ชจ๋“  ๋™์ž‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. . ์ด ๋ฌธ์ œ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด broadcast ์˜ ๋™์ž‘์€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋””์ž์ธํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

(FWIW, PyObject ๋Š” IIUC๊ฐ€ Python ๋ฐ˜๋ณต์ž๋ฅผ ๋ž˜ํ•‘ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฏธ๋ฆฌ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋ณต ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์—๊ฒŒ ์ข‹์€ ์˜ˆ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. PyObject ๋Š” getfield ์˜ค๋ฒ„๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œ์ค€ Julia ๊ฐ์ฒด์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์—ฌ๊ธฐ์—์„œ ๋ถ„๋ช…ํžˆ ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค. Sets๋Š” ์ข€ ๋” Julian ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.)

๋‹ค๋ฅธ ๊ณณ์—์„œ ์ œ์•ˆ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์ธ๋ฑ์‹ฑ ๊ฐ€๋Šฅํ•œ HasShape ๋ฐ˜๋ณต์ž์— ๋Œ€ํ•œ ํŠน์„ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Triage๋Š” ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๊ฐ€ ๋ชจ๋“  ์ธ์ˆ˜(์˜ˆ: map)์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•˜๋„๋ก ํ•˜๊ณ  ์—ฐ์‚ฐ์ž ๋ฌธ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ๋‹ค๋ฅธ ๋ฌธ์ œ์—์„œ ์ด์ „์— ์ œ์•ˆ๋œ ๋Œ€๋กœ const & = Ref ๋˜๋Š” ~ ). 0์ฐจ์› ์ธ์ˆ˜.

@vtjnash , HasShape ๊ฐ€ ์•„๋‹Œ ๋ฐ˜๋ณต์ž์— ๋Œ€ํ•ด์„œ๋„ ์ด๊ฒƒ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๊ฐ€ ๋ฌธ์ž์—ด ๋ฐ ์ง‘ํ•ฉ๊ณผ ๊ฐ™์€ ํ•ญ๋ชฉ์„ ๋ฐ˜๋ณตํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๊นŒ? ํ˜„์žฌ broadcast ๊ตฌํ˜„์€ getindex ์™€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค ... ํŠนํžˆ ๋‹ค๋ฅธ ์ฐจ์›์˜ ์ธ์ˆ˜๋ฅผ ๊ฒฐํ•ฉํ•  ๋•Œ getindex ์—†์ด ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ?

์ด๋ก ์ ์œผ๋กœ ์ธ๋ฑ์‹ฑํ•  ์ˆ˜ ์—†๋Š” ๋ฐ˜๋ณต์ž(์ ์–ด๋„ ์˜๋ฏธ ์žˆ๋Š” ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋ฐ˜๋ณต์ž)๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ž…๋ ฅ์˜ ๋ชจ์–‘์ด ๊ฐ™์œผ๋ฉด ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋ชจ์–‘์ด ๋‹ค๋ฅด๊ณ  ๋ฐ˜๋ณต์ž์˜ ๋ชจ์–‘์ด ๊ฒฐ๊ณผ์™€ ๋‹ค๋ฅด๋ฉด(์ž‘์€) ์ค‘๊ฐ„ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

PR https://github.com/JuliaLang/julia/pull/22489 ์˜ IteratorAccess ํŠน์„ฑ์„ ์กฐ์ •/์žฌ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์‹ฑ ๊ฐ€๋Šฅํ•œ ๋ฐ˜๋ณต์ž๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/JuliaLang/julia/pull/24774 ์—์„œ๋Š” ์–ด๋–ค ๋ฐ˜๋ณต์ž๊ฐ€ ์ธ๋ฑ์‹ฑ ๊ฐ€๋Šฅํ•œ์ง€(๋”ฐ๋ผ์„œ keys ๊ตฌํ˜„ํ•ด์•ผ ํ•จ) ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค .

์ฐธ์กฐ: @rfourquet

๐Ÿ‘ Triage๋Š” ์ด๊ฒƒ์„ ์˜ค๋ฅ˜๋กœ ๋งŒ๋“ค๊ฑฐ๋‚˜(์•ˆ์ „ํ•œ ์„ ํƒ) ์ˆ˜์ง‘์„ ํ˜ธ์ถœ(ํ•˜๊ธฐ ์‰ฌ์šด ๊ฒฝ์šฐ)ํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์„ ๋ณ„ ์‹ฌ์‚ฌ์—์„œ ์—ฌ๊ธฐ์—์„œ ์ฑ„ํƒํ•  ํŠน์ • ์ „๋žต์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์˜ @JeffBezanson ์˜ ์˜๊ฒฌ์—์„œ "์ด๊ฒƒ"์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ธ๋ฑ์‹ฑ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๋ฐ˜๋ณต์ž์— ๋Œ€ํ•ด ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์•ผ ํ• ๊นŒ์š”(๋‚˜์ค‘์— ์›ํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ˜„์žฌ๋กœ์„œ๋Š” ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ์„ ํƒ), ์•„๋‹ˆ๋ฉด ์ผ๋ถ€ ๋ฐ˜๋ณต์ž๋ฅผ ์Šค์นผ๋ผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ• ๊นŒ์š”? ์ธ๋ฑ์‹ฑ ๊ฐ€๋Šฅํ•œ ๋ฐ˜๋ณต์ž๋ฅผ ์œ„ํ•œ ํŠน์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค ํ˜•์‹์œผ๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ( Base.IteratorSize ๋Œ€ํ•œ ์ƒˆ ํŠน์„ฑ ๋Œ€ ์ƒˆ ์„ ํƒ)? (์Šค์นผ๋ผ์™€ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก) ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ˜๋ณต์ž์— ๋Œ€ํ•œ ํŠน์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‹ค์Œ ๋™์ž‘์ด ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์ธ์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•˜๊ณ  ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜์‹ญ์‹œ์˜ค.
  • ์–ด๋–ค ์ด์œ ๋กœ ๋“  ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.
  • Ref(x) ๋˜๋Š” [x] ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ x ๋ฅผ ์Šค์นผ๋ผ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ์œ ํ˜•์ด ์˜ค๋ฅ˜๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋Œ€์‹  ์Šค์นผ๋ผ๋กœ ์ฒ˜๋ฆฌ๋˜๋„๋ก ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์„ฑ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ๋ฐ˜๋ณต๊ณผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ์‚ฌ์ด์—์„œ ์„ ํƒํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ์Šค์นผ๋ผ ๋™์ž‘์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ์š”์ ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด์ฃผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(์˜ˆ๋ฅผ ๋“ค์–ด)? ๋‚˜๋Š” ํŠน์„ฑ์ด ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋ฐ˜๋ณตํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ์‚ฌ์ด์—์„œ ์„ ํƒํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ "๋ชจ๋“  ์ธ์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•˜๊ณ  ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๋ ค๊ณ "๋Š” ๋ชจ๋“  ๋น„ ์ปฌ๋ ‰์…˜ ์œ ํ˜•(ํŠนํžˆ Number , Symbol ๋Œ€ํ•ด Scalar() ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก BroadcastStyle ๋ฅผ ์ •์˜ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค Scalar() Symbol ๋ฐ AbstractString )? ๊ทธ๊ฒƒ์€ ๋งˆ์ง€๋ง‰ ๊ธ€๋จธ๋ฆฌ ๊ธฐํ˜ธ๊ฐ€ ์–ธ๊ธ‰ํ•œ "ํŠน์„ฑ"์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•˜๋ฉด, ๋น„์ธํ„ฐ๋Ÿฌ๋ธ”/์Šค์นผ๋ผ์— ๋Œ€ํ•œ ํŠธ๋ ˆ์ž‡์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ดํ„ฐ๋Ÿฌ๋ธ”์— ๋Œ€ํ•œ ํŠธ๋ ˆ์ž‡์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ๋น„์šฉ์ด ๋œ ๋“ ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€(๋“œ๋ฌธ ๊ฒฝ์šฐ) ๊ฒฝ์šฐ์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋น„ ์ปฌ๋ ‰์…˜ ์œ ํ˜•์ด ์–ด๋Š ์‹œ์ ์—์„œ ๊ทธ Scalar ํŠน์„ฑ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์„๊นŒ ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ๊ธ€๋จธ๋ฆฌ ๊ธฐํ˜ธ๊ฐ€ ์–ธ๊ธ‰ํ•œ "ํŠน์„ฑ"์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ๋งˆ์ง€๋ง‰ ๊ธ€๋จธ๋ฆฌ ๊ธฐํ˜ธ๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋ฐ˜๋ณต์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๊ฐ€ ๋ฐ˜๋ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์Šค์นผ๋ผ ํŠน์„ฑ์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์—†๋Š” ๋ช‡ ๊ฐ€์ง€ ์œ ํ˜•(์˜ˆ: Type ๋ฐ Function ํ•˜์œ„ ์œ ํ˜•)์˜ ๊ฒฝ์šฐ Type ์„ ๋ณ€๊ฒฝํ•˜๋Š” NotIterable ํŠธ๋ ˆ์ž‡์„ ์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค MethodError ๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ’(ํ•ด๋‹น ๊ฐ์ฒด)์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ˜๋ณต์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ด๊ฒŒ ์™œ ํ•„์š”ํ–ˆ๋Š”์ง€ ๊ธฐ์–ต์ด ์•ˆ๋‚œ๋‹ค.

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ "๋ชจ๋“  ์ธ์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•˜๊ณ  ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๋ ค๊ณ  ์‹œ๋„"ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ชจ๋“  ๋น„ ์ปฌ๋ ‰์…˜ ์œ ํ˜•(ํŠนํžˆ Number, Symbol ๋ฐ AbstractString)์— ๋Œ€ํ•ด Scalar()๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก BroadcastStyle์„ ์ •์˜ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งˆ์ง€๋ง‰ ๊ธ€๋จธ๋ฆฌ ๊ธฐํ˜ธ๊ฐ€ ์–ธ๊ธ‰ํ•œ "ํŠน์„ฑ"์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, Number ์˜ ๋ชจ๋“  ์Šค์นผ๋ผ ํ•˜์œ„ ์œ ํ˜•์€ ์ž์ฒด์ ์œผ๋กœ ๋ฐ˜๋ณต๋˜๋ฏ€๋กœ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ธฐํ˜ธ์— ๋Œ€ํ•ด ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. AbstractString ๋Š” ์ปฌ๋ ‰์…˜์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์Šค์นผ๋ผ๋กœ ์ทจ๊ธ‰๋˜๋Š” ์œ ํ˜•์— ๋Œ€ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•ด์•ผ ํ•˜๋Š” ๋””์ž์ธ์„ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๊ธฐ๋ณธ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฌธ์ž์—ด์„ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ์šฉ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ทจ๊ธ‰ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๊ฐ€ HasShape ๋ฐ˜๋ณต์ž๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ทจ๊ธ‰ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฐฉ์†ก์˜ ๋””์ž์ธ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋ฌด์Šจ ๋ฌธ์ œ์•ผ?

๊ทธ ๋ฌธ์ œ๋Š” OP์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋ชจ์–‘์ด ์—†๋Š” ๋ฐ˜๋ณต์ž๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ์Šค์นผ๋ผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋ฏธ์นœ ๋‹ต์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ œ์•ˆ์˜ "ํŠน์„ฑ" ๋ถ€๋ถ„์„ ์‚ญ์ œํ•˜๊ฒŒ ๋˜์–ด ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ๋ถˆํ‰ํ•˜์ง€ ์•Š๋Š”๋‹ค

julia> map(string, [1,2], :a)
ERROR: MethodError: no method matching start(::Symbol)

ํ‹€๋ฆผ์—†์ด OP์˜ ๊ฒฐ๊ณผ๊ฐ€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ด์œ ๋Š” ์•„๋ฌด๋„ ์‹ค์ œ๋กœ _all_ ์ธ์ˆ˜๋ฅผ ์Šค์นผ๋ผ๋กœ ์ทจ๊ธ‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ํ˜ธ์ถœ์„ ์˜๋„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹จ ํ•˜๋‚˜์˜ ์ธ์ˆ˜๋งŒ ์žˆ๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•˜๋Š” ๋ฐ”๊ฐ€ ๊ฑฐ์˜ ํ™•์‹คํ•œ ์ปฌ๋ ‰์…˜/๋ฐ˜๋ณต์ž๋กœ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š” ๊ฒฝ์šฐ. ๋ฌผ๋ก  1 .+ 1 ๋Š” ๊ณ„์† ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์ด ๋‚˜์—๊ฒŒ ์ผ์–ด๋‚ฌ์ง€๋งŒ, ํ•˜๋‚˜์˜ ์ฃผ์žฅ์„ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋น„๋Œ€์นญ์ด ๋ณด์ž…๋‹ˆ๋‹ค. iterable์„ ์Šค์นผ๋ผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ •๋ง ์ด์ƒํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค์ง€๋งŒ ์Šค์นผ๋ผ๋ฅผ iterable๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ธ์ˆ˜๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ ์‰ฝ๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ์—๋Š” ์ธ์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ์ž‘์—…์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๊ฐ€ HasShape ๋ฐ˜๋ณต์ž๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ทจ๊ธ‰ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฐฉ์†ก์˜ ๋””์ž์ธ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋ฌด์Šจ ๋ฌธ์ œ์•ผ?

@stevengj IMHO์˜ ์ž˜๋ชป๋œ ์ ์€ ์™„๋ฒฝํ•˜๊ฒŒ ํ•ฉ๋ฆฌ์ ์ธ ๋™์ž‘์ด ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์„ ๋•Œ ์ผ๋ถ€ ์ž‘์—…์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. HasLength ๋ฐ˜๋ณต์ž๋ฅผ Tuple ์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•˜์‹ญ์‹œ์˜ค. ์ง€๊ธˆ ๋‹น์žฅ์€ ์ง€์›ํ•˜์ง€ ์•Š๋”๋ผ๋„ 1.x์˜ ์–ด๋Š ์‹œ์ ์—์„œ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์€ ์—ด์–ด๋‘๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์•„๋ฌด๋„ ๋ถˆํ‰ํ•˜์ง€ ์•Š๋Š”๋‹ค

์ค„๋ฆฌ์•„> ๋งต(๋ฌธ์ž์—ด, [1,2], :a)
์˜ค๋ฅ˜: MethodError: start(::Symbol)์™€ ์ผ์น˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@JeffBezanson OTC, ์ €๋Š” :a ๋ฅผ ํ•„์š”์— ๋”ฐ๋ผ ๋ฐ˜๋ณตํ•˜๋Š” broadcast ์˜ ํ˜„์žฌ ๋™์ž‘์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๊ฒƒ์€ ์˜ˆ๋ฅผ ๋“ค์–ด ์ผ๋ จ์˜ DataFrame ์—ด์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. map ์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก broadcast ๋ฅผ ๋ณ€๊ฒฝํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ ๋น„๋Œ€์นญ์ด ๋ณด์ž…๋‹ˆ๋‹ค. iterable์„ ์Šค์นผ๋ผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ •๋ง ์ด์ƒํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค์ง€๋งŒ ์Šค์นผ๋ผ๋ฅผ iterable๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ธ์ˆ˜๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ ์‰ฝ๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ์—๋Š” ์ธ์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ์ž‘์—…์ด ์—†์Šต๋‹ˆ๋‹ค.

์‰ฝ์ง€๋งŒ ์ƒ๋‹นํžˆ ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค. ์Šค์นผ๋ผ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” @stevengj์˜ ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  Number ์œ ํ˜•์ด ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๊ฐ€์‹ฌ์€ ํ•ญ์ƒ ํ‘œ์‹œ๋˜์ง€๋Š” ์•Š์ง€๋งŒ Symbol ์˜ˆ์ œ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณ„๋กœ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Char ์ด ๊ณ ์ƒํ•ฉ๋‹ˆ๋‹ค ํŒจํ‚ค์ง€์— ์ •์˜ ๋œ ๋‹ค๋ฅธ ๋งŽ์€ ์‚ฌ์šฉ์ž ์ •์˜ ํ˜•์‹์ด ๋  ๊ฒƒ์ด๋‹ค (๊ทธ๋ฆฌ๊ณ  ์ •์˜ ๊ฒฐ๊ตญ ์ž์‹ ์˜ BroadcastStyle ๋กœ Scalar() ).

๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ ์ปฌ๋ ‰์…˜๊ณผ ์Šค์นผ๋ผ๋ฅผ ๊ตฌ๋ณ„ํ•˜๋Š” ํŠน์„ฑ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ€์žฅ ์ง์ ‘์ ์ธ ํ•ด๊ฒฐ์ฑ…์€ ์‹ค์ œ๋กœ HasShape ๋ฐ˜๋ณต์ž๋ฅผ ์ปฌ๋ ‰์…˜์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹ค๋ฅธ ์œ ํ˜•์„ ์Šค์นผ๋ผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋ชจ๋“  ์œ ํ˜•์˜ ๊ธฐ๋ณธ๊ฐ’์ด๋ฏ€๋กœ HasLength ๋ฐ˜๋ณต์ž๋ฅผ ํฌํ•จ). ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ์ปฌ๋ ‰์…˜/์ดํ„ฐ๋Ÿฌ๋ธ”์— ๋Œ€ํ•œ ํŠน์„ฑ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ๋งŽ์€ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์•˜๊ณ  ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ •์˜๋œ start ์— ์˜์กดํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ €๋Š” ํ˜„์žฌ์˜ ํ–‰๋™์„ ์œ ์ง€ํ•ด์•ผ ํ• ๊นŒ๋ด ๋‘๋ ต์Šต๋‹ˆ๋‹ค.

https://github.com/JuliaLang/julia/issues/18618#issuecomment -360594955์— ์žˆ๋Š” Jeff์˜ ์ œ์•ˆ์—๋Š” Symbol ๋ฐ Char ๋ฅผ "์Šค์นผ๋ผ" ์œ ํ˜•์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋ฅผ ํ—ˆ์šฉํ•  ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ–‰๋™์— ๋™์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. start ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ์„ค๋“๋ ฅ ์žˆ๋Š” ๋ถ€๋ถ„์€ "์ปฌ๋ ‰์…˜" ์œ ํ˜•์— ๋Œ€ํ•œ ์œ ์ผํ•œ ํ•ฉ๋ฆฌ์ ์ธ ์ •์˜๋Š” ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ, ๋ฌธ์ž์—ด์ด ์ปฌ๋ ‰์…˜์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ๊ทธ๋“ค์€ ๊ทธ๋ ‡๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค! ๋”ฐ๋ผ์„œ ์‚ฌ๋žŒ๋“ค์ด ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์—์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ์‰ฝ๊ฒŒ ์˜ตํŠธ์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋™์ž‘์„ ๊ธฐ๋ณธ์œผ๋กœ ์„ค์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์— ์‚ฌ๋งˆ๊ท€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆซ์ž๋Š” ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ( HasShape ) 0์ฐจ์› ์ปจํ…Œ์ด๋„ˆ๋กœ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋…ผ๋ฆฌ์  ๊ฒฐ๋ก ์— ๋”ฐ๋ฅด๋ฉด 1 .+ 2 != 3 ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  fill(3, ()) ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์Šค๋ ˆ๋“œ๊ฐ€ ๋” ์ด์ƒ ํƒˆ์„ ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ด๋ก ์œผ๋กœ ์ด๋™:

https://discourse.julialang.org/t/lazycall-again-sorry/8629

#18618(comment)์— ์žˆ๋Š” Jeff์˜ ์ œ์•ˆ์—๋Š” Symbol ๋ฐ Char๋ฅผ "์Šค์นผ๋ผ" ์œ ํ˜•์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋ฅผ ํ—ˆ์šฉํ•  ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹œ์ž‘์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋„ค, ์ œ ์ž…์žฅ์€ ์Šค์นผ๋ผ๊ฐ€ ๋” ์ž์—ฐ์Šค๋Ÿฌ์šด ํด๋ฐฑ์ด๋ผ๋Š” ๊ฐ€์ •์— ๊ธฐ๋ฐ˜์„ ๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ปฌ๋ ‰์…˜์€ ์ผ๋ถ€ ๋ฉ”์„œ๋“œ(๋ฐ˜๋ณต, ์ธ๋ฑ์‹ฑ)๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ฐ˜๋ฉด ์Šค์นผ๋ผ๋Š” "๋‚˜๋จธ์ง€"์ด๊ณ  ๊ณตํ†ต์ ์ด ์—†๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋ชจ๋“  ์œ ํ˜•์€ ์›ํ•˜๋Š” ๋ชจ๋“  ๋™์ž‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ€๋Šฅํ•œ ํ•œ ํŽธ๋ฆฌํ•˜๊ณ  ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํŠนํžˆ ๋ถˆ์ผ์น˜๋ฅผ ํ”ผํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค(์˜ˆ: ์ผ๋ถ€ ์œ ํ˜•์€ ์„ ์–ธ๋˜๊ณ  ์Šค์นผ๋ผ๋กœ ์ž‘๋™ํ•˜๊ณ  ๋‹ค๋ฅธ ์œ ํ˜•์€ ๊ทธ๋ ‡์ง€ ์•Š์Œ).

๋‹ค๋ฅธ ์œ ํ˜•์— ๋Œ€ํ•œ ๊ทœ์น™์ด ๋ช…ํ™•ํ•˜๋‹ค๋ฉด ๋ฌธ์ž์—ด ๋ฐ ์ˆซ์ž์™€ ๊ฐ™์€ ํ•„์ˆ˜ ์œ ํ˜•์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์™ธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ง€๋‚˜์น˜๊ฒŒ ๊ฑฑ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์šฐ๋ฆฌ์˜ ๋ฐ˜๋ณต ๋ฐ ์ธ๋ฑ์‹ฑ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ฐ˜๋ณตํ•˜๋Š”(ํ•˜์ง€๋งŒ ์ธ๋ฑ์‹ฑํ•  ์ˆ˜๋Š” ์—†๋Š”) ์œ ์šฉํ•œ ๊ฐ์ฒด, ์ธ๋ฑ์‹ฑ๋  ์ˆ˜ ์žˆ๋Š”(๊ทธ๋Ÿฌ๋‚˜ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์—†๋Š”) ๊ฐ์ฒด, ๊ทธ๋ฆฌ๊ณ  ๋‘˜ ๋‹ค ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋‹ค์Œ ์‚ฌํ•ญ์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

  • map ๊ฐ•ํ•˜๊ฒŒ ๋ฐ˜๋ณต ํ”„๋กœํ† ์ฝœ์— ๋ฌถ์—ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค - ์šฐ๋ฆฌ๊ฐ€ ๊ฒŒ์œผ๋ฅธ ํ•  ์ˆ˜์žˆ๋Š” ์œ ํšจํ•œ ๊ฒƒ out = map(f, iterable) ์— ๋Œ€ํ•œ ์ž„์˜์˜ iterable ์˜ˆ๋Š” ๊ทธ๋Ÿฐ๋ฅผ first(out) ๋Š” IS f(first(iterable)) ์™€ ๊ฐ™์œผ๋ฉฐ ์ด ์ผ๋ฐ˜์ ์ธ ๊ฒŒ์œผ๋ฅธ ์ž‘์—…์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • broadcast ๋Š” ์ธ๋ฑ์‹ฑ ์ธํ„ฐํŽ˜์ด์Šค์— ๊ฐ•๋ ฅํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. out[i] ๊ฐ€ f(indexable[i]) ์™€ ๊ฐ™๋„๋ก ๊ฒŒ์œผ๋ฅธ out = broadcast(f, indexable) ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ด ์ผ๋ฐ˜์ ์ธ ๊ฒŒ์œผ๋ฅธ ์ž‘์—…์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์—ฌ๋Ÿฌ ์ž…๋ ฅ์ด ์žˆ๋Š” broadcast ๋Š” ์—ฌ์ „ํžˆ ํ˜„์žฌ ํ•˜๋Š” ๋ชจ๋“  ๋ฉ‹์ง„ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…์„ ์œ„ํ•ด ์Šค์นผ๋ผ๋Š” ์ธ๋ฑ์‹ฑํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋˜๋Š” Number ๋ฐ Ref ๋ฐ AbstractArray{0} ์™€ ๊ฐ™์ด ์‚ฌ์†Œํ•œ ์ธ๋ฑ์‹ฑ).

๋˜ํ•œ ๋‹จ์ผ ์ธ์ˆ˜ map ๋ฐ ๋‹จ์ผ ์ธ์ˆ˜ broadcast ๊ฐ€ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•˜๊ณ  ์ธ๋ฑ์‹ฑ ๊ฐ€๋Šฅํ•œ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•ด ๋งค์šฐ ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ AbstractDict ๋ฐ˜๋ณต์ด getindex ์™€ ๋‹ค๋ฅธ ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ์—ฌ๊ธฐ์„œ ์ข‹์€ ํ†ตํ•ฉ์„ ๋ฐฉํ•ดํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. :frowning_face: (์šฐ๋ฆฌ์˜ ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜ ์œ ํ˜•์€ ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค)

(๋‚˜์—๊ฒŒ ๋ฌธ์ž์—ด๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ["bug", "cow", "house"] .* ("s",) ์ฒ˜๋Ÿผ ๋ช…์‹œ์ ์œผ๋กœ ๋ž˜ํ•‘๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ์—ฌ๊ธฐ์„œ ๊ฑฐ๋ž˜ ์ฐจ๋‹จ๊ธฐ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 3-๋ฒกํ„ฐ๋ฅผ ์ƒ๊ฐํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. "๋‹จ์ผ 3D ํฌ์ธํŠธ"์ด๋ฏ€๋กœ ๋‹ค๋ฃจ๊ธฐ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค(xref #18379)).

broadcast ๋Š” ์ธ๋ฑ์‹ฑ ๊ฐ€๋Šฅํ•œ ์ปจํ…Œ์ด๋„ˆ์šฉ์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ๋ฌธ์ž์—ด์„ ์ œ์™ธํ•˜๊ณ  ์—ฐ์†์ ์œผ๋กœ ์ธ๋ฑ์‹ฑํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด collect(eachindex("aฮฑb๐Ÿจฮณz")) ๋Š” [1, 2, 4, 5, 9, 11] . ์ด๋Š” ์ธ๋ฑ์‹ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋ชจ๋“  broadcast ๊ตฌํ˜„์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ธ๋ฑ์‹ฑ ๊ฐ€๋Šฅํ•œ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์˜ตํŠธ์ธํ•˜๋Š” ํŠน์„ฑ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ฐ€ ์˜นํ˜ธํ•ด ์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฐ์† ์ธ๋ฑ์Šค ๊ฐ€ ์ข‹์€ ์ œ์•ฝ ์กฐ๊ฑด์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์ „์—๋Š” ์ž„์˜์˜ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ broadcast(f, ::String) ๋Š” ์ƒˆ String ์ƒ์„ฑํ•  ์ˆ˜ ์—†์œผ๋ฉฐ UTF-8 ๋ฌธ์ž ๋„ˆ๋น„๊ฐ€ f ( ๊ทธ ๋ณด์ฆ์„ ํ•˜๋ ค๋ฉด AbstractDict{Int, Char} ์™€ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ๋ฐ”๋€Œ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!). String ์ธ๋ฑ์Šค๋Š” ์˜๋ฏธ์ƒ ์ค‘์š”ํ•œ ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ๋น ๋ฅธ ์กฐํšŒ๋ฅผ ์œ„ํ•œ "ํ† ํฐ"๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ๊ฑฐ์˜ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๋™๋“ฑํ•œ UTF-32 ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ธ๋ฑ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋จ).

ํŠธ๋ ˆ์ž‡์„ ํ†ตํ•ด ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ… ๋™์ž‘์„ ์˜ตํŠธ์ธํ•˜๋„๋ก ํ•ด๋„ ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ broadcast(f, ::Any) ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ƒ์ƒํ•˜๋Š” ๊ฒƒ์ด broadcast(f, ::AbstractDict) ์™€ ๊ฐ™์€ ๊ตฌํ˜„์„ ์•ˆ๋‚ดํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ #25904์—์„œ ์ œ๊ธฐํ•œ ์งˆ๋ฌธ์— ๋‹ตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ‚ค-๊ฐ’ ์Œ์ด ์•„๋‹Œ ์‚ฌ์ „ ๊ฐ’).

์‚ฌ๋žŒ๋“ค์€ ์ด ๋ณ€ํ™”์— ์ง„์ •์œผ๋กœ ๋งŒ์กฑํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋ชจ์–‘์ด ์—†๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•ด ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ์ง€๋งŒ ํ•ญ์ƒ ์Šค์นผ๋ผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ '์ˆ˜์ •'ํ•˜๋Š” ๋ชจ๋“  ๋น„์ถ”์ฒœ ๊ฒฝ๊ณ ๋Š” ๋‚˜๋ฅผ ๋ˆˆ๋ฌผ ํ˜๋ฆฌ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚˜๋Š” _ํ•ญ์ƒ_ ์Šค์นผ๋ผ๋กœ ์ทจ๊ธ‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค์— ๋Œ€ํ•ด ๋ฐฉ์†กํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌํ•œ ๊ฒƒ๋“ค์˜ ์ข…๋ฅ˜๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋ฌด์—‡์ด๋“  ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ตœ์ ํ™” ๋ชจ๋ธ ์œ ํ˜• Model ๋ฐ ๊ฒฐ์ • ๋ณ€์ˆ˜ ์œ ํ˜• Variable ๋ฅผ ์ •์˜ํ•˜๋Š” ํŒจํ‚ค์ง€์—์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ํ›„ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋ ค๋Š” x::Vector{Variable} ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. value(::Variable, ::Model)::Float64 ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ model ๋ชจ๋ธ. ์ด์ „์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

value.(x, model)

๋˜ํ•œ ์ธ์ˆ˜ ์œ ํ˜•์ด ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ์œ ํ˜•์— ๋Œ€ํ•ด broadcastable ์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์ด ๊ฒฝ์šฐ ์œ ํ˜• ๋ถˆ๋ฒ• ๋ณต์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Ref ๋˜๋Š” ๋‹จ์ผ ์š”์†Œ ํŠœํ”Œ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทน๋ณตํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ œ ์ƒ๊ฐ์—๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ๋ชจํ˜ธํ•œ ์‚ฌ์šฉ ํŒจํ„ด์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋ฅผ ํ›จ์”ฌ ๋œ ์šฐ์•„ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์˜ˆ, ๊ท€ํ•˜์˜ ์š”์ ์„ ์ดํ•ดํ•˜๊ณ  ๊ทธ๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ์„ฑ๊ฐ€์‹  ์ผ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ด์ „ ๋™์ž‘์€ ์ ˆ๋Œ€์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. "๊ธฐ๋ณธ ํด๋ฐฑ์ด ์ผ๋ถ€ ๊ฒฝ์šฐ์— ํ™•์‹คํžˆ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ์ž˜๋ชป๋œ ํด๋ฐฑ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋„ค ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด _everything_์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  2. ์‚ฌ๋ฌผ์„ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์˜ค๋ฅ˜/์‚ฌ์šฉ ์ค‘๋‹จ์„ ๊ธฐ๋ณธ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

    • ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด๋ฅผ iterate ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์Šค์นผ๋ผ์— ๋Œ€ํ•ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

    • ์Šค์นผ๋ผ์—๋Š” ๋‘ ๊ฐ€์ง€ ํƒˆ์ถœ๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์—์„œ ๋ž˜ํ•‘ํ•  ์ˆ˜ ์žˆ๊ณ  ๋„์„œ๊ด€ ์ž‘์„ฑ์ž๋Š” ๋ž˜ํ•‘๋˜์ง€ ์•Š์€ ์Šค์นผ๋ผํ˜• ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ์•Œ ์ˆ˜ ์—†๋Š” ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ์Šค์นผ๋ผ ๋ฐ ์˜ค๋ฅ˜๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.

    • ์Šค์นผ๋ผ์— ๋Œ€ํ•ด์„œ๋งŒ ์ •์˜๋œ ๊ด€๋ จ ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ iterate ์—์„œ ๋ฉ”์„œ๋“œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Š๋ฆฌ๊ณ  ์ˆœํ™˜์ ์ž…๋‹ˆ๋‹ค.

    • ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์‚ฌ์šฉ์ž ์ •์˜ ์ปจํ…Œ์ด๋„ˆ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํƒˆ์ถœ ํ•ด์น˜๋Š” ๋‹จ ํ•˜๋‚˜๋ฟ์ž…๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž๋Š” ๋ช…์‹œ์ ์œผ๋กœ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ปจํ…Œ์ด๋„ˆ ์ž‘์—…์ด ์ฃผ ๋ชฉ์ ์ธ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ์ƒ๋‹นํžˆ ๊ฑฐ๊พธ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

  4. applicable(iterate, โ€ฆ) ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ๋™์ž‘์„ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    • ์ด๊ฒƒ์€ ํ˜„์žฌ start/next/done์˜ ์ง€์› ์ค‘๋‹จ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์ธํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฉค๋ฒ„์—๊ฒŒ ์—ฐ๊ธฐํ•˜๋Š” ๋ž˜ํผ ์œ ํ˜•์— ๋Œ€ํ•ด ์ž˜๋ชป๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ต์…˜ 1์€ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๋” ๋‚˜์˜๊ณ , ์˜ต์…˜ 2๋Š” ํ˜„์žฌ ์ƒํƒœ์ด๋ฉฐ, ์˜ต์…˜ 3์€ ์—ญ๋ฐฉํ–ฅ์ด๋ฉฐ, ์˜ต์…˜ 4๋Š” ์ด์ „์— ํ•œ ๋ฒˆ๋„ ํ•ด๋ณธ ์ ์ด ์—†๊ณ  ๋ฒ„๊ทธ๊ฐ€ ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ๋ถ€ ํ† ๋ก ์€ ๋ฐฐํ›„์—์„œ ๋ฐœ์ƒํ–ˆ์Œ์— ํ‹€๋ฆผ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด ์Šค๋ ˆ๋“œ์™€ https://github.com/JuliaLang/julia/pull/25356 ์—์„œ nalimilan ์— ๋Œ€ํ•ด ๋ณธ ์ฃผ์žฅ์— ๋Œ€ํ•ด์„œ๋Š” ํ™•์‹ ์ด ์„œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค stevengj ์˜ ์œ„์น˜.

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์‚ฌ์šฉ์ž ์ •์˜ ์ปจํ…Œ์ด๋„ˆ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํƒˆ์ถœ ํ•ด์น˜๋Š” ๋‹จ ํ•˜๋‚˜๋ฟ์ž…๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž๋Š” ๋ช…์‹œ์ ์œผ๋กœ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ปจํ…Œ์ด๋„ˆ ์ž‘์—…์ด ์ฃผ ๋ชฉ์ ์ธ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ์ƒ๋‹นํžˆ ๊ฑฐ๊พธ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ €์˜ ์ฃผ๋œ ์˜๊ฒฌ ๋ถˆ์ผ์น˜์ž…๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ๋ชจ๋“  Julia ์ฝ”๋“œ์—์„œ # of iterator types << # of types that should be treated as scalars in a broadcast situation < # of broadcast calls . ๋”ฐ๋ผ์„œ '์ถ”๊ฐ€' ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ํšŸ์ˆ˜๊ฐ€ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ํ˜ธ์ถœ ์ˆ˜๋ณด๋‹ค ๋ฐ˜๋ณต์ž ์œ ํ˜• ์ˆ˜์— ๋”ฐ๋ผ ์กฐ์ •๋˜๋Š” ๊ฒฝ์šฐ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž๊ฐ€ ๋ฐ˜๋ณต์ž๋ฅผ ์ •์˜ํ•œ๋‹ค๋ฉด, ๊ทธ๋“ค์—๊ฒŒ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜๋„๋ก ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์™„์ „ํžˆ ๋ถˆํ•ฉ๋ฆฌํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ๋ชจ๋“  ํŒจํ‚ค์ง€ ์ž‘์„ฑ์ž์—๊ฒŒ ๋ฐ˜๋ณต ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์œ ํ˜•์— ๋Œ€ํ•ด Base.broadcastable(x) = Ref(x) ๋ฅผ ์ •์˜ํ•˜๋„๋ก ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์€ _์™„์ „ํžˆ ๋ถˆํ•ฉ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. broadcast ํ˜ธ์ถœ์˜ ๋†’์€ ๋น„์œจ์—์„œ ๋ชป์ƒ๊ธด (IMHO) Ref broadcast ๋ฅผ ํ”ผํ•˜์‹ญ์‹œ์˜ค.

๋ฐ˜๋ณต์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋‹จ์ผ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ƒˆ ํŠน์„ฑ์— ๋Œ€ํ•ด ํ•˜๋‚˜ ๋” ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์ƒˆ ๋ฐ˜๋ณต์ž์— ๋Œ€ํ•ด Base.iteratorsize ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ทธ๋ฆฌ ๋งŽ์€ ์ž‘์—…์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” HasLength ๊ธฐ๋ณธ๊ฐ’ ์ œ๊ฑฐ). ๊ทธ๋Ÿฌ๋ฉด broadcastable ๋Œ€์ฒด ๋ฐฉ๋ฒ•์ด ํ•ด๋‹น ํŠน์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋‹จ์ผ ๋ฉ”์„œ๋“œ๋กœ ๋ฐ˜๋ณต์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ์ •๋ง ์ข‹์•„ํ•œ๋‹ค๋ฉด https://github.com/JuliaLang/ ์—์„œ์™€ ๊ฐ™์ด ๋ช…์‹œ์  ํŠน์„ฑ ๊ธฐ๋ณธ๊ฐ’์„ applicable(iterate, ...) ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. julia/issues/18618#issuecomment -354618742, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น ๊ธฐ๋ณธ๊ฐ’์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ์ฝ”๋„ˆ์˜ ๊ฒฝ์šฐ String ๋˜ํ•œ ์—ฌ์ „ํžˆ ๋”๋Š” ์ „๋ฌธ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ broadcastable ์›ํ•˜๋Š” ๊ฒฝ์šฐ.

์ด๋Š” ์‚ฌ์‹ค์ƒ 0.6์˜ ๋””์ž์ธ์œผ๋กœ ์ด ๋ฌธ์ œ์™€ #26421, #19577, #23197, #23746 ๋ฐ ๊ทธ ์ด์ƒ์„ ์ดˆ๋ž˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ด๋Š” Base๊ฐ€ ์ „์ฒด ๊ฐœ์ฒด ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์ž˜๋ชป๋œ ๊ธฐ๋ณธ ํด๋ฐฑ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ์„ ํƒํ•˜์ง€ ์•Š๋Š” ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์„ ํ˜ธํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ๋…๋‹จ์ ์ด๋ฉฐ ์ „ํ™˜์€ ๊ณ ํ†ต์Šค๋Ÿฝ์ง€๋งŒ ๋ช…์‹œ์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ณต์ž์™€ ๊ฐ™์€ ๊ฒƒ๋ณด๋‹ค "์Šค์นผ๋ผ์™€ ๊ฐ™์€" ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•์ด ๋” ๋งŽ๋‹ค๋Š” ๊ฒƒ์ด ์˜ณ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…์ด ๊ฐ€์žฅ ๋จผ์ € ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ์ž‘์—…์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค. f.(x) ๊ฐ€ f(x) ์•„๋‹ˆ๋ผ ์ผ์ข…์˜ ๋งคํ•‘์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์Šค์นผ๋ผ ๊ธฐ๋ณธ ์ฒ˜๋ฆฌ๋ฅผ ๋ฐ›๋Š” ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…๊ณผ ํ•จ๊ป˜ ์š”์†Œ๋ณ„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, String ๋Š” ์Šค์นผ๋ผ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋„๋ก ํŠน์ˆ˜ ์ผ€์ด์Šค๊ฐ€ ์žˆ๋Š” ์ปฌ๋ ‰์…˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ƒํ™ฉ(์˜ˆ: isletter.("a1b2c3") )์—์„œ๋Š” ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ "์ ‘๊ทผ"ํ•˜๊ณ  ์š”์†Œ๋ณ„๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋น„๋Œ€์นญ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ์ปฌ๋ ‰์…˜์œผ๋กœ collect ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค Ref์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ๋ž˜ํ•‘ํ•˜์—ฌ ์Šค์นผ๋ผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ฃผ์š” ์ฃผ์žฅ์ž…๋‹ˆ๋‹ค. Ref์˜ ์ถ”์•…ํ•จ์— ๋Œ€ํ•ด์„œ๋Š” ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…์€ #27608์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿด ์ˆ˜ ์žˆ์ง€. ๋‚˜๋Š” ๊ทธ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์–ด๋–ค ๋…น๋‹ค์šด ์ฃผ์žฅ์ด๋‚˜ ๋งˆ๋ฒ•์˜ ํ•ด๊ฒฐ์ฑ…์ด ์—†์œผ๋ฉฐ https://github.com/JuliaLang/julia/pull/27608 ์ด ์ƒํ™ฉ์„ ๊ฐœ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@tkoolen ๋‚˜๋Š” ๊ฐ™์€ ์šฐ๋ ค์™€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

@mbauman ์œ„์— ์ฃผ์–ด์ง„ ์ฃผ์žฅ์€ ์™„์ „ํžˆ ์„ค๋“๋ ฅ์ด ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ณด๋‹ค ์™„์ „ํ•œ ๋‘ ๊ฐ€์ง€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

1) broadcastable ๋ฅผ ๋ชจ๋“  iterable์— ๋Œ€ํ•œ ํ•„์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ์™„์ „ํžˆ ์ฒด๊ณ„์ ์ด๋ฉฐ ๊ฐœ๋ฐœ์ž๊ฐ€
์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€.
collect(x) ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ „ํ™˜์ด ๋น„๊ต์  ์‰ฝ์Šต๋‹ˆ๋‹ค.
์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์—†๊ฒ ์ฃ ?

2) ๋”ฐ๋ผ์„œ x ๊ฐ€ ์Šค์นผ๋ผ๋กœ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋˜๋ฉด f.(x) ๋Œ€ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
"'f'์˜ ๋ชจ๋“  ์ธ์ˆ˜๊ฐ€ ์Šค์นผ๋ผ๋กœ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋จ"๊ณผ ๊ฐ™์€ f.(x, y, z) ๋Œ€ํ•œ ๋ฆฐํ„ฐ ๊ฒฝ๊ณ /์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์–ด์จŒ๋“ , #27563(์˜ˆ: #27608)์„ ์ˆ˜์ •ํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ 1.0 ์ด์ „์— ์ž ์‹œ ํ”Œ๋ ˆ์ดํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
[0.7 ๋ฐ 1.0.0-rc1.0์€ ์ˆ˜์ • ์—†์ด ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์Šต๋‹ˆ๋‹ค.]

์–ด์จŒ๋“ , #27563(์˜ˆ: #27608)์„ ์ˆ˜์ •ํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ 1.0 ์ด์ „์— ์ž ์‹œ ํ”Œ๋ ˆ์ดํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
[0.7 ๋ฐ 1.0.0-rc1.0์€ ์ˆ˜์ • ์—†์ด ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์Šต๋‹ˆ๋‹ค.]

๋‚˜๋Š” ๋‹น์‹ ์ด 1.0์ด ์ถœ์‹œ๋˜์—ˆ๋‹ค๋Š” ์†Œ์‹์„ ๋†“์ณค๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@StefanKarpinski ์‹ค์ œ๋กœ

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰