Julia: ํ•จ์ˆ˜ ์ฒด์ธ

์— ๋งŒ๋“  2014๋…„ 01์›” 27์ผ  ยท  232์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: JuliaLang/julia

๊ฐ’์ด ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๊ณ  ๊ฐ’์— ๋Œ€ํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ์ „๋‹ฌ ๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ๋‚˜์ค‘์— ์ถ”๊ฐ€๋˜๋„๋ก Any์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ—ˆ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
์ „์˜.

sum(a::Int, b::Int) -> a + b

a = 1
sum(1, 2) # = 3
a.sum(2) # = 3 or
1.sum(2) # = 3

๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ ํ•  ๋‚ด์šฉ์„ ๊ฒฐ์ •์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ์˜ ํ˜„์žฌ ๋‹ค์–‘ํ•œ ๋…ธ๋ ฅ ๋ชฉ๋ก ๋“ฑ
๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (์ด์ƒ์ ์œผ๋กœ๋Š” ์˜๊ฒฌ์„ ๋งํ•˜๊ธฐ ์ „์—, ๊ทธ๋Ÿฌ๋‚˜ w / e)
๊ทธ๋“ค์€ ๋ชจ๋‘ ์•ฝ๊ฐ„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
(๋‚˜๋Š” ์—ฐ๋Œ€์ˆœ์œผ๋กœ ์ฃผ๋ฌธํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค).

ํŒจํ‚ค์ง€

๋น„ ํŒจํ‚ค์ง€ ํ”„๋กœํ†  ํƒ€์ž…

๊ด€๋ จ :


์•„๋งˆ๋„ ์ด๊ฒƒ์€ ์ƒ์œ„ ๊ฒŒ์‹œ๋ฌผ ์ค‘ ํ•˜๋‚˜์—์„œ ํŽธ์ง‘๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ ๋‚ ์งœ : 2020 ๋…„ 4 ์›” 20 ์ผ

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

. ๊ตฌ๋ฌธ์€ ๋งค์šฐ ์œ ์šฉํ•˜๋ฏ€๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๋™์˜์–ด๋กœ๋งŒ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. 1.sum(2) ๋ณด๋‹ค sum(1,2) 1.sum(2) ์˜ ์žฅ์ ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ๊ทธ๊ฒƒ์€ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ˆ์™ธ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ด ๋ณ„๋„์˜ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” try..catch์—์„œ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์„ ๊ฐ์‹ธ๋Š” ๊ฒƒ ์™ธ์— ๋Œ€๋‹ต์€ ์•„๋‹ˆ์˜ค๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

1.sum (2) ์˜ˆ์ œ๋Š” ์‚ฌ์†Œํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค (๋‚˜๋Š” ๋˜ํ•œ sum (1,2)๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค).ํ•˜์ง€๋งŒ ํ•จ์ˆ˜๊ฐ€ ๊ทธ ์ž์ฒด๋กœ ex๊ฐ€ ์†Œ์œ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 1์€ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ Int๊ฐ€ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋Š” ํ•จ์ˆ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ Real ์ธ ํ•จ์ˆ˜์— ์ „๋‹ฌ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ์˜คํ•ดํ–ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์— ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋นŒ๋” ํŒจํ„ด๊ณผ ๊ฐ™์€ ํŠน์ • ๋””์ž์ธ ํŒจํ„ด์„ ์ ์šฉ ํ•  ๋•Œ ์  ํ•จ์ˆ˜๊ฐ€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ „์˜.

validate_for(name).required().gt(3) 
# vs 
gt(required(validate_for(name)), 3) 

๋‚ด๊ฐ€ ๋ฐฉ๊ธˆ ์–ธ๊ธ‰ ํ•œ ์˜ˆ์™ธ๋Š” ๋น„ ๊ฒฐ์ •์  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค (์–ด์จŒ๋“  ๋‚˜์œ ์Šต๊ด€์ž…๋‹ˆ๋‹ค). ์˜ˆ๋ฅผ ๋“ค์–ด a.sum (2) .sum (4)๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ .sum (2)๋Š” ๋•Œ๋•Œ๋กœ Int ๋Œ€์‹  String์„ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ .sum (4)๋Š” Int๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ / ๋Ÿฐํƒ€์ž„์€ ์ด๋ฏธ ๊ทธ๋Ÿฌํ•œ ์ƒํ™ฉ์„ ํ‰๊ฐ€ํ•  ์ˆ˜์žˆ์„๋งŒํผ ๋˜‘๋˜‘ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค-ํ•จ์ˆ˜ sum (sum (1, 2), 4)์„ ์ค‘์ฒฉ ํ•  ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ ์š”์ฒญ์€ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜์—ฌ ์œ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด์„ ์ ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋„ํŠธ ๊ธฐ๋Šฅ.

์‚ฌ๋žŒ๋“ค์ด ์ข‹์•„ํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜๋Š” "์œ ์ฐฝํ•œ ์ธํ„ฐํŽ˜์ด์Šค"์ž…๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ ํ•  ๋•Œ OOP API์—์„œ ์ข‹์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ some_obj.move(4, 5).scale(10).display() ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €์—๊ฒŒ๋Š” ์ด๊ฒƒ์ด ํ•จ์ˆ˜ ๊ตฌ์„ฑ์œผ๋กœ ๋” ์ž˜ ํ‘œํ˜„๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ |> ๋Š” anon์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ ์ธ์ˆ˜์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜, ์˜ˆ๋ฅผ ๋“ค์–ด some_obj |> x -> move(x, 4, 5) |> x -> scale(x, 10) |> display , ์ด๊ฒƒ์€ ๋งค์šฐ ์ถ”ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๊ฒƒ์„ ์ง€์›ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ์˜ต์…˜์€ ํ‰๊ฐ€ํ•˜๊ธฐ ์ „์— |> ๊ฐ€ LHS๋ฅผ RHS์— ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๋ฐ€์–ด ๋„ฃ์—ˆ์ง€๋งŒ ์ง€๊ธˆ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋™์ž‘์„ ๋‹ค์Œ ์‹์— ์ถ”๊ฐ€ํ•˜๋Š” ์ผ์ข…์˜ @composed ๋งคํฌ๋กœ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ์ง€์›ํ•˜๋Š” ์ฑ…์ž„์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋””์ž์ด๋„ˆ์—๊ฒŒ ๋งก๊ธธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

function move(obj, x, y)
    # move the object
end

move(x, y) = obj -> move(obj, x, y)

๋”ฐ๋ผ์„œ ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉด ๋ถ€๋ถ„ ํ•จ์ˆ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ (1 ์ธ์ˆ˜์˜ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜)์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ผ๋ฐ˜ |> ์ฒด์ธ ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ |> ์˜ ์ •์˜๋Š” ์ง€๊ธˆ ๋‹น์žฅ
๋‹น์‹ ์ด ์š”๊ตฌํ•˜๋Š” ํ–‰๋™. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2014 ๋…„ 1 ์›” 27 ์ผ ์›”์š”์ผ, Spencer Russell [email protected]
์ผ๋‹ค :

์‚ฌ๋žŒ๋“ค์ด ์ข‹์•„ํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜๋Š” "์œ ์ฐฝํ•œ ์ธํ„ฐํŽ˜์ด์Šค"์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์˜
๋ฉ”์†Œ๋“œ๊ฐ€ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ ํ•  ๋•Œ OOP API์—์„œ ๋•Œ๋•Œ๋กœ ์ข‹์œผ๋ฏ€๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
some_obj.move (4, 5) .scale (10) .display () ๊ฐ™์€ ๊ฒƒ๋“ค

์ €์—๊ฒŒ๋Š” ์ด๊ฒƒ์ด ๊ธฐ๋Šฅ ๊ตฌ์„ฑ์œผ๋กœ ๋” ์ž˜ ํ‘œํ˜„๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ
anon์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ |>๋Š” ์ธ์ˆ˜์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜, ์˜ˆ : some_obj
|> x-> move (x, 4, 5) |> x-> scale (x, 10) |> ์˜ˆ์œ ๋””์Šคํ”Œ๋ ˆ์ด
์ถ”ํ•œ.

์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๊ฒƒ์„ ์ง€์›ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ์˜ต์…˜์€ |> LHS๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ€๋ฉด
ํ‰๊ฐ€ํ•˜๊ธฐ ์ „์— RHS์— ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ์ฃผ์žฅ์ด์ง€๋งŒ,
์ง€๊ธˆ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•œ ๊ธฐ๋Šฅ์œผ๋กœ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ์ด๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ผ์ข…์˜ @composed ๋งคํฌ๋กœ์ž…๋‹ˆ๋‹ค.
๋‹ค์Œ ์‹์— ๋Œ€ํ•œ ์ผ์ข…์˜ ๋™์ž‘

์ด๋ฅผ ์ง€์›ํ•˜๋Š” ์ฑ…์ž„์„ ๋„์„œ๊ด€์œผ๋กœ ์˜ฎ๊ธธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
๋””์ž์ด๋„ˆ๊ฐ€ ์ •์˜ ํ•  ์ˆ˜์žˆ๋Š”

ํ•จ์ˆ˜ move (obj, x, y)
# ๊ฐœ์ฒด ์ด๋™
์ข…๋ฃŒ

move (x, y) = obj-> move (obj, x, y)

๋”ฐ๋ผ์„œ ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉด ๋ถ€๋ถ„ ๊ธฐ๋Šฅ ์ ์šฉ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
(1 ์ธ์ˆ˜์˜ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ) ๋‹ค์Œ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
์ •์ƒ |> ์ฒด์ธ.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ Gi tHub์—์„œ ํ™•์ธํ•˜์„ธ์š” .https : //github.com/JuliaLang/julia/issues/5571#issuecomment -33408448
.

ssfrr ๋‚˜๋Š” ๋‹น์‹ ์ด ์ƒ๊ฐํ•˜๋Š” ๋ฐฉ์‹์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” |> ํ•จ์ˆ˜ ๊ตฌ์„ฑ์„ ์•Œ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ๋น„์Šทํ•œ ๋…ผ์˜๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค [https://github.com/JuliaLang/julia/issues/4963].

kmsquire ํ˜ธ์ถœ ํ•จ์ˆ˜์— ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ˜„์žฌ ํ•จ์ˆ˜ ๊ตฌ์„ฑ์„ ํ™•์žฅํ•˜๋Š” ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. some_obj |> move(4, 5) |> scale(10) |> display ๊ธฐ๋ณธ ์ง€์›์€ ํ์‡„๊ฐ€ ํ•˜๋‚˜ ์ค„์–ด๋“œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋งŒ ssfrr์ด ์ œ์•ˆํ•œ ๊ฒƒ์€ ํ˜„์žฌ๋กœ์„œ๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ด๋ฉฐ ์ถ”๊ฐ€ ์ด์ ์œผ๋กœ ๊ตฌํ˜„๋˜๋Š” ๊ฒฝ์šฐ ํ™•์žฅ ๋œ ๊ธฐ๋Šฅ ๊ตฌ์„ฑ ๊ธฐ๋Šฅ๊ณผ ์•ž์œผ๋กœ ํ˜ธํ™˜๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์‹ ์†ํ•œ ๋‹ต๋ณ€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค :)

์‹ค์ œ๋กœ @ssfrr ์€ ์ •ํ™•ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ๊ฒƒ์€ ์Šค๋ ˆ๋”ฉ ๋งคํฌ๋กœ (์˜ˆ : http://clojuredocs.org/clojure_core/clojure.core/-%3E)์ž…๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ @-> @->> @-? >>๋Š” Julia์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ตฌ๋ฌธ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์˜ˆ, ์ €๋Š” ์ค‘์œ„ ๋งคํฌ๋กœ๊ฐ€ ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œํ•œ ์‚ฌํ•ญ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๊ธฐ์—๋Š” ๋งคํฌ๋กœ์— ์ต์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@ssfrr ์˜ ์ž‘์„ฑ ๋งคํฌ๋กœ์—์„œ ์ด๊ฒƒ์ด ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ์ด๊ฒƒ์€ ์กฐ๊ธˆ ๋” ๋ช…ํ™• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import Base.Meta.isexpr
_ispossiblefn(x) = isa(x, Symbol) || isexpr(x, :call)

function _compose(x)
    if !isa(x, Expr)
        x
    elseif isexpr(x, :call) &&    #
        x.args[1] == :(|>) &&     # check for `expr |> fn`
        length(x.args) == 3 &&    # ==> (|>)(expr, fn)
        _ispossiblefn(x.args[3])  #

        f = _compose(x.args[3])
        arg = _compose(x.args[2])
        if isa(f, Symbol)
            Expr(:call, f, arg) 
        else
            insert!(f.args, 2, arg)
            f
        end
    else
        Expr(x.head, [_compose(y) for y in x.args]...)
    end
end

macro compose(x)
    _compose(x)
end
julia> macroexpand(:(<strong i="11">@compose</strong> x |> f |> g(1) |> h('a',"B",d |> c(fred |> names))))
:(h(g(f(x),1),'a',"B",c(d,names(fred))))

์ด |> ๊ตฌ๋ฌธ์„ ๊ฐ€์ง€๊ฒŒ๋œ๋‹ค๋ฉด ์ง€๊ธˆ๋ณด๋‹ค ๋” ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ์™ผ์ชฝ ๋Œ€์‹  ์˜ค๋ฅธ์ชฝ์— ์ ์šฉํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ•ญ์ƒ ์–ด๋งˆ ์–ด๋งˆํ•œ ๊ตฌ๋ฌธ ๋‚ญ๋น„์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

+1. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ํŒŒ์ดํ”„ ๋ผ์ธ์ด์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋ถ„์„์— Julia๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ Python์˜ Pandas๋Š” df.groupby ( "something"). aggregate (sum) .std (). reset_index ()์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๊ธฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. .

: +1 : ์ด๊ฒƒ์„ ์œ„ํ•ด.

(์ด๋ฏธ .. ์ค‘์œ„ ์—ฐ์‚ฐ์ž ( obj..move(4,5)..scale(10)..display )์˜ ์‚ฌ์šฉ์„ ์ œ์•ˆ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ |> ์—ฐ์‚ฐ์ž๋„ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค)

๋˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅ์„ฑ์€ ์ปค๋ง์„ ์œ„ํ•ด ๊ตฌ๋ฌธ ์„คํƒ•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
f(a,~,b) x->f(a,x,b) ๋ฒˆ์—ญ ์ค‘์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด |> ๋Š” ํ˜„์žฌ ์˜๋ฏธ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ, ๊ทธ๊ฒƒ์€ ์–ด๋–ค ํ‘œํ˜„์„ ํ•จ์ˆ˜๋กœ ๋ฐ”๊พธ๋Š” ์ •๋ง ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Clojure์˜ ์ต๋ช… ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด๊ณผ ๊ฐ™์€ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ #(% + 5) ๋Š” x -> x + 5 ์•ฝ์นญ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋˜ํ•œ % 1, % 2 ๋“ฑ์˜ ์—ฌ๋Ÿฌ ์ธ์ˆ˜๋กœ ์ผ๋ฐ˜ํ™”๋˜๋ฏ€๋กœ #(myfunc(2, %1, 5, %2) ๋Š” x, y -> myfunc(2, x, 5, y) ์•ฝ์นญ์ž…๋‹ˆ๋‹ค.

๋ฏธํ•™์ ์œผ๋กœ๋Š” ๊ตฌ๋ฌธ์ด ์ฝ๊ธฐ ์‰ฌ์šด ์ค„๋ฆฌ์•„์— ์ž˜ ๋งž์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ์•„์ด๋””์–ด๋Š” ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

์œ„์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  % ๋Œ€์‹  @malmaud 's ๋ฌผ๊ฒฐํ‘œ๋กœ ์ „ํ™˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

some_obj |> move(~, 4, 5) |> scale(~, 10) |> display

๊ฝค ๋ฉ‹์ ธ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ฒซ ๋ฒˆ์งธ ์ฃผ์žฅ์— ํŠน๋ณ„ํ•œ ๋Œ€์šฐ๋ฅผ์ฃผ์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์—์„œ ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹จ์ ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ธฐํ˜ธ๋ฅผ ์ทจํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์ด๊ฒƒ์€ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ์žฅ์†Œ์ด๋ฏ€๋กœ ๋Œ€์ฒด๋Š” ๋งคํฌ๋กœ์˜ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

~ ๋กœ๋Š” ์ด๋ฏธ Julia์˜ ํ‘œ์ค€ ํ•จ์ˆ˜์ด๋ฏ€๋กœ์ด๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Scala๋Š” _ ์œผ๋กœ์ด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ‘œํ˜„์‹์˜ ์–ด๋–ค ๋ถ€๋ถ„์ด ์ต๋ช… ํ•จ์ˆ˜์ธ์ง€ ์•Œ์•„๋‚ด๋Š” ๋ฐ๋Š” ์ค‘์š”ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด :

map(f(_,a), v)

์ด๊ฒƒ์€ ์–ด๋Š ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

map(f(x->x,a), v)
map(x->f(x,a), v)
x->map(f(x,a), v)

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

๋งž์•„์š”, ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ๋‚˜๊ฐ€์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ชจํ˜ธ์„ฑ์— ๋Œ€ํ•œ ๋‹น์‹ ์˜ ์š”์ ์ด ๋ณด์ž…๋‹ˆ๋‹ค. Clojure์—์„œ๋Š” ์ „์ฒด ํ‘œํ˜„์‹์ด #(...) ๋กœ ๋ž˜ํ•‘๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋ชจํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ค„๋ฆฌ์•„์—์„œ _๋ฅผ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ๊ฐ€์น˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ด€์šฉ์ ์ž…๋‹ˆ๊นŒ? somefunc ๊ฐ€ ๋‘ ๊ฐœ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ฒซ ๋ฒˆ์งธ ๊ฐ’๋งŒ ์›ํ•˜๋Š” ๊ฒฝ์šฐ x, _ = somfunc() ์ฒ˜๋Ÿผ?

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋ณด๊ฐ„๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ๋ฒ•์„ ๊ฐ€์ง„ ๋งคํฌ๋กœ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

some_obj |> @$(move($, 4, 5)) |> @$(scale($, 10)) |> display

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๊ทธ ์‹œ์ ์—์„œ ๊ฝค ์‹œ๋„๋Ÿฌ์›Œ์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  @$(move($, 4, 5)) ๋Š” ๊ธฐ์กด ๊ตฌ๋ฌธ x -> move(x, 4, 5) ๋ณด๋‹ค ๋” ์˜ˆ์˜๊ณ  ๋” ๋ช…์‹œ์ ์ธ IMO๋ณด๋‹ค ์šฐ๋ฆฌ์—๊ฒŒ ์•„๋ฌด๊ฒƒ๋„์ฃผ์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ค‘์œ„ ๋งคํฌ๋กœ์˜ ์ข‹์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. # 4498๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์–ด๋–ค ๊ทœ์น™์ด ํ•จ์ˆ˜๋ฅผ ๋งคํฌ๋กœ์—๋„ ์ ์šฉ๋˜๋Š” ์ค‘์œ„๋กœ ์ •์˜ํ•œ๋‹ค๋ฉด, ์Šค๋ ˆ๋”ฉ ๋™์ž‘์„ ๊ฐ–๋Š” @-> ๋˜๋Š” @|> ๋งคํฌ๋กœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Ya, ๋‚˜๋Š” infix ๋งคํฌ๋กœ ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•˜์ง€๋งŒ, inplace ๋งคํฌ๋กœ๋ฅผ์œ„ํ•œ ์ „์ฒด ์‹œ์Šคํ…œ์„ ๊ฐ–๋Š” ๋Œ€์‹  ์ƒˆ๋กœ์šด ์—ฐ์‚ฐ์ž๋ฅผ์ด ์šฉ๋„๋กœ ๋„์ž… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด
some_obj ||> move($,4,5) ||> scale($, 10) |> disp
์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ |> ํ•˜๋˜
x |> f ์•”์‹œ ์ ์œผ๋กœ x |> f($) ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.
some_obj |> scale($,10) |> disp

์—ฌ๋Ÿฌ๋ถ„, ์ •๋ง๋ณด๊ธฐ ํ‰ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค : |> ||> ๋“ฑ๋“ฑ.
์ง€๊ธˆ๊นŒ์ง€ ์ค„๋ฆฌ์•„์˜ ๊ตฌ๋ฌธ์ด ๋„ˆ๋ฌด ๋ช…ํ™•ํ•ด์„œ ์œ„์—์„œ ๋…ผ์˜ํ•œ ๊ฒƒ๋“ค์ด ๋‹ค๋ฅธ ๊ฒƒ๊ณผ ๋น„๊ตํ•  ๋•Œ ๊ทธ๋ ‡๊ฒŒ ์˜ˆ์˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

Scala์—์„œ๋Š” ์•„๋งˆ๋„ ์ตœ์•…์˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ธ์–ด.

์ œ์•ˆ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š” ๋‹ค๋‹ˆ ์œ ๊ฐ์ž…๋‹ˆ๋‹ค, Anton. ๋Œ€์ฒด ์ œ์•ˆ์„ํ•œ๋‹ค๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ค ๋ฏธ์•ˆ ํ•ด์š”, ๋ถˆ์นœ์ ˆํ•˜๊ฒŒํ•˜๋ ค๋Š” ๊ฒŒ ์•„๋‹ˆ์—์š”. ๊ทธ๋ฆฌ๊ณ  ์˜ˆ-์ œ์•ˆ์—†๋Š” ๋น„ํ‰๊ฐ€
์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ์ €๋Š” ์–ธ์–ด๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผํ•™์ž๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—
๋ฌด์—‡์„ ์ œ์•ˆํ•ด์•ผํ• ์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ถ€ ์–ธ์–ด์˜ ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” "์–ธ์–ด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ณผํ•™์ž"๋ผ๋Š” ๋ฌธ๊ตฌ๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. Matlab์— ์ง€์นœ ์ˆ˜์น˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์›…์žฅํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

๊ฑฐ์˜ ๋ชจ๋“  ์–ธ์–ด๊ฐ€ OO ์–ธ์–ด๋กœ . ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ๋” ๊ธฐ๋Šฅ์ ์ธ ์–ธ์–ด (Haskell, Scala, Mathematica ๋“ฑ)์—์„œ ํ•ด๋‹น ๋ชฉ์ ์„์œ„ํ•œ ํŠน์ˆ˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ›„์ž์˜ ์–ธ์–ด์—๋„ ์ต๋ช… ํ•จ์ˆ˜ ์ธ์ˆ˜์— ๋Œ€ํ•œ ํŠน์ˆ˜ ๊ตฌ๋ฌธ์ด ์žˆ์ง€๋งŒ Julia๊ฐ€ ์‹ค์ œ๋กœ ๊ฑฐ๊ธฐ์— ๊ฐˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” Spencer์˜ ์ œ์•ˆ์— ๋Œ€ํ•œ์ง€์ง€๋ฅผ ๋ฐ˜๋ณต ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค- x |> f(a) get translate into f(x, a) , ์ด๋Š” do ๋ธ”๋ก์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ a์˜ ์ฒซ ๋ฒˆ์งธ ์ฃผ์žฅ์ด ๊ณตํ†ต ์ฃผ์ œ๋ฅผ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋Š” ๊ตฌ๋ฌธ ์„คํƒ• ๋ชฉ์ ์„ ์œ„ํ•ด Julia์—์„œ ํŠน๊ถŒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.) x |> f ๋Š” x |> f() ์•ฝ์ž๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ณ  ์ƒˆ๋กœ์šด ์—ฐ์‚ฐ์ž๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ•จ์ˆ˜ ์ฒด์ธ์„ ์›ํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋ฉฐ ๊ธฐ์กด Julia ๋””์ž์ธ ์›์น™์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์ด๊ฒƒ์ด ์ตœ๊ณ ์˜ ์ œ์•ˆ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋œ ๋ฌธ์ œ๋Š” I / O ๋ฆฌ๋””๋ ‰์…˜ ๋˜๋Š” ๊ธฐํƒ€ ์‚ฌ์šฉ์ž ์ง€์ • ๋ชฉ์ ๊ณผ ๊ฐ™์€ ๊ฒƒ์— ๋Œ€ํ•ด |> ์ •์˜๋ฅผ ๋ฐฐ์ œํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Julia์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ์ž๋Š” ์—ฌ๊ธฐ์— ์–ธ๊ธ‰ ๋œ ๊ฒƒ์ฒ˜๋Ÿผ N-1 ๊ฐœ์˜ ์ธ์ˆ˜๊ฐ€ ์ฃผ์–ด ์กŒ์„ ๋•Œ 1 ๊ฐœ์˜ ์ธ์ˆ˜์˜ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก N ์ธ์ˆ˜์˜ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜์—ฌ |> ๋ฅผ ์‚ฌ์šฉํ•œ ์—ฐ๊ฒฐ์„ ์ด๋ฏธ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ•จ์ˆ˜๊ฐ€ ๊ฐ€๋ณ€ ๊ฐœ์ˆ˜์˜ ์ธ์ˆ˜๋ฅผ ์ง€์›ํ•˜๋„๋ก _ ์›ํ•œ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ์ธ์ˆ˜ ์ฑ„์šฐ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@JeffBezanson , ์ค‘์œ„ ๋งคํฌ๋กœ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด์ด ์—ฐ์‚ฐ์ž๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ์ด๋ฐ์˜ฌ๋กœ๊ธฐ ์  ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ์•„์‹ญ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์‹คํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ?

์ตœ๊ทผ์— ~ ๋Š” ์ธ์ˆ˜์™€ ํ˜ธ์ถœ์„ ์ธ์šฉํ•˜๋„๋ก ํŠน์ˆ˜ ์ผ€์ด์Šค๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ @~ ๋งคํฌ๋กœ. |> ๋„ ๊ฐ™์€ ์ผ์„ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก , ๋ช‡ ๋‹ฌ ์•ˆ์— ๋ˆ„๊ตฐ๊ฐ€๋Š” <| ๋ฅผ ์š”๊ตฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2014 ๋…„ 2 ์›” 6 ์ผ ๋ชฉ์š”์ผ, Spencer Russell [email protected]
์ผ๋‹ค :

์ฐธ๊ณ ๋กœ. ํŠน์ˆ˜ ํ•จ์ˆ˜ ์ฒด์ธ ๊ตฌ๋ฌธ์€ ์•„๋‹ˆ์ง€๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์™ผ์ชฝ์˜ ํ•จ์ˆ˜๊ฐ€ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๊ทธ๋ ‡๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ์ž๊ฐ€ํ•ด์•ผ ํ•  ์ผ์ž…๋‹ˆ๋‹ค.
์˜๋„์ ์œผ๋กœ.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Julia์—์„œ ๋„์„œ๊ด€ ๊ฐœ๋ฐœ์ž๋Š” ์ด๋ฏธ ์—ฐ๊ฒฐ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
|> ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด N ์ธ์ˆ˜์˜ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜์—ฌ
์—ฌ๊ธฐ์— ์–ธ๊ธ‰ ๋œ๋Œ€๋กœ N-1 ์ธ์ˆ˜๊ฐ€ ์ฃผ์–ด ์กŒ์„ ๋•Œ 1 ๊ฐœ์˜ ์ธ์ˆ˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค : https://github.com/JuliaLang/julia/issues/5571#issuecomment -33408448

๊ธฐ๋Šฅ์ด ์ง€์›ํ•˜๊ธฐ๋ฅผ _ ์› _ํ•œ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ฐ€๋ณ€ ๊ฐœ์ˆ˜์˜ args, ๊ทธ๋ž˜์„œ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ์—ฐ์‚ฐ์ž๊ฐ€
๋…ผ์ฆ์€ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@JeffBezanson https://github.com/JeffBezanson , ์ด๊ฒƒ์€
์ค‘์œ„ ๋งคํฌ๋กœ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด ์—ฐ์‚ฐ์ž๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€
์ด๋ฐ์˜ฌ๋กœ๊ธฐ ์  ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ์•„์‹ญ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์‹คํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ?

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅ์„ ๋ณด๋‚ด๊ฑฐ๋‚˜ Gi tHub์—์„œ ํ™•์ธํ•˜์„ธ์š” .https : //github.com/JuliaLang/julia/issues/5571#issuecomment -34374347
.

๋งž์Šต๋‹ˆ๋‹ค, ์ €๋Š” ์ด๊ฒƒ์ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€๋˜๋Š” ๊ฒƒ์„ ํ™•์‹คํžˆ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. API ๋””์ž์ธ์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€ ์•Š์œผ๋ฉฐ, ๋ช…ํ™•ํ•˜๊ฒŒ ํ•  ์œ ํ˜• ์ฃผ์„์ด์žˆ๋Š” ๊ฒฝ์šฐ ๋ณ€์ˆ˜ ์ธ์ˆ˜ ์ œํ•œ์กฐ์ฐจ๋„ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

function move(obj::MyType, x, y, args...)
    # do stuff
    obj
end

move(args...) = obj::MyType -> move(obj, args...)

์ด ๋™์ž‘์€ ๋‘ ๋ฒˆ์งธ ์„ ์–ธ์„ ์ฒ˜๋ฆฌํ•˜๋Š” @composable ๋งคํฌ๋กœ์— ์˜ํ•ด ์ฒ˜๋ฆฌ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ค‘์œ„ ๋งคํฌ๋กœ ์•„์ด๋””์–ด๋Š” # 4498์—์„œ ๋…ผ์˜๋˜๋Š” ์ค‘์œ„ ํ•จ์ˆ˜ ์„ ์–ธ๊ณผ ํ†ตํ•ฉ๋˜๋Š” ์ƒํ™ฉ์—์„œ ์ €์—๊ฒŒ ๋งค๋ ฅ์ ์ž…๋‹ˆ๋‹ค.

Julia ์ œ์ž‘์ž๊ฐ€ ๊ฐ์ฒด๊ฐ€ ์ž์‹ ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜๋„๋ก ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ ๊ฒฐ์ •์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์–ด๋””์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ ๊ฒฐ์ • ๋’ค์— ์–ด๋–ค ์ƒ๊ฐ๊ณผ ์ด๋ก ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@meglio ๋Š” ์ผ๋ฐ˜์ ์ธ ์งˆ๋ฌธ์— ๋” ์œ ์šฉํ•œ ๊ณณ์€ ๋ฉ”์ผ ๋ง๋ฆฌ์ŠคํŠธ ๋˜๋Š” StackOverflow julia-lang ํƒœ๊ทธ์ž…๋‹ˆ๋‹ค. ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ์ด์ „ ํ† ๋ก ์€ Stefan์˜ ์ด์•ผ๊ธฐ ์™€ ์‚ฌ์šฉ์ž ๋ฐ ๊ฐœ๋ฐœ์ž ๋ชฉ๋ก์˜ ์•„์นด์ด๋ธŒ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋‚˜์—๊ฒŒ ๊ฐ€์žฅ ์ง๊ด€์  ์ธ ๊ฒƒ์€ ์ž๋ฆฌ ํ‘œ์‹œ์ž๋ฅผ
ํด๋กœ์ €์˜ as-> ๋งคํฌ๋กœ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋ ค๋Š” ์ผ๋ จ์˜ ํ•ญ๋ชฉ์—์„œ ์ด์ „ ํ‘œํ˜„์‹์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฑด:

<strong i="8">@as</strong> _ begin
    3+3
    f(_,y)
    g(_) * h(_,z)
end

๋‹ค์Œ์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค.

g(f(3+3,y)) * h(f(3+3,y),z)

๋‹ค์Œ ์ค„์˜ ๋ฐ‘์ค„ ๊ตฌ๋ฉ์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ์ด์ „ ์ค„์˜ "๋“œ๋กญ ๋‹ค์šด"์‹์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฒฐ์Šน์ „ ์ฃผ๊ฐ„ ๋ฏธ๋ฃจ๋Š” ๋™์•ˆ ์ง€๋‚œ ๋ถ„๊ธฐ์™€ ๊ฐ™์€ ์ž‘์€ ๊ฒƒ์„ ์Šค์ผ€์น˜ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

|> ์‚ฌ์šฉํ•˜์—ฌ oneliner ๋ฒ„์ „์„ ์ง€์›ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

<strong i="19">@as</strong> _ 3+3 |> f(_,y) |> g(_) * h(_,z)

@porterjamesj , ๋‚˜๋Š” ๊ทธ ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค!

๋‚˜๋Š” ๋™์˜ํ•œ๋‹ค; ๊ทธ๊ฒƒ์€ ๊ฝค ์ข‹๊ณ  ๋งค๋ ฅ์ ์ธ ์ผ๋ฐ˜์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
2014 ๋…„ 2 ์›” 7 ์ผ ์˜คํ›„ 3:19์— "Kevin Squire" [email protected]์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

@porterjamesj https://github.com/porterjamesj , ๊ทธ ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค !

์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ Gi tHub์—์„œ ํ™•์ธ ํ•˜์„ธ์š”.
.

์ €๋Š” @porterjamesj ์˜ ์•„์ด๋””์–ด๊ฐ€ ์‹ ์„ ํ•œ ๊ณต๊ธฐ๋ฅผ

Julia์—์„œ๋Š” obj.method(args...) ํŒจํ„ด์„ ๋งŽ์ด ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  method(obj, args...) ํŒจํ„ด์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Express์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€์—†๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ ์ฒด์ด๋‹์˜ ๋ชฉ์ . ( jQuery ๋Š” ์ผ์ด๋ฉฐ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์—์„œ ํ™˜์ƒ์ ์ž…๋‹ˆ๋‹ค). ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์— ํƒ€์ดํ•‘์„ ๋งŽ์ด ์ €์žฅํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ํ•จ์ˆ˜ ์‚ฌ์ด์— "ํŒŒ์ดํ”„"๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์€ ์ •๋ง ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

clojure์˜ -> ๋ฐ ->> ๋Š” ์œ„์˜ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์— ๋ถˆ๊ณผํ•˜๊ณ  ์ƒ๋‹นํžˆ ์ผ๋ฐ˜์ ์ด๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š”์ด๋ฅผ ๋งค์šฐ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡์„ ๋ถ€๋ฅผ์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์€ ์•ฝ๊ฐ„ ๊นŒ๋‹ค ๋กญ์Šต๋‹ˆ๋‹ค. @threadfirst ๋ฐ @threadlast ?

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋งคํฌ๋กœ๋ผ๋Š” ์ƒ๊ฐ๋„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋”ฐ๋ฅด๋Š” ํ™•์žฅ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์œผ๋ฉด ๋” ์ข‹์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

tmp = 3+3; tmp = f(tmp); return h(tmp, z)

๋™์ผํ•œ ์ž‘์—…์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ํ˜ธ์ถœ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด? (์•„๋งˆ๋„ ์ด๋ฏธ @porterjamesj ์˜ ์•„์ด๋””์–ด์— ์•”์‹œ ์ 

๋˜ ๋‹ค๋ฅธ ์ œ์•ˆ : ๋งคํฌ๋กœ๊ฐ€ ๋ฐ”๋กœ ๊ฐ€๊ธฐ f ๋ฅผ f(_) ํ•˜๊ณ  f(y) ๋ฅผ f(_,y) ์žˆ์Šต๋‹ˆ๊นŒ? ๋„ˆ๋ฌด ๋งŽ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ž๋ฆฌ ํ‘œ์‹œ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์˜ต์…˜์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ... (๋‹จ, ๋ฐ”๋กœ ๊ฐ€๊ธฐ๋Š” g(_) * h(_,z) ์™€ ๊ฐ™์€ ํ‘œํ˜„์‹์ด ์•„๋‹Œ ๋‹จ๋… ํ•จ์ˆ˜ ํ˜ธ์ถœ์—์„œ๋งŒ ํ—ˆ์šฉ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค

@cdsousa ์—ฌ๋Ÿฌ ํ†ตํ™”๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ ์ž…๋‹ˆ๋‹ค. clojure ๊ตฌํ˜„ ์€์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ˆœ์ฐจ let ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. let ์˜ ์„ฑ๋Šฅ์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด @as ๋งคํฌ๋กœ๋Š” ์ค„ ๋ฐ”๊ฟˆ๊ณผ => ๋ฅผ ๋ถ„ํ•  ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์ฒด ํ‘œํ˜„์‹๊ณผ ๋Œ€์ฒด ํ•  ํ•ญ๋ชฉ์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๊นŒ?

let ์„ฑ๋Šฅ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋ณ€์ˆ˜ ํ• ๋‹น๋งŒํผ ๋น ๋ฅด๋ฉฐ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.

๋‚ด ์žฅ๋‚œ๊ฐ ๊ตฌํ˜„์˜ @ssfrr ์€ ํŒŒ์„œ๊ฐ€ ์‚ฝ์ž…ํ•˜๋Š” ๋ชจ๋“ 

@cdsousa :

๋˜ ๋‹ค๋ฅธ ์ œ์•ˆ : ๋งคํฌ๋กœ๊ฐ€ ๋ฐ”๋กœ ๊ฐ€๊ธฐ f ๋ฅผ f(_) ํ•˜๊ณ  f(y) ๋ฅผ f(_,y)

f ~ f(_) ๊ฐ€) ์ดํ•ด๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋กœ, ํ•ฉ๋ฆฌ์ ์ธ ์‚ฌ๋žŒ๋“ค์ด f(_,y) ๋˜๋Š” f(y,_) ๊ฐ€ ๋” ์ž์—ฐ ์Šค๋Ÿฝ๋‹ค๊ณ  ์ฃผ์žฅ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ„์น˜๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

clojure์˜ -> ๋ฐ ->> ๋Š” ์œ„์˜ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์— ๋ถˆ๊ณผํ•˜๊ณ  ์ƒ๋‹นํžˆ ์ผ๋ฐ˜์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š”์ด๋ฅผ ๋งค์šฐ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡์„ ๋ถ€๋ฅผ์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์€ ์•ฝ๊ฐ„ ๊นŒ๋‹ค ๋กญ์Šต๋‹ˆ๋‹ค. @threadfirst ๋ฐ @threadlast ?

f(_,y...) ๋˜๋Š” f(y..., _) ์œ„์น˜๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ์ง€์ •ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ƒ๋‹นํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๊ตฌ๋ฌธ (๋ฐ ์—ฐ์‚ฐ์ž)์€ Clojure์—์„œ ์˜๋ฏธ๊ฐ€ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์ถ”๊ฐ€ ์—ฐ์‚ฐ์ž๊ฐ€ ์—†์œผ๋ฉฐ ์ถ”๊ฐ€ ๋งคํฌ๋กœ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋œ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด @as ๋งคํฌ๋กœ๋Š” ์ค„ ๋ฐ”๊ฟˆ๊ณผ => ๋ฅผ ๋ถ„ํ•  ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์ฒด ํ‘œํ˜„์‹๊ณผ ๋Œ€์ฒด ํ•  ํ•ญ๋ชฉ์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๊นŒ?

|> ๋Š” ์ด๋ฏธ ํŒŒ์ดํ”„ ๋ผ์ด๋‹์— ์‚ฌ์šฉ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„ํ•  ์ง€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ž์—ฐ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์•„์‹œ๋‹ค์‹œํ”ผ Lazy.jl์— ์Šค๋ ˆ๋”ฉ ๋งคํฌ๋กœ๊ฐ€ ๊ตฌํ˜„๋˜์–ด์žˆ์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@>> range() map(x->x^2) filter(iseven)

์žฅ์ ์€ ์–ธ์–ด ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ํ•œ ์ค„ ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์•ฝ๊ฐ„ ์ถ”์•…ํ•ฉ๋‹ˆ๋‹ค.

๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด Lazy.jl์—์„œ @as> ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Lazy.jl์—๋Š” ์ด์ œ @as ๋งคํฌ๋กœ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Monads.jl์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค (Haskell๊ณผ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ) (์ฐธ๊ณ  : ํ˜„์žฌ Julia ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์—…๋ฐ์ดํŠธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค). ํ•˜์ง€๋งŒ ๊ทธ๋ƒฅ ์ธ์ˆ˜ ์Šค๋ ˆ๋”ฉ์„์œ„ํ•œ ํŠน์ˆ˜ ๋ฒ„์ „์ด ์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๊ฐ–๋Š” ์„ฑ๋Šฅ์ƒ์˜ ํ•จ์ •์„ ํ”ผํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Lazy.jl์€ ๋งค์šฐ ๋ฉ‹์ง„ ํŒจํ‚ค์ง€์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ์ ๊ทน์ ์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Base์— ์žˆ์–ด์•ผํ•˜๋Š” ์„ค๋“๋ ฅ์žˆ๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ•จ์ˆ˜ ์ฒด์ธ์€ ์—ฌ๋Ÿฌ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์™€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?
์˜ˆ๋ฅผ ๋“ค์–ด ์—ฐ๊ฒฐ์˜ ๊ฒฐ๊ณผ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

function foo(a,b)
    a+b, a*b   # x,y respectively
end

๊ทธ๋ฆฌ๊ณ  bar(x,z,y) = x * z - y ์€?

bar(_1,z,_2) ์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋‹ค๋ฅธ ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด :

data = [2.255, 3.755, 6.888, 7.999, 9.001]

๊น”๋”ํ•œ ์ž‘์„ฑ ๋ฐฉ๋ฒ• : log(sum(round(data))) : data|>round|>sum|>log
ํ•˜์ง€๋งŒ 2 ์ง„๋ฒ• ๋กœ๊ทธ๋ฅผ ๋งŒ๋“ค๊ณ  ์†Œ์ˆ˜์  3 ์ž๋ฆฌ๋กœ ๋ฐ˜์˜ฌ๋ฆผํ•˜๋ ค๋ฉด
๊ทธ๋Ÿฌ๋ฉด ์ฒซ ๋ฒˆ์งธ ํ˜•์‹ ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
log(2,sum(round(data,3)))

๊ทธ๋Ÿฌ๋‚˜ ์ด์ƒ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.
data|>round(_,3)|>sum|>log(2,_)
(๋˜๋Š” ์œ ์‚ฌ)

์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ด์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ํ”„๋กœํ†  ํƒ€์ž…์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/oxinabox/Pipe.jl

@gregid ์˜ ์š”์ ์„ ํ•ด๊ฒฐ
๋˜ํ•œ ์ธ์ˆ˜๋ฅผ ํ™•์žฅ ํ•  ํ•„์š”์„ฑ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@ one-more-minute์˜ Lazy.jl ์Šค๋ ˆ๋”ฉ ๋งคํฌ๋กœ์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ๊ฐ€๋…์„ฑ (๊ฐœ์ธ ์„ ํ˜ธ)์„ ์œ„ํ•ด |> ๊ธฐํ˜ธ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ฒœ์ฒœํžˆ ๊พธ๋Ÿฌ๋ฏธ๋กœ ๋งŒ๋“ค ๊ฒŒ์š”, ์•„๋งˆ ์–ธ์  ๊ฐ€๋Š”

๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

data |>   x -> round(x,2)  |> sum |>  x -> log(2,x)

log(2,sum(round(data,2))) ๋ณด๋‹ค ๊ธธ์ง€๋งŒ์ด ํ‘œ๊ธฐ๋ฒ•์€ ๋•Œ๋•Œ๋กœ ๊ฐ€๋…์„ฑ์— ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.

๋‚˜์˜์ง€ ์•Š์€ @shashi , ๊ทธ๊ฒƒ์„ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๋‹ค,
๋‚˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋„ˆ๋ฌด ์žฅํ™ฉํ•ด์„œ ์‰ฝ๊ฒŒ ์ฝ์„ ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

https://github.com/oxinabox/Pipe.jl ์ด์ œ @gregid ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
_[1] ๋ฐ _[2] ๋‘˜ ๋‹ค ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ ๋Œ€์ฒด๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜์—ฌ์ด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š์€ ๊ฒƒ์€ ๊ฐ€์žฅ ๋ฐ”๋žŒ์งํ•œ ํ–‰๋™์ž…๋‹ˆ๋‹ค.

์™ธ๋ถ€์ธ์œผ๋กœ์„œ ์ €๋Š” ํŒŒ์ดํ”„ ๋ผ์ธ ์šด์˜์ž๊ฐ€ F #์˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์ ์šฉํ•จ์œผ๋กœ์จ ์ด์ต์„ ์–ป์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋ฌผ๋ก  F #์—๋Š” ์ปค๋ง ๊ธฐ๋Šฅ์ด ์žˆ์ง€๋งŒ์ด๋ฅผ ํ•„์š”๋กœํ•˜์ง€ ์•Š๋„๋ก ๋ฐฑ์—”๋“œ์—์„œ ์ผ๋ถ€ ๋งˆ๋ฒ•์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ต์‹ฌ ์–ธ์–ด๊ฐ€ ์•„๋‹Œ ์—ฐ์‚ฐ์ž์˜ ๊ตฌํ˜„์ฒ˜๋Ÿผ.

๊ทธ๋Ÿฌ๋ฉด [1:10] |> map(e -> e^2) ๊ฒฐ๊ณผ๊ฐ€ [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] ๋ฉ๋‹ˆ๋‹ค.

๋˜๋Œ์•„ ๋ณด๋ฉด @ssfrr ์ด ์ด๊ฒƒ์„ ์•”์‹œํ–ˆ์ง€๋งŒ, obj ์ธ์ˆ˜๋Š” ๋‚ด ์˜ˆ์ œ์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ map ์ž๋™์œผ๋กœ ์ฃผ์–ด ์ง€๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•จ์ˆ˜๋ฅผ ์ •์˜ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์ง€์›ํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๊ฒŒ ๋ฌด์Šจ ๋œป์ด๋ผ๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๊นŒ?

2015 ๋…„ 6 ์›” 5 ์ผ ์˜คํ›„ 5์‹œ 22 ๋ถ„์— H-225 [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

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

์ด๋ ‡๊ฒŒํ•˜๋ฉด [1:10] |> map (e-> e ^ 2) ๊ฒฐ๊ณผ๊ฐ€ [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]์ด๋ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋„ˆ๋ฌด ์žฅํ™ฉํ•˜์ง€ ์•Š๊ณ  ๋ฉ‹์ง€๊ณ  ๋ถ„๋ช…ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ result = map (sqr, [1:10])์„ ์“ธ ์ˆ˜ ์žˆ์ง€๋งŒ ์™œ ํŒŒ์ดํ”„ ๋ผ์ธ ์—ฐ์‚ฐ์ž๊ฐ€์žˆ๋Š” ๊ฒƒ์ผ๊นŒ ์š”?
๋‚ด๊ฐ€ ๋†“์นœ ๊ฒŒ์žˆ๋Š” ๊ฑด๊ฐ€?

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.

์•ˆ๋…•ํ•˜์„ธ์š”.
๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฐ์‚ฐ์ž๋Š” ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์™€ ๊ฐ™์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  • x |> y(f) = y(x, f)
  • x |> y(f) = y(f, x)

์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ํ•ด๋‹น ํŒจํ„ด์œผ๋กœ ์„ ํƒ๋˜๋Š” ์œ„์˜ ํ•ญ๋ชฉ์— ๋”ฐ๋ผ ์ฒซ ๋ฒˆ์งธ ๋˜๋Š” ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ํŒจํ„ด์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ map ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ map ๋Š” map(func, data) ๋˜๋Š” map(data, func) ์ž…๋‹ˆ๋‹ค.

๋” ๋ช…ํ™•ํ•ฉ๋‹ˆ๊นŒ?

Lazy.jl์€ ๋งค์šฐ ๋ฉ‹์ง„ ํŒจํ‚ค์ง€์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ์ ๊ทน์ ์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Base์— ์žˆ์–ด์•ผํ•˜๋Š” ์„ค๋“๋ ฅ์žˆ๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ด๊ฒƒ์ด ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์งˆ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๊ธฐ๋ณธ์—์„œ ๋ฐ”๋žŒ์งํ•œ ์ด์œ ๋Š” 2 ๋ฐฐ์ž…๋‹ˆ๋‹ค.

1.) ์šฐ๋ฆฌ๋Š” ํŒŒ์ดํ”„ ๋ผ์ด๋‹์„ Julian Way๋กœ ์žฅ๋ คํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค-๋” ์ฝ๊ธฐ ์‰ฝ๋‹ค๊ณ  ์ฃผ์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
2.) Lazy.jl, FunctionalData.jl ๋ฐ ๋‚ด ์ž์‹ ์˜ Pipe.jl๊ณผ ๊ฐ™์€ ๊ฒƒ์€ ์ž‘๋™ ํ•  ํ‘œํ˜„์‹์„ ๋ž˜ํ•‘ํ•˜๋Š” ๋งคํฌ๋กœ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ์ฝ๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

Infix Macros๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ต์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  |>๋ฅผ ๊ทธ๋ ‡๊ฒŒ ์ •์˜ํ•˜์‹ญ์‹œ์˜ค.

|> (๋˜๋Š” do ๋ธ”๋ก์˜ ์‚ฌ์ดŒ)์ด ์ฝ”์–ด์— ์†ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ํŒŒ์„œ ์™ธ๋ถ€์—์„œ ์ •์˜ํ•˜๋Š” ๋„๊ตฌ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ํŒŒ์ดํ”„ ๋ผ์ด๋‹ ๊ตฌ๋ฌธ์„ ๊ฐ€์งˆ ์ˆ˜์žˆ๋Š” ๋Šฅ๋ ฅ์€ ๋งค์šฐ ์ข‹์Šต๋‹ˆ๋‹ค. Lazy.j, FunctionalData.jl ๋ฐ Pipe.jl์ด ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š”๋ฒ ์ด์Šค, ์ฆ‰ x |> y(f) = y(f, x) ๋ถ€๋ถ„์— ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? : +1 :

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

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

๋‚˜๋Š” ๋‹น์‹ ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ _ ๋” ํ†ต์ผ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค _. ํ•˜์ง€๋งŒ ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜์žˆ๋Š” [๋ณต์žกํ•œ] ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ตฌ๋ฌธ๊ณผ ๊ทธ ์˜๋ฏธ๋ฅผ ์•Œ์•„์•ผํ•˜์ง€๋งŒ IMHO, |> ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ ๋” ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@tkelman ๋‚˜๋Š” ๋‹ค๋ฅธ ๊ด€์ ์—์„œ ๊ทธ๊ฒƒ์„ ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๊ทธ๋Ÿฐ ์Šคํƒ€์ผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์„ ํ˜ธํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ผ๊ด€๋œ ์Šคํƒ€์ผ์„ Base์— ์›ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์„ ํ˜ธํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ _their_ Julia ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ํŒŒ์„œ ์ง€์›์„ ์ถ”๊ฐ€ ํ•œ ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ์ค„๋ฆฌ์•„ ์ธ์€ ์ •๋ง๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์œ ์ตํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์„ ์ง€์‹œํ•˜๊ฑฐ๋‚˜ ์–ต์••ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๊นŒ?
๋‚˜๋Š” ์œ ๋‹‰์Šค์—์„œ ๋งค์šฐ ์œ ์šฉํ•œ ํŒŒ์ดํ”„ ๋ผ์ด๋‹์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋น„๋ก ๋‚ด๊ฐ€ ์–ธ์–ด์—์„œ ๊ทธ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•œ ์ ์ด ์—†์ง€๋งŒ ์ ์–ด๋„ ์˜์‹ฌ์˜ ์ด์ ์„ ์ค„ ๊ฒƒ์ด๋‹ค.

์šฐ๋ฆฌ๋Š” ํ•จ์ˆ˜ ํŒŒ์ดํ•‘ ์—ฐ์‚ฐ์ž๋กœ |> ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ํ˜„์žฌ ์ˆ˜ํ–‰๋˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ตฌํ˜„ ์ œํ•œ์ด์žˆ์–ด ํ˜„์žฌ ๋งค์šฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

ํŒŒ์ดํ•‘์€ ๋ชจ๋“  ๊ฒƒ์ด ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์ถœ๋ ฅํ•˜๋Š” ์œ ๋‹‰์Šค ์…ธ์—์„œ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ๋” ๋ณต์žกํ•œ ์œ ํ˜•๊ณผ ์—ฌ๋Ÿฌ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ์œผ๋กœ ์ธํ•ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐ€์ง€ ๊ตฌ๋ฌธ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ํ•˜๋‚˜๋Š” MIMO์˜ ๊ฒฝ์šฐ ํ›จ์”ฌ ๋œ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ•๋ ฅํ•œ ๋งคํฌ๋กœ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋Œ€์ฒด ์Šคํƒ€์ผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋˜๋Š” DSL์— ๋Œ€ํ•œ ํŒŒ์„œ ์ง€์›์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ข‹์•„์š”, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. @oxinabox ์˜ ๋Œ“๊ธ€๋กœ

๊ทธ๋Ÿฌ๋‚˜ ํŒŒ์„œ ์™ธ๋ถ€์—์„œ ์ •์˜ํ•˜๋Š” ๋„๊ตฌ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜๊ฐ€ ์–ธ๊ธ‰ ํ•œ ๊ตฌํ˜„ ์ œํ•œ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ์กฐ์น˜๋ฅผ ์ทจํ•ด์•ผํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์ด์ „ ์ œ์•ˆ ์ค‘ ์ผ๋ถ€๋Š” ์ž ์žฌ์ ์œผ๋กœ |> ์ธ์ˆ˜๋ฅผ ํ•จ์ˆ˜ ๋Œ€์‹  ๋งคํฌ๋กœ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. |> ์˜ ์ด์ „ ๋ช…๋ น ๊ฐœ์ฒด ํŒŒ์ดํ•‘ ์˜๋ฏธ๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ 0.5-dev๋กœ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜์ด ์„ ํƒ์€ ~ ์˜ ํŠน์ˆ˜ํ•œ ๊ตฌ๋ฌธ ๋ถ„์„์„ ๊ฝค ๋งŽ์ด ์ƒ๊ธฐ์‹œ์ผœ์ค๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์–ธ๊ธ‰ ํ•œ ์ด์œ  ๋•Œ๋ฌธ์— ์‹ค์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

|> ์ธ์ˆ˜๋ฅผ ํ•จ์ˆ˜ ๋Œ€์‹  ๋งคํฌ๋กœ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์—ฌ ๊ตฌํ˜„

๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š๋Š” ํ•œ!

ํŒŒ์‹ฑ โ€‹โ€‹~ ๊ทธ๋ƒฅ ๋ฏธ์ณค์–ด, ๊ธฐ๋ณธ ๊ธฐ๋Šฅ

๋น„ํŠธ ๋ฒ„์ „์˜ ๋‹จํ•ญ ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค. Infix ๋ฐ”์ด๋„ˆ๋ฆฌ ~ ๋Š” ๋งคํฌ๋กœ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ref https://github.com/JuliaLang/julia/issues/4882 , ์ด๊ฒƒ์€ ASCII ์—ฐ์‚ฐ์ž (https://github.com/ JuliaLang / julia / pull / 11102 # issuecomment-98477891).

๋ฟก๋ฟก

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐ€์ง€ ๊ตฌ๋ฌธ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ํ•˜๋‚˜๋Š” MIMO์˜ ๊ฒฝ์šฐ ํ›จ์”ฌ ๋œ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

3 ๊ตฌ๋ฌธ. ๊ฑฐ์˜.
ํŒŒ์ดํ”„ ์ธ, ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐ Do- ๋ธ”๋ก.
๋งคํฌ๋กœ๋„ ๋‹ค๋ฅธ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— 4์—์„œ๋„ ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


๋‚˜๋ฅผ ์œ„ํ•ด
์ฝ๊ธฐ ์ˆœ์„œ (์ฆ‰, ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ) == ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ˆœ์„œ๋Š” SISO ๊ธฐ๋Šฅ ์ฒด์ธ์˜ ๊ฒฝ์šฐ ํ›จ์”ฌ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

(iterators.jl ๋ฐ pipe.jl ์‚ฌ์šฉ)๊ณผ ๊ฐ™์€ ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • loaddata(filename) |> filter(s-> 2<=length(s)<=15, _) |> take!(150,_) |> map(eval_embedding, _)
  • results |> get_error_rate(desired_results, _) |> round(_,2)

SISO์˜ ๊ฒฝ์šฐ (๊ฐœ์ธ ์ทจํ–ฅ์— ๋”ฐ๋ผ) MIMO์˜ ๊ฒฝ์šฐ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Julia๋Š” ์ผ์„ํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์— ์ด๋ฏธ ์ •์ฐฉ ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
100 % ํ™•์‹ ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ผ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ๋‚˜๋Š” Pipe์™€ Do ๋ธ”๋ก์ด ์ฃผ ์–ธ์–ด์—์„œ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

Do-blocks์—๋Š” ๋งค์šฐ ์œ ์šฉํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋งŽ์ด ์žˆ์ง€๋งŒ ์ฒซ ๋ฒˆ์งธ ์ž…๋ ฅ์„ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋Š” ์ ์ด ์•ฝ๊ฐ„ ์งœ์ฆ์ด๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ ‘๋ฏธ์‚ฌ๊ฐ€ data.map(f).sum() ์ธ D ์Šคํƒ€์ผ UFCS, ์ธ๊ธฐ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์—ฌ๋Ÿฌ ๋””์ŠคํŒจ์น˜์™€ ํšจ๊ณผ์ ์œผ๋กœ ๊ฒฐํ•ฉ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.)

ํŒŒ์ดํ•‘์€ ๊ณง ํ๊ธฐ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ Pipe.jl๊ณผ ๊ฐ™์€ DSL์—์„œ ์‚ฌ์šฉํ•  ํŒจํ‚ค์ง€๋กœ ๋‚จ๊ฒจ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Julia๋Š” ์ผ์„ํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์— ์ด๋ฏธ ์ •์ฐฉ ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
100 % ํ™•์‹ ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ผ์ž…๋‹ˆ๋‹ค.

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

ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ
์•„์ง ์–ธ์–ด ๋‚˜ "ํ•ต์‹ฌ"ํŒจํ‚ค์ง€์— ํฌํ•จ๋˜์ง€ ์•Š์•„์•ผํ•˜๋Š” ๋ช…ํ™•ํ•œ ์ด์œ ๋ฅผ ์•„์ง ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. [์˜ˆ :๋ฒ ์ด์Šค]
๊ฐœ์ธ์ ์œผ๋กœ |> ๋งคํฌ๋กœ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋‹ต์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์•„๋งˆ๋„ ์ด๊ฒƒ๊ณผ _like_ ๋ญ”๊ฐ€? (๋‚˜๋Š” ๋งˆ์Šคํ„ฐ Julia ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค!)

macro (|>) (x, y::Union(Symbol, Expr))
    if isa(y, Symbol)
        y = Expr(:call, y) # assumes y is callable
    end
    push!(y.args, x)
    return eval(y)
end

Julia v0.3.9์—์„œ๋Š” ๋‘ ๋ฒˆ ์ •์˜ ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์€ ๊ธฐํ˜ธ๋กœ, ํ•œ ๋ฒˆ์€ ์‹์œผ๋กœ ์ •์˜ ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. Union ๋Œ€ํ•œ ๋‚˜์˜ [์ œํ•œ๋œ] ์ดํ•ด๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ œ ์žฅ๋‚œ๊ฐ ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก ์ด๋ฅผ์œ„ํ•œ ์‚ฌ์šฉ ๊ตฌ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด log(2, 10) ํ•ด๋‹นํ•˜๋Š” ํ•ญ๋ชฉ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด @|> 10 log(2) ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์—์„œ๋Š” ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‚ด ์ดํ•ด๋Š” ํ•จ์ˆ˜ / ๋งคํฌ๋กœ๋ฅผ "๊ณ ์ • ๋ถˆ๊ฐ€๋Šฅ"์œผ๋กœ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 10 |> log(2) . (์ž˜๋ชป๋œ ๊ฒฝ์šฐ ์ˆ˜์ •!)
์˜ˆ๋ฅผ ๋“ค์–ด, ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ง€๊ธˆ ์ข‹์€ ๊ฒƒ์„ ์ƒ๊ฐํ•  ์ˆ˜ ์—†๋‹ค! =)

๋‚ด ์˜ˆ์—์„œ ๋‹ค๋ฃจ์ง€ ์•Š์€ ํ•œ ์˜์—ญ์„ ์ง€์ ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ :

julia> for e in ([1:10], [11:20] |> zip) println(e) end
(1,11)
(2,12)
(3,13)
(4,14)
(5,15)
(6,16)
(7,17)
(8,18)
(9,19)
(10,20)

๋‹ค์‹œ-์ธ์œ„์ ์ธ ์˜ˆ์ด์ง€๋งŒ ์š”์ ์„ ์–ป๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค!
๋‚˜๋Š” ์•ฝ๊ฐ„์˜ ์กฐ์ž‘์„ํ–ˆ์ง€๋งŒ ์ด๊ฒƒ์„ ์ž‘์„ฑํ•˜๋Š” ํ˜„์žฌ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/JuliaLang/julia/issues/554#issuecomment -110091527 ๋ฐ # 11608์„ ์ฐธ์กฐ

2015 ๋…„ 6 ์›” 9 ์ผ ์˜คํ›„ 9์‹œ 37 ๋ถ„์— H-225 [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์–ธ์–ด์— ํฌํ•จ๋˜์ง€ ์•Š์•„์•ผํ•˜๋Š” ๋ช…ํ™•ํ•œ ์ด์œ ๋ฅผ ์•„์ง ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์งˆ๋ฌธ์€ "์™œ?" "์™œ ์•ˆ๋ผ?"

+ 1_000_000

๊ณผ์—ฐ.
์ด ๊ฝค ์ž˜ ์•Œ๋ ค์ง„ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
๋ชจ๋“  ๊ธฐ๋Šฅ์€ -100 ์ ์œผ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
์–ธ์–ด์— ์ถ”๊ฐ€ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์œผ๋ ค๋ฉด ํฌ๊ฒŒ ๊ฐœ์„ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

FWIW, Pyret (http://www.pyret.org/)์€ ๋ช‡ ๋‹ฌ ์ „์—์ด ์ •ํ™•ํ•œ ๋…ผ์˜๋ฅผ ๊ฑฐ์ณค์Šต๋‹ˆ๋‹ค. ์ด ์–ธ์–ด๋Š” ์›๋ž˜ ์‚ฌ๋žŒ๋“ค์ด |> ๋กœ ์ œ์•ˆํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๊ฑฐ์˜ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ–ˆ๋˜ "์บ๋…ผ๋ณผ"ํ‘œ๊ธฐ๋ฒ•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Pyret์—์„œ

[list: 1, 2, 3, 5] ^ map(add-one) ^ filter(is-prime) ^ sum() ^ ...

๋”ฐ๋ผ์„œ ํฌํƒ„ ํ‘œ๊ธฐ๋ฒ•์€ ํ•จ์ˆ˜์— ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด ๊ตฌ๋ฌธ์ด ๋„ˆ๋ฌด ํ˜ผ๋ž€ ์Šค๋Ÿฝ๋‹ค๊ณ  ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. sum() ๊ฐ€ ์ธ์ˆ˜์—†์ด ํ˜ธ์ถœ๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ถ๊ทน์ ์œผ๋กœ ๊ทธ๋“ค์€ ์šฐ์•„ํ•œ ์นด๋ ˆ ๋Œ€์•ˆ์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

[list: 1, 2, 3, 5] ^ map(_, add-one) ^ filter(_, is-prime) ^ sum() ^ ...

์ด๊ฒƒ์€๋ณด๋‹ค ๋ช…์‹œ ์ ์ด๋ผ๋Š” ์žฅ์ ์ด ์žˆ์œผ๋ฉฐ ^ ์—ฐ์‚ฐ์ž๋ฅผ ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜๋กœ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ํ›จ์”ฌ ๋” ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์นด๋ ˆ๋ณด๋‹ค ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค.

@StefanKarpinski ์กฐ๊ธˆ ํ˜ผ๋ž€ ์Šค๋Ÿฌ์›Œ์š”. ์ปค๋ง์ด ์•„๋‹Œ ์ฒด์ด๋‹๋ณด๋‹ค ๋” ์œ ์—ฐํ•˜๋‹ค๊ณ  ๋ง์”€ ํ•˜์…จ๋‚˜์š”? ๊ฒฐ๊ตญ Pyret์˜ ํ•ด๊ฒฐ์ฑ…์€ ๋‹จ์ˆœํžˆ ์ปค๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์—ˆ๋Š”๋ฐ, ์ด๋Š” ์—ฐ๊ฒฐ๋ณด๋‹ค ๋” ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

|> ๊ตฌ๋ฌธ์„ ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•˜๋ฉด (๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์–ด๋ ค์šด์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. | ๋ฐ > ์™€ ์ถฉ๋Œ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค) ์œ ์—ฐํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฌ์šด ๊ฒƒ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •์˜

foo(x,y) = (y,x)
bar(x,y) = x*y

์šฐ๋ฆฌ๋Š”ํ•ด์•ผ:

randint(10) |_> log(_,2) |> sum 
(1,2) |_,x>  foo(_,x)   |x,_>   bar(_,2) |_> round(_, 2) |> sum |_> log(_, 2)

์ฆ‰, |a,b,c,d> ์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์ž๊ฐ€์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ a , b , c ๋ฐ d ๋Š” ๋งˆ์ง€๋ง‰ ํ‘œํ˜„์‹์„ (์ˆœ์„œ๋Œ€๋กœ) ๋‹ค์Œ ํ‘œํ˜„์‹ ์•ˆ์˜ ์ž๋ฆฌ ํ‘œ์‹œ ์ž์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

|> ๋‚ด๋ถ€์— ๋ณ€์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ์ง€๊ธˆ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํ‘œ์ค€์„ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. f(x) |> g(_, 1) ๋Š” f(x) ๋ฐ˜ํ™˜ ๋œ ๋ชจ๋“  ๊ฐ’์„ ๊ฐ€์ ธ์™€ _ ์ž๋ฆฌ ํ‘œ์‹œ ์ž์™€ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

@samuela , ๋‚ด๊ฐ€ ์˜๋ฏธ ํ•œ ๊ฒƒ์€ ์ปค๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด ํ›„ํ–‰ ์ธ์ˆ˜ ๋งŒ ์ƒ๋žต ํ•  ์ˆ˜์žˆ๋Š” ๋ฐ˜๋ฉด _ ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ๋Š” ๋ชจ๋“  ์ธ์ˆ˜๋ฅผ ์ƒ๋žตํ•˜๊ณ  ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด f(x,y) ๋ฅผ ์ปค๋ง๊ณผ ํ•จ๊ป˜ ์ฃผ๋ฉด f(x) ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ y -> f(x,y) ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ‘์ค„์„ ์‚ฌ์šฉํ•˜๋ฉด f(x,_) ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. f(_,y) ํ•˜์—ฌ x -> f(x,y) ๋ฅผ ๋ฐ›์œผ์„ธ์š”.

๋‚˜๋Š” ๋ฐ‘์ค„ ๊ตฌ๋ฌธ์„ ์ข‹์•„ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด "ํฌํšํ•˜๋Š”"์ฃผ๋ณ€ ํ‘œํ˜„์˜ ์–‘์— ๋Œ€ํ•œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์ œ์•ˆ ๋œ ๋‹ต์— ์—ฌ์ „ํžˆ ๋งŒ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์–ด๋–ป๊ฒŒํ•ฉ๋‹ˆ๊นŒ? _ ์œ„์น˜์— ํŠœํ”Œ์„ ์ „๋‹ฌํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ฆ‰์„์—์„œ ๋ถ„ํ• ํ•˜๋Š” ๊ตฌ๋ฌธ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด๋ฆฌ์„์€ ์งˆ๋ฌธ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์šฉ์„œํ•˜์‹ญ์‹œ์˜ค!

@StefanKarpinski ์•„, ๋ฌด์Šจ ๋œป์ธ์ง€

@ScottPJones ๋ช…๋ฐฑํ•œ ๋Œ€๋‹ต์€ ASCII ์•„ํŠธ ํ™”์‚ดํ‘œ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
http://scrambledeggsontoast.github.io/2014/09/28/needle-announce/

@simonbyrne Fortran IV์—์„œ ์ฒœ๊ณต ์นด๋“œ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋‚˜๋น  ๋ณด์ž…๋‹ˆ๋‹ค. _1, _2 ๋“ฑ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ๊ตฌ๋ฌธ์ด ์—ฌ๋Ÿฌ ๋ฐ˜ํ™˜์„ ๋ถ„๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜๊ฑฐ๋‚˜ ๋‚ด ๋ถ€๋ถ„์—์„œ ์–ด๋ฆฌ์„์€ ์•„์ด๋””์–ด์ž…๋‹ˆ๊นŒ?

@simonbyrne ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฌธ์ž์—ด ๋งคํฌ๋กœ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋†€๋ผ์šด GSoC ํ”„๋กœ์ ํŠธ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ธ์ˆ˜์—†์ด sum ()์ด ํ˜ธ์ถœ๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์•”์‹œ ์  ์ธ์ˆ˜๋„ do ํ‘œ๊ธฐ๋ฒ•์— ๋Œ€ํ•ด ๋” ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์  ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ๋™์ผํ•œ ๊ทœ์น™์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (ํ›จ์”ฌ ๋” ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ์ด๋ฏธ ์–ธ์–ด๋กœ ๊ตฌ์›Œ ์กŒ๊ธฐ ๋•Œ๋ฌธ์—).

@simonbyrne ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์ด ๋ชจํ˜ธํ•˜์ง€ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด, ๊ทธ๊ฒƒ์ด ์ข€ ๋” ๋…ผ๋ฆฌ์ ์ด๊ณ , ๋” ์ผ๋ฐ˜์ ์ด๋ฉฐ, ์—ฐ๊ฒฐ๊ณผ ์ผ๊ด€๋˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๊นจ์งˆ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (ํ˜„์žฌ do ํ‘œ๊ธฐ๋ฒ•).

@simonbyrne ๋„ค, ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ˜„์žฌ do ํ‘œ๊ธฐ๋ฒ•์˜ ๋™๊ธฐ๋ฅผ ์ดํ•ดํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๊ตฌ๋ฌธ ์ฒด์กฐ๋ฅผ ์ •๋‹นํ™”ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊ฐ•ํ•˜๊ฒŒ ๋Š๋‚๋‹ˆ๋‹ค.

@samuela ์— ๊ด€ํ•œ map (f, _) vs just map (f). ๋‚˜๋Š” ์–ด๋–ค ๋งˆ์ˆ  desugaring์ด ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ map (f)๋Š” ์กด์žฌํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์„คํƒ•์€ ๋งคํ•‘์— ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ

map(f::Base.Callable) = function(x::Any...) map(f,x...) end

์ฆ‰, ๋งต์€ ํ•จ์ˆ˜๋ฅผ ์ทจํ•œ ๋‹ค์Œ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ (๋‹ค์†Œ ๋งŽ๊ฑฐ๋‚˜ ์ ์€) ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋” ์ผ๋ฐ˜์ ์œผ๋กœ ์ €๋Š” |> ํ•ญ์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜ (๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ)์— ๋งคํ•‘ํ•˜๋Š” ์ผ์ข…์˜ ๊ทœ์น™๋ณด๋‹ค๋Š” "ํŽธ๋ฆฌํ•œ"๋ฉ”์†Œ๋“œ๊ฐ€ ์ถ”๊ฐ€ ๋œ ํ•จ์ˆ˜์— ์˜์กดํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ฐ™์€ ๋งฅ๋ฝ์—์„œ

type Underscore end
_ = Underscore()

ํ•จ์ˆ˜๋Š” ํŠน์ • ์ธ์ˆ˜์—์„œ ๋ฐ‘์ค„์„ ์‚ฌ์šฉํ•˜๊ณ  ๋” ์ ์€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ ธ์•ผ / ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™์ž…๋‹ˆ๋‹ค. n ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ๋ฐ›๋Š” ๊ฐ ํ•จ์ˆ˜์— ๋Œ€ํ•ด 2 ^ n ๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ํ•˜๋‚˜์˜ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ๋ฉ”์„œ๋“œ ์กฐํšŒ์— ์—ฐ๊ฒฐํ•˜์—ฌ ์ธ์ˆ˜๊ฐ€ Underscore ์œ ํ˜•์ด๋ฉด ์ ์ ˆํ•œ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“ , ์ฝœ ๋Ÿฌ๋ธ”์„ ๊ฐ€์ ธ ์™€์„œ ์ฝœ ๋Ÿฌ๋ธ”์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋งต๊ณผ ํ•„ํ„ฐ์˜ ๋ฒ„์ „์„ ๊ฐ–๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Underscore๊ฐ€์žˆ๋Š” ๊ฒƒ์€ ์ž‘๋™ ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.
x |> map(f, _) => x |> map(f, Underscore()) => x |> map(f, x) map(f, _) ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. - _ ์„ (๋ฅผ) ํ”„๋กœ๊ทธ๋žจ ํ•  ํŠน๋ณ„ํ•œ ๊ฐœ์ฒด๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

ํ•˜์ง€๋งŒ Julia๊ฐ€ ์ง์ ‘ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค |> ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™์œผ๋กœ ์ถ”๋ก ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์€์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ map ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์ œ์•ˆ๊ณผ ๊ด€๋ จํ•˜์—ฌ-์ข€ ์ข‹์•„์š”. ์‹ค์ œ๋กœ ํ˜„์žฌ |> ๊ฒฝ์šฐ ๋งค์šฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋Œ€์‹  x |> map(f, _) => x |> map(f, x) ์ž๋™ ์ถ”๋ก ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@StefanKarpinski ๋ง์ด ๋˜๋„ค์š”. ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ•œ ๊ฒƒ์€ ์–ด๋–ค ์‹ ์œผ๋กœ๋“  |> ์™€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. _ ์™€ ๊ด€๋ จํ•˜์—ฌ ์ œ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ์˜ˆ๋ฅผ ๋“ค์–ด < ์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

<(_::Underscore, x) = function(z) z < x end
<(x, _::Underscore) = function(z) x < z end

๊ทธ๋Ÿฌ๋‚˜ ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์„ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋ฉด ์ด๊ฒƒ์ด ๊ณ ํ†ต ์Šค๋Ÿฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๋ฐ‘์ค„์ด์žˆ๋Š” ๊ฒƒ์€ ์œ„์—์„œ ์„ค๋ช…ํ•œ๋Œ€๋กœ ๋งคํ•‘์— ํŽธ์˜ ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‘˜ ๋‹ค ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  ์กด์žฌํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

@patrickthebold ๋ฐ‘์ค„ ๋“ฑ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์ค‘์š”ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ถ€๋‹ด์„์ค๋‹ˆ๋‹ค. ๋ชจ๋“  2 ^ n์„ ๋‚˜์—ดํ•ด์•ผ

f(_, x, y) = ...
f(x, _, y) = ...
f(_, _, y) = ...
...

์šฐ์•„ํ•จ์€ ๋งํ•  ๊ฒƒ๋„์—†๊ณ  ๋งค์šฐ ์„ฑ ๊ฐ€์‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ map ๋Œ€ํ•œ ์ œ์•ˆ์€ map ๋ฐ filter ์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ map(f) ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋™ ๋ฐ‘์ค„ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ๋ณต์žก์„ฑ ๋ฌธ์ œ. ์˜ˆ๋ฅผ ๋“ค์–ด, func_that_has_a_lot_of_args(a, b, c, d, e) ๊ฐ€๋Šฅํ•œ "์นด๋ ˆ"๋ฅผ ์ž…๋ ฅํ•˜๋Š” ํž˜๋“  ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผํ•ฉ๋‹ˆ๋‹ค.

func_that_has_a_lot_of_args(a, b, c, d, e) = ...
func_that_has_a_lot_of_args(b, c, d, e) = ...
func_that_has_a_lot_of_args(a, b, e) = ...
func_that_has_a_lot_of_args(b, d, e) = ...
func_that_has_a_lot_of_args(a, d) = ...
...

๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ ‡๊ฒŒ func_that_has_a_lot_of_args(x, y, z) ํ•˜๋”๋ผ๋„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ ์–ด๋ฆฌ์„์€ ๋ชจํ˜ธํ•จ์— ์ง๋ฉดํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค. x=a,y=b,z=c ๋˜๋Š” x=b,y=d,z=e ๋“ฑ์˜ ์ •์˜๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๊นŒ? ? Julia๋Š” ๋Ÿฐํƒ€์ž„ ์œ ํ˜• ์ •๋ณด๋กœ ์ด๋“ค์„ ์‹๋ณ„ํ•˜์ง€๋งŒ ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์€ ์™„์ „ํžˆ ๋ถˆ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

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

@samuela
"๋žŒ๋‹ค๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋นผ๋‚ด์‹ญ์‹œ์˜ค"๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? - ๊ถ๊ธˆํ•ด. ์ €๋„ ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ ๋  ์ˆ˜ ์žˆ์„์ง€ ๊ถ๊ธˆํ–ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.
์•„-์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : filter(_ < 5, [1:10]) => [1:4] ?
๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” filter(e -> e < 5, [1:10]) ๋” ์ฝ๊ธฐ ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋” ์ผ๊ด€ ์ -๋œ ์ˆจ๊ฒจ์ง„ ์˜๋ฏธ, ๋‚ด๊ฐ€ ๋‹น์‹ ์—๊ฒŒ ํ—ˆ๋ฝํ•˜์ง€๋งŒ ๋” ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์ •๋ง ๋น›๋‚˜๋Š” ์˜ˆ๊ฐ€ ์—†๋‹ค๋ฉด?

@samuela

๋˜ํ•œ map์— ๋Œ€ํ•œ ์ œ์•ˆ์€ map ๋ฐ filter์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ map (f)์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜๋™ ๋ฐ‘์ค„ ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ๋™์ผํ•œ ๋ณต์žก์„ฑ ๋ฌธ์ œ๋ฅผ ๊ฒช์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์œผ๋กœ map ๋ฐ filter ๋ฐ ์•„๋งˆ๋„ ๋ช…๋ฐฑํ•ด ๋ณด์ด๋Š” ๋‹ค๋ฅธ ๋ช‡ ๊ณณ์—์„œ๋งŒ ์ˆ˜ํ–‰๋˜๋„๋ก ์ œ์•ˆํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ €์—๊ฒŒ map ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ๋ฐ›์•„ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. (๊ทธ๊ฒƒ์ด Haskell์ดํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค.)

์šฐ์•„ํ•จ์€ ๋งํ•  ๊ฒƒ๋„์—†๊ณ  ๋งค์šฐ ์„ฑ ๊ฐ€์‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

@ H-225 ๋„ค ๋ฐ‘์ค„์€ ๊ตฌ๋ฌธ์ƒ์˜ ํŽธ์˜์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ํ”ํ•œ ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ Scala๋Š” ํ™•์‹คํžˆ ๊ทธ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ข‹์•„ํ•˜์ง€๋งŒ ๊ทธ ์Šคํƒ€์ผ ์ค‘ ํ•˜๋‚˜ ์ผ ๋ฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@ H-225 ๊ธ€์Ž„,์ด ๊ฒฝ์šฐ์—๋Š” ๋งค๋ ฅ์ ์ด๊ณ  ๊ด€๋ จ์„ฑ์ด ๋†’์€ ์˜ˆ๊ฐ€ ํ•จ์ˆ˜ ์ฒด์ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์“ฐ๋Š” ๋Œ€์‹ 

[1, 2, 3, 5]
  |> x -> map(addone, x)
  |> x -> filter(isprime, x)
  |> sum
  |> x -> 3 * x
  |> ...

๊ฐ„๋‹จํžˆ ์“ธ ์ˆ˜์žˆ๋‹ค

[1, 2, 3, 5]
  |> map(addone, _)
  |> filter(isprime, _)
  |> sum
  |> 3 * _
  |> ...

ํ•„์ž๋Š”์ด ๋ฐ‘์ค„ ๊ตฌ๋ฌธ (๋˜๋Š” ์•ฝ๊ฐ„์˜ ๋ณ€ํ˜•)์„ ์ง€์›ํ•˜๋Š” ์–ธ์–ด์—์„œ ๋ฌด์˜์‹์ ์œผ๋กœ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ์ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์–ธ์–ด๋กœ ์ „ํ™˜ ํ•  ๋•Œ ์–ผ๋งˆ๋‚˜ ๋„์›€์ด๋˜๋Š”์ง€ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ํ˜„์žฌ Julia์—์„œ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ / ์ ‘๊ทผ๋ฒ•์ด ์ตœ์†Œ 3.5 ๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค. Julia์˜ ๊ธฐ๋ณธ ์ œ๊ณต |> ํ•จ์ˆ˜, Pipe.jl, Lazy.jl ๋ฐ Julia์˜ ๊ธฐ๋ณธ ์ œ๊ณต do ๋Œ€ํ•œ 0.5 ์ •์‹ ์ ์œผ๋กœ ๋น„์Šทํ•œ

@samuela ์ด ์•„์ด๋””์–ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด FunctionalData.jl์„ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<strong i="7">@p</strong> map [1,2,3,4] addone | filter isprime | sum | times 3 _

๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์€ ์ž…๋ ฅ์„ ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ํŒŒ์ดํ”„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค (๊ธฐ๋ณธ๊ฐ’์€ ์ธ์ˆ˜ 1์ด๋ฉฐ์ด ๊ฒฝ์šฐ _ ๋Š” ์ƒ๋žต ํ•  ์ˆ˜ ์žˆ์Œ). ํ”ผ๋“œ๋ฐฑ์„ ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!


ํŽธ์ง‘ : ์œ„์˜ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํžˆ ๋‹ค์‹œ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.

times(3, sum(filter(map([1,2,3,4],addone), isprime)))

Base.map ๋ฐ ํ•„ํ„ฐ ๋Œ€์‹  FunctionalData.map ๋ฐ ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ์ฐจ์ด์ ์€ ์ธ์ˆ˜ ์ˆœ์„œ์ด๊ณ  ๋‘ ๋ฒˆ์งธ ์ฐจ์ด์ ์€ ์ธ๋ฑ์‹ฑ ๊ทœ์น™์ž…๋‹ˆ๋‹ค (๋ฌธ์„œ ์ฐธ์กฐ). ์–ด์จŒ๋“  Base.map์€ ์ธ์ˆ˜ ์ˆœ์„œ๋ฅผ ๋ฐ˜๋Œ€๋กœํ•˜์—ฌ ๊ฐ„๋‹จํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @p ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์žฌ ์ž‘์„ฑ ๊ทœ์น™์ž…๋‹ˆ๋‹ค (์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์ด ์•ˆ์ชฝ์—์„œ ๋ฐ”๊นฅ์ชฝ์œผ๋กœ ๋ฐ”๋€Œ๊ณ  ๊ฐ„๋‹จํ•œ ์ปค๋ง๋„ ์ง€์›๋ฉ๋‹ˆ๋‹ค. <strong i="17">@p</strong> map data add 10 | showall

showall(map(data, x->add(x,10)))

Hack์€ https://github.com/facebook/hhvm/issues/6455 ์™€ ๊ฐ™์€ ๋‚ด์šฉ์„ ์†Œ๊ฐœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค $$ ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ( $ ๋Š” ์ด๋ฏธ ๋„ˆ๋ฌด ์˜ค๋ฒ„๋กœ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค).

FWIW, ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ Hack์˜ ์†”๋ฃจ์…˜์„ ์ •๋ง ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค. ๋‚˜์˜ ์ฃผ์š” ์˜ˆ์•ฝ์€ ๋ณ€์ˆ˜ / ์Šฌ๋กฏ์— _ ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋” ๊ฐ„๊ฒฐํ•œ ๋žŒ๋‹ค ํ‘œ๊ธฐ๋ฒ•์„ ์ข‹์•„ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋ฉฐ, ์ด๊ฒƒ์ด ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

__ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? ๋‹น์‹ ์ด ์ƒ๊ฐํ•˜๋Š” ๋žŒ๋‹ค ๊ตฌ๋ฌธ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? _ -> sqrt(_) ?

๋ฌผ๋ก  ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ๋ฌธ์€ ์ด๋ฏธ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ™”์‚ดํ‘œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ตฌ๋ฌธ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ map(_ + 2, v) ์ค„์„ ๋”ฐ๋ผ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฌธ์ œ๋Š” _ ์ฃผ๋ณ€ ํ‘œํ˜„์˜ ์–‘

Mathematica์—๋Š” ์ต๋ช… ์ธ์ˆ˜์— ๋Œ€ํ•œ ์œ ์‚ฌํ•œ ์‹œ์Šคํ…œ์ด ์—†์Šต๋‹ˆ๊นŒ? ์–ด๋–ป๊ฒŒ
๊ทธ๋“ค์€ ๊ทธ ์ธ์ˆ˜์˜ ๊ฒฝ๊ณ„ ๋ฒ”์œ„๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?
2015 ๋…„ 11 ์›” 3 ์ผ ํ™”์š”์ผ ์˜ค์ „ 9:09 Stefan Karpinski [email protected]
์ผ๋‹ค :

๋ฌผ๋ก  ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ๋ฌธ์€ ์ด๋ฏธ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
ํ™”์‚ดํ‘œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์„ ์„ ๋”ฐ๋ผ ๋ฌด์–ธ๊ฐ€๋ฅผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ง€๋„ (_ + 2, v)์˜ ์‹ค์ œ ๋ฌธ์ œ๋Š” ์ฃผ๋ณ€์ด ์–ผ๋งˆ๋‚˜
_๊ฐ€ ์†ํ•œ ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/JuliaLang/julia/issues/5571#issuecomment -153383422.

https://reference.wolfram.com/language/tutorial/PureFunctions.html , ํ‘œ์‹œ
# ๊ธฐํ˜ธ๋Š” ์ œ๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
2015 ๋…„ 11 ์›” 3 ์ผ ํ™”์š”์ผ ์˜ค์ „ 9:34 Jonathan Malmaud [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

Mathematica์—๋Š” ์ต๋ช… ์ธ์ˆ˜์— ๋Œ€ํ•œ ์œ ์‚ฌํ•œ ์‹œ์Šคํ…œ์ด ์—†์Šต๋‹ˆ๊นŒ? ์–ด๋–ป๊ฒŒ
๊ทธ๋“ค์€ ๊ทธ ์ธ์ˆ˜์˜ ๊ฒฝ๊ณ„ ๋ฒ”์œ„๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?
2015 ๋…„ 11 ์›” 3 ์ผ ํ™”์š”์ผ ์˜ค์ „ 9:09 Stefan Karpinski [email protected]
์ผ๋‹ค :

๋ฌผ๋ก  ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ๋ฌธ์€ ์ด๋ฏธ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
ํ™”์‚ดํ‘œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์„ ์„ ๋”ฐ๋ผ ๋ฌด์–ธ๊ฐ€๋ฅผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ง€๋„ (_ + 2, v)์˜ ์‹ค์ œ ๋ฌธ์ œ๋Š” ์ฃผ๋ณ€์ด ์–ผ๋งˆ๋‚˜
_๊ฐ€ ์†ํ•œ ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/JuliaLang/julia/issues/5571#issuecomment -153383422.

Mathematica๋Š” & ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์งง์€ ๋žŒ๋‹ค ๊ตฌ๋ฌธ (์ž„์˜์˜ ํ‘œํ˜„์‹์„ ์ทจํ•˜๊ณ  ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ์Œ)์ฒ˜๋Ÿผ ์ผ๋ฐ˜์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€์‹  ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ํ‘œํ˜„์‹์„ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ์ œํ•œํ•˜๊ณ  ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜ / ์Šฌ๋กฏ์„ ์ „์ฒด ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์ œํ•œํ•˜์—ฌ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Open Dyln ์ด๋ผ๋Š” ๋งค์šฐ ๊นจ๋—ํ•œ ๋‹ค์ค‘ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ปค๋ง ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. _ ์ „์ฒด ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋ฌธ์ด ์ตœ์†Œํ™”๋˜๊ณ  ์ง๊ด€์ ์ด๋ฉฐ ๋ชจํ˜ธํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. map(_ + 2, _) ๋Š” x -> map(y -> y + 2, x) ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋žŒ๋‹ค ํ™”ํ•˜๋ ค๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋น„ ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ‘œํ˜„์‹์€ ์–ด์จŒ๋“  -> ๋˜๋Š” do ๋” ๊ธธ๊ณ  ๋” ์นœ์ˆ™ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์œ ์šฉ์„ฑ๊ณผ ์ผ๋ฐ˜์„ฑ์˜ ์ ˆ์ถฉ์ด ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@durcan , ์œ ๋งํ•˜๊ฒŒ ๋“ค๋ฆฌ ๋„ค์š” โ€“ ๊ทœ์น™์— ๋Œ€ํ•ด ์ข€ ๋” ์ž์„ธํžˆ _ ์˜ ์ธ์ˆ˜ ๋‚ด๋ถ€์— ์ฒด๋ฅ˜ map ๋‘ ๋ฒˆ์งธ๋Š” ์ „์ฒด ์†Œ๋น„ ๋™์•ˆ map ํ‘œํ˜„์„? "์ˆ˜์šฉ ํ•  ์ˆ˜์žˆ๋Š” ํ‘œํ˜„์‹์„ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ์ œํ•œ"์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€, "ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜ / ์Šฌ๋กฏ์„ ์ „์ฒด ๋งค๊ฐœ ๋ณ€์ˆ˜์— ์ œํ•œ"์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ข‹์•„, ๋‚˜๋Š” Dylan ๋ฌธ์„œ์˜ ์ผ๋ถ€๋ฅผ ์ฝ๊ณ  ๊ทœ์น™์„ ์–ป์€ ๊ฒƒ ๊ฐ™์ง€๋งŒ map(_ + 2, v) ์ž‘๋™ํ•˜์ง€๋งŒ map(2*_ + 2, v) ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

_ + 2 + _ ๋Š” (x,y) -> x + 2 + y ํ•˜๋Š” ๋ฐ˜๋ฉด _ โŠ• 2 โŠ• _ ๋Š” y -> (x -> x + 2) + y ์˜๋ฏธํ•˜๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ๋น„์ฆˆ๋‹ˆ์Šค๋„ ์žˆ์Šต๋‹ˆ๋‹ค. + ๋ฐ * ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. a + b + c ๋ฅผ ๋‹จ์ผ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š”์ง€ ๋˜๋Š” ์ค‘์ฒฉ ํ˜ธ์ถœ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ ํ•˜๋Š”์ง€๋ฅผ ์•Œ์•„์•ผํ•˜๋Š” ์ฒด๊ณ„๋Š” ๋‹ค์†Œ ์˜์‹ฌ ์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ค‘์œ„ ํ‘œ๊ธฐ๋ฒ•์„ ํŠน๋ณ„ํžˆ ์ฒ˜๋ฆฌํ•ด์•ผํ• ๊นŒ์š”? ๊ทธ๋Ÿฌ๋‚˜ ์•„๋‹ˆ, ๊ทธ๊ฒƒ๋„ ๋น„๋ฆฐ๋‚ด๊ฐ€ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

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

2*_ |> 2+_ |> map(_, v)

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

_ โŠ• 2 โŠ• _    # y -> (x -> x + 2) + y
_ โŠ• 2 โŠ• _ &  # (y , x) -> x + 2 + y

์ด๊ฒƒ์€ ์ง€๊ธˆ๊นŒ์ง€ ์ตœ๊ณ ์˜ ์ œ์•ˆ์ด์ง€๋งŒ ๋‚˜๋Š” ์™„์ „ํžˆ ํŒ”๋ฆฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๋ช…์‹œ์ ์ผ ๋•Œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€๋Š” ๊ฝค ๋ถ„๋ช…ํ•˜์ง€๋งŒ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์ค‘์œ„ ๊ตฌ๋ฌธ์— ์˜ํ•ด ์•”์‹œ๋˜๋ฉด ๋œ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋ž˜, ๋‚˜๋Š” ์ค‘์œ„๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค. ๊ทธ ๋ถ€๋ถ„์€ ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Œ, ์ค‘์œ„ ์œ„์น˜์—์„œ ์ปค๋งํ•˜๋ฉด ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

map(+(*(2, _), 2), v)      # curry is OK syntax, but obviously not what you wanted
map(2*_ + 2, v)            # ERROR: syntax: infix curry requires delimitation
map(2*_ + 2 &, v)          # this means what we want
map(*(2,_) |> +(_,2), v)   # as would this

๋‚ด๊ฐ€ ์ถ”์ธกํ•˜๋Š” ๊ฒฝ๊ณ  ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์นด๋ ˆ๋ฅผ ๋ถ€๋ฅด๋Š” ๊ฒƒ์€ ์ €๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  ํ‹€๋ฆฌ๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ด๊ฒƒ์€ ๋ถ€๋ถ„ ํ•จ์ˆ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค (์„ ํƒ์ ์œผ๋กœ ์ต๋ช…์œผ๋กœ ์ธ์ˆ˜๋˜๋Š” ๋žŒ๋‹ค๊ฐ€ ๋จ). ์ œ์ณ๋‘๊ณ , ์–ด๋–ค ์ƒ๊ฐ?

๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ผ์ธ์„ ๋”ฐ๋ผ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

์˜ˆ :

  • f(_, b) โ†’ x -> f(x, b)
  • f(a, _) โ†’ x -> f(a, x)
  • f(_, _) โ†’ (x, y) -> f(x, y)
  • 2_^2 โ†’ x -> 2x^2
  • 2_^_ โ†’ (x, y) -> 2x^y
  • map(_ + 2, v) โ†’ map(x -> x + 2, v)
  • map(2_ + 2, v) โ†’ map(x -> 2x + 2, v)
  • map(abs, _) โ†’ x -> map(abs, x)
  • map(2_ + 2, _) โ†’ x -> map(y -> 2y + 2, x)
  • map(2_ - _, v, w) โ†’ map((x, y) -> 2x - y, v, w)
  • map(2_ - _, v, _) โ†’ x -> map((y, z) -> 2y - z, v, x)
  • map(2_ - _, _, _) โ†’ (x, y) -> map((z, w) -> 2z - w, x, y)
  • _ โ†’ x -> x
  • map(_, v) โ†’ x -> map(x, v)
  • map((_), v) โ†’ map(x -> x, v)
  • f = _ โ†’ f = x -> x
  • f = 2_ โ†’ f = x -> 2x
  • x -> x^_ โ†’ x -> y -> x^y
  • _ && _ โ†’ (x, y) -> x && y
  • !_ && _ โ†’ (x, y) -> !x && y

์ด๊ฒƒ์ด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์ง€๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ์œ ์ผํ•œ ๊ณณ์€ ์กฐ๊ฑด๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ์ œ๋Š” ์ข€ ์ด์ƒํ•ด์ง‘๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์•ฝ๊ฐ„ ์–ด๋ฆฌ ์„๊ณ  ์›์น™์ด ์—†์œผ๋ฉฐ ์ฝ”๋„ˆ ์ผ€์ด์Šค๊ฐ€ ์žˆ์ง€๋งŒ ์–ด๋”˜๊ฐ€์— ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋ฅผ ์กฐ๊ธˆ ๋œ ํ–‰๋ณตํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์˜ˆ :

  • 2v[_] โ†’ x -> 2v[x] (์ข‹์Œ)
  • 2f(_) โ†’ 2*(x -> f(x)) (๋ณ„๋กœ ์ข‹์ง€ ์•Š์Œ)
  • _ ? "true" : "false" โ†’ (x -> x) ? "true" : "false"
  • _ ? _ : 0 โ†’ (x -> x) ? (y -> y) : 0

์ €๋Š” ์—ฌ๊ธฐ์„œ ๋” ๊นŠ์€ ์ผ์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.-ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ _ ์ด์น˜๊ฐ€๋˜๋Š” _ ํ†ต ์‚ฌ์  ์œ„์น˜์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์žˆ์Šต๋‹ˆ๋‹ค.-๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์œ„์น˜๋กœ ํ™•์žฅํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ "์›ํ•˜๋Š”"๊ณ ์ „์ ์ธ ์œ„์น˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ธ์ˆ˜์ด์ง€๋งŒ ํ• ๋‹น์˜ ์˜ค๋ฅธ์ชฝ์€ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ "์›ํ•œ๋‹ค"๋ผ๊ณ  ๋งํ•  ์ˆ˜์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ์œ„์น˜์ž…๋‹ˆ๋‹ค (๋˜๋Š” ํ•จ์ˆ˜์˜ ๋ณธ๋ฌธ์ด๋˜๋Š” ํ•จ์ˆ˜).

์•„๋งˆ๋„,ํ•˜์ง€๋งŒ ์ „์ฒด์ ์œผ๋กœ ๋งค์šฐ ์„ฑ๊ณต์ ์ด๊ณ  ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” do-block ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ฃผ์žฅ์ด ๋งŒ๋“ค์–ด ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฒกํ„ฐํ™”๋ฅผ์œ„ํ•œ ๋” ๋‚˜์€ ๊ตฌ๋ฌธ๊ณผ ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ „๋ก€๊ฐ€์—†๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. Scala๋Š” ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ _ ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  Mathematica๋Š” ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ # ํ•ฉ๋‹ˆ๋‹ค.

_ ์ต์ˆ™ํ•˜์ง€ ์•Š์€ _ ์„ ํƒ์ด
๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹จ์ผ ๋””์ŠคํŒจ์น˜ ๋„ํŠธ ์—ฐ์‚ฐ์ž ๋Œ€์‹  ๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜
๋Œ€๋ช…์‚ฌ ์ธ์ˆ˜์— ๋Œ€ํ•œ ๊ฐ„๊ฒฐํ•œ ๊ตฌ๋ฌธ์„ ๊ฐ–๋„๋ก ๊ฒฐ์ •ํ•˜๋„๋ก ๊ฐ•์š”ํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ๋žŒ๋“ค์ด ์ต์ˆ™ํ•œ SVO ๋ช…๋ น์„ ๋ณต๊ตฌํ•˜์‹ญ์‹œ์˜ค.

2015 ๋…„ 11 ์›” 17 ์ผ ํ™”์š”์ผ ์˜คํ›„ 12:09 Stefan Karpinski [email protected]
์ผ๋‹ค :

์•„๋งˆ๋„, ๊ทธ๋Ÿฌ๋‚˜ do-block์— ๋Œ€ํ•ด ๊ฐ™์€ ์ฃผ์žฅ์ด ๋งŒ๋“ค์–ด ์งˆ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
์ „๋ฐ˜์ ์œผ๋กœ ๊ตฌ๋ฌธ์€ ๋งค์šฐ ์„ฑ๊ณต์ ์ด๊ณ  ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋ฒกํ„ฐํ™”๋ฅผ์œ„ํ•œ ๋” ๋‚˜์€ ๊ตฌ๋ฌธ๊ณผ ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋˜ํ•œ ์•„๋‹™๋‹ˆ๋‹ค
์ „๋ก€๊ฐ€์—†๋Š” ๊ฒƒ โ€“ Scala๋Š” ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ _๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  Mathematica๋Š” #
๋น„์Šทํ•˜๊ฒŒ.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/JuliaLang/julia/issues/5571#issuecomment -157437223.

์ด๊ฒƒ์€ ํŠนํžˆ Boost์˜ ์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์†”๋ฃจ์…˜์ด์žˆ๋Š” C ++์—๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ _1, _2, _3 ๋ฅผ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : _1(x, y...) = x , _2(x, y, z...) = y ๋“ฑ). ์˜ˆ๋ฅผ ๋“ค์–ด fun(_1) ๋Œ€ํ•ด x -> fun(x) , fun ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋ช…์‹œ ์ ์œผ๋กœ ํ˜ธํ™˜๋˜๋„๋ก ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค (์ผ๋ฐ˜์ ์œผ๋กœ ๋งคํฌ๋กœ ํ˜ธ์ถœ์„ ํ†ตํ•ด fun ๊ฐ€ "๋žŒ๋‹ค ์œ ํ˜•์„ ํ—ˆ์šฉํ•˜๋„๋กํ•˜๋ ค๋ฉด "๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ).

Julia์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š”์ด ๊ฐ„๊ฒฐํ•œ ๋žŒ๋‹ค ํ‘œ๊ธฐ๋ฒ•์„ ์ •๋ง๋กœ ์›ํ•ฉ๋‹ˆ๋‹ค.
2f(_) ์—์„œ 2*(x -> f(x)) 2f(_) ํƒˆ๋‹นํ•˜๋Š” ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ "์ฒซ ๋ฒˆ์งธ ๊ทœ์น™์ด ์ ์šฉ๋˜๋Š” ๊ฒฝ์šฐ (์˜ˆ : f(_) )"์˜ ์ค„์„ ๋”ฐ๋ผ ๊ทœ์น™์„ ์ˆ˜์ • ํ•œ ๋‹ค์Œ ๋‹ค์‹œ f(_) ๊ฐ€ _ ์—ญํ• ์„ํ•˜๋Š” ๊ทœ์น™์„ ์žฌ๊ท€ ์ ์œผ๋กœ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์˜ˆ๋ฅผ ๋“ค์–ด f(g(_)) โ†’ x -> f(g(x)) ํ—ˆ์šฉ๋˜๋ฉฐ "๊ด„ํ˜ธ ๊ทœ์น™"์„ ์‚ฌ์šฉํ•˜๋ฉด ์›ํ•˜๋Š” ์ˆ˜์ค€์—์„œ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : f((g(_))) โ†’ f(x->g(x)) .

์ €๋Š” "๊ฐ„๊ฒฐํ•œ ๋žŒ๋‹ค ํ‘œ๊ธฐ๋ฒ•"์ด๋ผ๋Š” ์ด๋ฆ„์„ ๋งŽ์ด ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. (์นด๋ ˆ๋ณด๋‹ค ํ›จ์”ฌ ๋‚ซ์Šต๋‹ˆ๋‹ค).

๋‹ค์ค‘ ์ธ์ˆ˜ ๋žŒ๋‹ค๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ _1 , _2 , _3 ์˜ ๋ช…์‹œ ์„ฑ์„ ์ •๋ง ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์ผํ•œ ๋ฒ”์œ„์—์„œ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ... ๊ทธ๋ฆฌ๊ณ  _ ๊ฐ€ _ ๊ฐ™์€ ํ‘œํ˜„ _์—์„œ x์™€ y๊ฐ€๋˜๋Š” ๊ฒƒ์€ ๋ฏธ์นœ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด ๋™์ผํ•œ ๊ฐ„๊ฒฐํ•œ ์Šค์นผ๋ผ _ -syntax๊ฐ€ ์•ฝ๊ฐ„์˜ ํ˜ผ๋ž€์„ ์ผ์œผํ‚จ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค ( scala์—์„œ _์˜ ๋ชจ๋“  ์‚ฌ์šฉ ์ฐธ์กฐ).

๊ฒŒ๋‹ค๊ฐ€ ์ข…์ข… ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

x -> f(x) + g(x)

๋˜๋Š” ์œ ์‚ฌํ•˜๋ฉฐ ๋‹ค์Œ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ๋†€๋ž„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

f(_) + g(_)

๋˜ํ•œ ์ธ์ˆ˜์˜ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

x, y -> f(y, x)
f(_2, _1)  # can't do with other suggested _ syntax

๊ตฌ๋ฌธ์ด ๋ช…์‹œ ์  ์ต๋ช… ์ธ์ˆ˜ ๋ฒˆํ˜ธ ์ง€์ • ( _1 , _2 , _3 ... ๋“ฑ)์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ฃผ์š” ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. : ์ •ํ™•ํžˆ ์–ธ์ œ ๋ถ€๋ถ„์ ์œผ๋กœ ์ ์šฉ๋œ ํ•จ์ˆ˜๋ฅผ ๊ฐ„๊ฒฐํ•œ ๋žŒ๋‹ค๋กœ ์Šน๊ฒฉํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๋žŒ๋‹ค ๋ชธ์€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ์•„๋งˆ๋„ ์ผ์ข…์˜ ๋ณต์žกํ•œ ์Šน์ง„ ๊ทœ์น™์„ ์•”์‹œ ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋ช…์‹œ ์  (๊ตฌ๋ถ„ ๊ธฐํ˜ธ ํฌํ•จ) ์ธก๋ฉด์—์„œ ์˜ค๋ฅ˜๊ฐ€์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌด์—‡์„

foo(_1, _1 + _2  + f(_1, v1) + g(_2, v3), _3 * _2, v2) + g(_4, v4) +
 f(_2, v2) + g(_3, v5) + bar(_1, v6)

์ •ํ™•ํžˆ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ๊ตฌ๋ถ„ ๊ธฐํ˜ธ ( ฮป )๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข€ ๋” ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

ฮป(foo(_1, ฮป(_1 + _2)  + ฮป(f(_1, v1) + g(_2, v3)), _3 * _2, v2) + g(_4, v4)) + 
ฮป(f(_2, v2) + g(_3, v5) + bar(_1, v6))

์ด๊ฒƒ์€ ๋ถ„๋ช…ํžˆ MethodError: + has no method matching +(::Function, ::Function) ์ด์ง€๋งŒ ์ ์–ด๋„ ์ž‘์„ฑ๋œ ๋ฐฉ์‹์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” @StefanKarpinski ๊ฐ€ ํ‘œํ˜„์ด ํ•จ์ˆ˜ ๋ณธ๋ฌธ์ž„์„ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์•”์‹œํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฒ‰๋ณด๊ธฐ์— ๋ช…๋ฐฑํ•œ ๊ตฌ๋ฌธ ์œ„์น˜๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์„ ๋•Œ ๋ฌด์–ธ๊ฐ€์—์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ™”์‚ดํ‘œ ์šฐ์„  ์ˆœ์œ„๋Š” ์ด๋Ÿฌํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ช‡ ๊ฐ€์ง€ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ๋งํ•˜์ง€๋งŒ ํ™•์‹คํžˆ ์‹ ์ค‘ํ•œ ์ƒ๊ฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ฐ„๊ฒฐํ•จ๊ณผ ์ผ๋ฐ˜์„ฑ ๋ฐ ๊ฐ€๋…์„ฑ ์‚ฌ์ด์˜ ์ ˆ์ถฉ์•ˆ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ธฐ์กด์˜ -> ํ‘œ๊ธฐ๋ฒ•๋ณด๋‹ค ๋œ ๊ฐ„๊ฒฐํ•œ ๊ฒƒ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋˜ํ•œ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๊ฒฐํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ _ ์ธ์ˆ˜๋ฅผ ์บก์ฒ˜ํ•˜๋Š” -> ์˜ ์ ‘๋‘์‚ฌ ๋ฒ„์ „์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์˜ˆ

(-> 2f(_) + 1)

์ ‘๋‘์‚ฌ ํ˜•์‹์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์ƒ๋‹นํžˆ ๋‚ฎ์•„์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๊ด„ํ˜ธ๋ฅผ ์ƒ๋žต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

map(->_ + 1, x)

์ง€๊ธˆ์€ https://github.com/JuliaLang/julia/issues/5571#issuecomment -157424665 ๊ตฌํ˜„์„ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์•„๋งˆ ๋‹ค์Œ 12 ์‹œ๊ฐ„ ์•ˆ์— ๋๋‚ด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
(๋‹ค์Œ 24 ์‹œ๊ฐ„ ๋‚ด์—์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ€์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.)
์–ด์จŒ๋“ , ์ผ๋‹จ ์™„๋ฃŒ๋˜๋ฉด ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ๋†€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/JuliaLang/julia/issues/5571#issuecomment -157424665์—์„œ ๋‚˜์˜ค๋Š” ์ด์ƒํ•œ ๊ฒƒ

  • f(_,_) โ†’ x,y -> f(x,y) (ํ•ฉ๋ฆฌ์  ์ž„)
  • f(_,2_) โ†’ ??

    • f(_,2_) โ†’ x,y -> f(x,2y) (ํ•ฉ๋ฆฌ์ )

    • f(_,2_) โ†’ x-> f(x,y->2y) (๊ทœ์น™์ด ์ œ์•ˆํ•˜๋Š” ๋‚ด์šฉ๊ณผ ํ”„๋กœํ†  ํƒ€์ž…์ด ์ƒ์„ฑํ•˜๋Š” ๋‚ด์šฉ)

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์˜ณ์€์ง€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

์—ฌ๊ธฐ ์ œ ํ”„๋กœํ†  ํƒ€์ž…์ด ์žˆ์Šต๋‹ˆ๋‹ค.
http://nbviewer.ipython.org/gist/oxinabox/50a1e17cfb232a7d1908

์‹ค์ œ๋กœ ์ผ๋ถ€ ํ…Œ์ŠคํŠธ๋Š” ํ™•์‹คํžˆ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ AST ๊ณ„์ธต์—์„œ ๋ธŒ๋ผ์ผ€ํŒ…์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ข…์ข… (ํ•ญ์ƒ?) ์ด๋ฏธ ํ•ด๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ๊ฐ€์ง€๊ณ  ๋†€๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค

์œ ์šฉ ํ•  ์ˆ˜์žˆ๋Š” R์˜ magrittr์˜ ๋ช‡ ๊ฐ€์ง€ ๊ทœ์น™ :

์ฒด์ธ์ด. , ์ต๋ช… ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

. %>% `+`(1)

function (x) x + 1๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ์—๋Š” ๋‘ ๊ฐ€์ง€ ๋ชจ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
1) ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์‚ฝ์ž…ํ•˜๊ณ  ๋‚˜ํƒ€๋‚˜๋Š” ๋ชจ๋“  ์ ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
2) ๋‚˜ํƒ€๋‚˜๋Š” ์ ์—๋งŒ ์—ฐ๊ฒฐ.

๊ธฐ๋ณธ ๋ชจ๋“œ๋Š” ๋ชจ๋“œ 1์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ์ด ์—ฐ๊ฒฐ๋˜๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ธ์ˆ˜๋กœ ๋‹จ๋…์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋ฉด magrittr์€ ์ฒด์ธ์˜ ํ•ด๋‹น ๋‹จ๊ณ„์— ๋Œ€ํ•ด ๋ชจ๋“œ 2๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ

2 %>% `-`(1) 

2-1,

๊ณผ

1 %>% `-`(2, . )

๋˜ํ•œ 2-1์ž…๋‹ˆ๋‹ค.

๋ชจ๋“œ 2๋Š” ๋Œ€๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์„œ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

2 %>% { `-`(2, . - 1) }

2-(2-1)๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ชจ๋“œ 1๊ณผ ๋ชจ๋“œ 2 ์‚ฌ์ด๋ฅผ ํ˜„๋ช…ํ•˜๊ฒŒ ์ „ํ™˜ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์€ Julia๊ฐ€ ์ฒซ ๋ฒˆ์งธ ์œ„์น˜์— ์—ฐ๊ฒฐ๋  ๊ฐ€๋Šฅ์„ฑ์ด์žˆ๋Š” ๋…ผ์Ÿ์— ๋Œ€ํ•ด ์ผ๊ด€์„ฑ์ด ์—†๋‹ค๋Š” ๋ฌธ์ œ๋ฅผ ๊ฑฐ์˜ ์™„์ „ํžˆ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋Œ€๊ด„ํ˜ธ๊ฐ€ ์ฝ”๋“œ ๋ฉ์–ด๋ฆฌ๋ฅผ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ magrittr ๋งค๋‰ด์–ผ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

ํ™์ฑ„ %> %
{
n <-์ƒ˜ํ”Œ (1:10, ํฌ๊ธฐ = 1)
H <-๋จธ๋ฆฌ (., n)
T <-๊ผฌ๋ฆฌ (., n)
rbind (H, T)
} %> %
์š”์•ฝ

์ด๊ฒƒ์€ ํ˜„์žฌ๋กœ์„œ๋Š” ๋ฐ˜์ฏค ํ˜•์„ฑ๋œ ์•„์ด๋””์–ด์— ๋ถˆ๊ณผํ•˜์ง€๋งŒ, ๋ˆ„๋ฝ ๋œ ๊ฐ’์ด a๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก Tuple ์ƒ์„ฑ์ž๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ "๊ฐ„๊ฒฐํ•œ ๋žŒ๋‹ค"๋ฐ "๋”๋ฏธ ๋ณ€์ˆ˜"๋ฌธ์ œ๋ฅผ ๋™์‹œ์— ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ํŠœํ”Œ ๋Œ€์‹  ํŠœํ”Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋žŒ๋‹ค? ๋”ฐ๋ผ์„œ (_, 'b', _, 4) ๋Š” (x, y) -> (x, 'b', y, 4) ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ foo(a, b) " foo ๋ฅผ Tuple์— ์ ์šฉ ํ•˜๊ฑฐ๋‚˜ (a, b) ์ธ์ˆ˜๊ฐ€ ํ•จ์ˆ˜์ด๋ฉด foo ๋ฅผ ์ ์šฉํ•˜๋„๋ก ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์˜๋ฏธ๋ฅผ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๋ฉด foo(_, b, c)(1) ์ด apply(foo, ((x) -> (x, b, c))(1)) .

๋‚˜๋Š” ์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ์ค‘์œ„ ํ‘œ๊ธฐ๋ฒ• ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ฐœ์ธ์ ์œผ๋กœ ๊ด„ํ˜ธ๋กœ ๋ฌถ์ธ ํ•จ์ˆ˜ ํ˜ธ์ถœ์—์„œ๋งŒ ์ž‘๋™ํ•˜๋Š” ๊ฐ„๊ฒฐํ•œ ๋žŒ๋‹ค์— ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ 1 + _ ๋Š” ์ ˆ๋Œ€์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•ญ์ƒ +(1, _) ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jballanc ๊ทธ๋Ÿฌ๋‚˜ ํŠœํ”Œ ๊ตฌ์„ฑ๊ณผ ํ•จ์ˆ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋‘ ๊ฐ€์ง€ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ค„๋ฆฌ์•„์˜ ์˜๋ฏธ๋ก ์— ๋Œ€ํ•œ ๋‚˜์˜ ์ดํ•ด๊ฐ€ ์‹ฌ๊ฐํ•œ ๊ฒฐํ•จ์ด ์•„๋‹ˆ๋ผ๋ฉด.

@samuela ๋‚ด๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” foo(a, b) ์ด foo((a, b)...) ์™€ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ธ์ˆ˜๋Š” ์‹ค์ œ๋กœ Tuple์ด ์ƒ์„ฑ๋˜์ง€ ์•Š๋”๋ผ๋„ ๊ฐœ๋…์ ์œผ๋กœ Tuple๋กœ ๊ฐ„์ฃผ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ ์ด ํ† ๋ก ์„ ์ฝ์œผ๋ ค๊ณ ํ–ˆ์ง€๋งŒ ๋งํ•œ ๋ชจ๋“  ๋‚ด์šฉ์„ ์ถ”์ ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๊น๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ํ•„์š” ์ด์ƒ์œผ๋กœ ๋ฐ˜๋ณตํ•˜๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

do "๋งˆ๋ฒ•"์— ๋Œ€ํ•œ ๋ณด์™„์ฑ…์œผ๋กœ |> ๋ฅผ) ๋งŒ๋“œ๋Š” ๋ฐ ํˆฌํ‘œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ํ•œ, ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€

3 |> foo == foo(3) # or foo() instead of just foo, but it would be nice if the parentheses were optional
3 |> foo(1) == foo(1, 3)
3 |> foo(1,2) == foo(1,2,3)

์ฆ‰, a |> f(x) ๋Š” _last_ ์ธ์ˆ˜์— ๋Œ€ํ•ด f(x) do; a; end ๊ฐ€ _first_์— ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด map , filter , all , any ๋“ฑ๊ณผ ์ฆ‰์‹œ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. al., _ ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋ฒ”์œ„ ์ง€์ •์˜ ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ์ด๋ฏธ ์กด์žฌํ•˜๋Š” do ๊ตฌ๋ฌธ์„ ๊ณ ๋ คํ•  ๋•Œ ์ฝ”๋“œ ๋…์ž์—๊ฒŒ ๋ถˆํ•ฉ๋ฆฌํ•œ ๊ฐœ๋…์  ๋ถ€๋‹ด์„์ฃผ์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์€ ํŒŒ์ดํ”„ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ๋œ ๋™๊ธฐ๋Š” ์ˆ˜์ง‘ ํŒŒ์ดํ”„ ๋ผ์ธ (# 15612 ์ฐธ์กฐ)์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฏฟ์„ ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๊ฐ•๋ ฅํ•œ ๊ตฌ์กฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ, ๋งŽ์€ ์–ธ์–ด์—์„œ ๊ธฐ๋ฐ˜์„ ํ™•๋ณดํ•˜๊ณ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (์‚ฌ๋žŒ๋“ค์ด ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๊ณ  ๊ทธ๋“ค์€ ์ดํ•ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค).

์ด๊ฒƒ์ด https://github.com/MikeInnes/Lazy.jl ์˜ @>> ๋งคํฌ๋กœ์ž…๋‹ˆ๋‹ค .

@malmaud ์ข‹์•„์š” ! ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ด๋ฏธ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค : D

๊ทธ๋Ÿฌ๋‚˜์ด ๋‘ ๋ณ€ํ˜•์˜ ๊ฐ€๋…์„ฑ ์ฐจ์ด๋Š” ์ •๋ง ํฝ๋‹ˆ๋‹ค.

# from Lazy.jl
@> x g f(y, z)

# if this became a first-class feature of |>
x |> g |> f(y, z)

์ฃผ์š” ๊ฐ€๋…์„ฑ ๋ฌธ์ œ๋Š” ํ‘œํ˜„์‹ ๊ฐ„์˜ ๊ฒฝ๊ณ„๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜์žˆ๋Š” ์‹œ๊ฐ์  ๋‹จ์„œ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. x g ๋ฐ g f(x, ์˜ ๊ณต๋ฐฑ์ด ์ฝ”๋“œ์˜ ๋™์ž‘์— ์ƒ๋‹นํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ์ด์ง€๋งŒ ๊ณต๋ฐฑ์€ f(x, y) ์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@>> ์ด๋ฏธ ์กด์žฌํ•˜๋ฏ€๋กœ 0.5์—์„œ |> ์—์ด ๋™์ž‘์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ํƒ€๋‹นํ•ฉ๋‹ˆ๊นŒ?

(๋‚˜๋Š” ์—ฐ์‚ฐ์ž์˜ ํ‘œ๊ธฐ๋ฒ•์— ๋„ˆ๋ฌด ๋งŽ์€ ์—๋„ˆ์ง€๋ฅผ ์“ฐ๊ณ  ์‹ถ์ง€ ์•Š์œผ๋ฏ€๋กœ ํ‘œ๊ธฐ๋ฒ• ๋ฌธ์ œ์—๋งŒ์ด ์ œ์•ˆ์„ ๋ฌด์‹œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋‚˜ "ํŒŒ์ดํ•‘"์ด ์ด์— ๋Œ€ํ•œ ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ฐœ๋…์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (cf "์ปฌ๋ ‰์…˜ ํŒŒ์ดํ”„ ๋ผ์ธ"์ด๋ผ๋Š” ์šฉ์–ด), ์˜ˆ๋ฅผ ๋“ค์–ด F #์—์„œ๋Š” ์ด๋ฏธ |> ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ F # ํ•จ์ˆ˜๋Š” Julia ํ•จ์ˆ˜์™€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์˜๋ฏธ๊ฐ€ ์•ฝ๊ฐ„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.)

์˜ˆ, ํ™•์‹คํžˆ ๋‚˜๋Š” ๊ฐ€๋…์„ฑ ์ธก๋ฉด์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. |> ๊ฐ€ 0.5์—์„œ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ธฐ์ˆ ์ ์œผ๋กœ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ๋””์ž์ธ ์งˆ๋ฌธ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, Lazy.jl์˜ @>> ๋งคํฌ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ ํ•จ์ˆ˜๋ฅผ |> ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ํ . Lazy.jl์— ๋Œ€ํ•œ PR ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด 0.5 ๋˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. :) Julia ํŒŒ์„œ์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ์•Œ๊ณ  ์žˆ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฝค ๊ด‘๋ฒ”์œ„ํ•œ ๋ฉ˜ํ† ๋ง์„๋ฐ›์ง€ ์•Š๋Š” ํ•œ, ๊ทธ๊ฒƒ์„ ๋•๊ธฐ ์œ„ํ•ด |> ์˜ ํ–‰๋™์„ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•.

์ด ์Šค๋ ˆ๋“œ์—์„œ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋‹ค๋ฅธ ์ฒด์ธ ํŒจํ‚ค์ง€ ์ธ ChainMap.jl์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ _๋กœ ๋Œ€์ฒดํ•˜๊ณ  ์กฐ๊ฑด๋ถ€๋กœ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋งคํ•‘ ํ†ตํ•ฉ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. https://github.com/bramtayl/ChainMap.jl ์ฐธ์กฐ

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ์˜ ํ˜„์žฌ ๋‹ค์–‘ํ•œ ๋…ธ๋ ฅ ๋ชฉ๋ก ๋“ฑ
๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (์ด์ƒ์ ์œผ๋กœ๋Š” ์˜๊ฒฌ์„ ๋งํ•˜๊ธฐ ์ „์—, ๊ทธ๋Ÿฌ๋‚˜ w / e)
๊ทธ๋“ค์€ ๋ชจ๋‘ ์•ฝ๊ฐ„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
(๋‚˜๋Š” ์—ฐ๋Œ€์ˆœ์œผ๋กœ ์ฃผ๋ฌธํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค).

ํŒจํ‚ค์ง€

๋น„ ํŒจํ‚ค์ง€ ํ”„๋กœํ†  ํƒ€์ž…

๊ด€๋ จ :


์•„๋งˆ๋„ ์ด๊ฒƒ์€ ์ƒ์œ„ ๊ฒŒ์‹œ๋ฌผ ์ค‘ ํ•˜๋‚˜์—์„œ ํŽธ์ง‘๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ ๋‚ ์งœ : 2020 ๋…„ 4 ์›” 20 ์ผ

์ด๊ฒƒ์€ ๋ถ€๋ถ„์  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ์‹ค์ œ ์‹œ๋„๋ณด๋‹ค ์œ ํ˜• ์‹œ์Šคํ…œ ์‹คํ—˜์— ๊ฐ€๊น์ง€๋งŒ ์—ฌ๊ธฐ์— ์ด์ƒํ•œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค : https://gist.github.com/fcard/b48513108a32c13a49a387a3c530f7de

์šฉ๋ฒ•:

include("partial_underscore_generated.jl")
using GeneratedPartial

const sub = partialize(-)
sub(_,2)(1) == 1-2
sub(_,_)(1,2) == 1-2
sub(_,__)(1)(2) == 1-2
sub(__,_)(2)(1) == 1-2 #hehehe

# or
<strong i="8">@partialize</strong> 2 Base.:+ # evily inserts methods in + and allows partializations for 2 arguments
(_+2)(1) == 1+2

# fun:
sub(1+_,_)(2,3) == sub(1+2,3)
sub(1+_,__)(2)(3) == sub(1+2,3)
(_(1)+_)(-,1) == -1+1

# lotsafun:
appf(x::Int,y::Int) = x*y
appf(f,x) = f(x)
<strong i="9">@partialize</strong> 2 appf

appf(1+_,3)(2) == appf(1+2,3)
appf(?(1+_),3) == appf(x->(1+x), 3)
appf(?sub(_,2),3) == appf(x->x-2,3) # I made a method *(::typeof(?),::PartialCall), what of it!!?

# wooooooooooooooooooooooooooooooooo
const f = sub
f(_,f(_,f(_,f(_,f(_,f(_,f(_,f(_,f(_,_)))))))))(1,2,3,4,5,6,7,8,9,10) == f(1,f(2,f(3,f(4,f(5,f(6,f(7,f(8,f(9,10)))))))))
f(_,f(__,f(___,f(____,f(_____,f(______,f(_______,f(________,f(_________,__________)))))))))(1)(2)(3)(4)(5)(6)(7)(8)(9)(10) == f(1,f(2,f(3,f(4,f(5,f(6,f(7,f(8,f(9,10)))))))))

# this answers Stefan's concern (which inspired me to make this hack in the first place)
#
#    const pmap = partialize(map)
#    map(f(_,a),   v) == map(x->f(x,a), v)
#    pmap(?f(_,a), v) == map(x->f(x,a), v)
#    pmap(f(_,a),  v) == x->map(f(x,a), v)
#
# it adds a few other issues, of course...


ํ™•์‹คํžˆ ๊ตฌํ˜„ ์ œ์•ˆ์€ ์•„๋‹ˆ์ง€๋งŒ ๊ฐ€์ง€๊ณ  ๋…ธ๋Š” ๊ฒƒ์ด ์žฌ๋ฏธ ์žˆ๊ณ  ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ข‹์€ ์•„์ด๋””์–ด์˜ ์ ˆ๋ฐ˜์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”์‹  @partialize ๋Š” ์ •์ˆ˜ ๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด ๋ฐ ๋ฒ”์œ„์—์„œ๋„ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค.

<strong i="15">@partialize</strong> 2:3 Base.:- # partialized for 2 and 3 arguments!

(_-_-_)(1,2,3) == -4
(_-_+_)(1,2,3) == +2

์ข‹์•„์š”, ์ €๋Š” ํ•จ์ˆ˜ ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. IMO๋Š” SISO ์ผ€์ด์Šค์—์„œ ๋ช…ํ™•ํ•˜์ง€๋งŒ ์ž‘์€ ์ฒด์ธ ์ฝ”๋“œ ๋ธ”๋ก์—์„œ Julia์˜ MISO (์ค€ MIMO?)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” REPL์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์ด. ๊ท€์—ฝ๊ณ  ๋ฉ‹์ ธ์š”. MATLAB์ด๋‚˜ python ๋˜๋Š” ์…ธ์ฒ˜๋Ÿผ ์‹คํ—˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ํŒจํ‚ค์ง€ ๋‚˜ ํŒŒ์ผ์—์„œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€ ์—ฌ๋Ÿฌ ์ค„์˜ ์ฝ”๋“œ๋ผ๋„ REPL์— ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ ๋„ฃ๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. REPL์€ ๋ชจ๋“  ๋ผ์ธ์—์„œ ๊ทธ๊ฒƒ์„ ํ‰๊ฐ€ํ•˜๊ณ  ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ชจ๋“  ํ‘œํ˜„์‹ ๋‹ค์Œ์— ans ๋ฐ˜ํ™˜ / ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  MATLAB ์‚ฌ์šฉ์ž๋Š”์ด๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (์ด ๋‹จ๊ณ„์—์„œ๋Š” ์ž˜๋ชป๋œ ์ฃผ์žฅ์ž…๋‹ˆ๋‹ค!). ์•„๋งˆ๋„ ๋Œ€๋ถ€๋ถ„์˜ Julia ์‚ฌ์šฉ์ž๋Š” ์ „์— ๋ณด๊ฑฐ๋‚˜ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด๊ฐ€ ์œ„์—์„œ ์“ด ๊ฒƒ์— ๋˜ ๋‹ค๋ฅธ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ณ  ์กฐ๊ฐ ํ˜„๋ช…ํ•œ ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ๋…ธ๋Š” ์ด์ƒํ•œ ์ƒํ™ฉ์—์„œ ans ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ์ข…์˜ ํŒŒ๊ดด์ ์ธ ๊ฒƒ์„ ์‹ซ์–ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ํ•œ ํ”ผํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ _every_ ์ œ์•ˆ์€ ๋‹จ์ง€ ํ•œ ๋‹จ๊ณ„์˜ ๊ตฌ์„ฑ์˜ ๋ฐ˜ํ™˜ ์ˆ˜๋ช…์„ ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ _ ๋งˆ๋ฒ•์ด๋ž€ _odd_์— ๋ถˆ๊ณผํ•˜์ง€๋งŒ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋™์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŒจํ‚ค์ง€์—์„œ REPL๋กœ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๊ณ  ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ _๋ณด๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ _ ๋งˆ๋ฒ• ๊ฐ™์ง€ ์•Š์€ ๊ตฌ๋ฌธ์„ ์›ํ•œ๋‹ค๋ฉด ๋‹ค์Œ์„ ์ œ์•ˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<strong i="12">@repl_compose</strong> begin
   sin(x)
   ans + 1
   sqrt(ans)
end

ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ์ถœ๋ ฅ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ์ค„์— ans[1] , ans[2] ๋“ฑ์„ ์‚ฝ์ž… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ๋‹จ์ผ ์ˆ˜์ค€์˜ ์ปดํฌ์ง€์…˜ ๋ชจ๋ธ ์ธ Julia์˜ MISO ๋ชจ๋ธ์— ์ž˜ ๋งž์œผ๋ฉฐ ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ ์ด๋ฏธ _ ๋งค์šฐ ํ‘œ์ค€์ ์ธ Julia ๊ตฌ๋ฌธ _์ž…๋‹ˆ๋‹ค.

๋งคํฌ๋กœ๋Š” ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Expr(:block, exprs...) ๋ฅผ Expr(:block, map(expr -> :(ans = $expr), exprs) ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค (์ฒ˜์Œ์—๋Š” let ans ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ ๋˜๋Š” ๋ญ”๊ฐ€?). ๊ธฐ์ง€์— ์‚ฌ๋Š” ๊ฒƒ์€ _ ์žˆ์ง€ _ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (ํ•˜์ง€๋งŒ REPL์€ Julia์— ๋‚ด์žฅ๋˜์–ด ์žˆ๊ณ  ๊ทธ๊ฒƒ๊ณผ ํ•จ๊ป˜๊ฐ‘๋‹ˆ๋‹ค).

์–ด์จŒ๋“  ๋‚ด ๊ด€์ ! ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์˜ค๋žซ๋™์•ˆ ๋ณด์ง€ ๋ชปํ•œ ๊ธด ์‹ค์ด์—ˆ์Šต๋‹ˆ๋‹ค!

๋˜ํ•œ ๋ชจ๋“  ํ‘œํ˜„์‹ ํ›„์— ans๋ฅผ ๋ฐ˜ํ™˜ / ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  MATLAB ์‚ฌ์šฉ์ž๋Š”์ด๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (์ด ๋‹จ๊ณ„์—์„œ๋Š” ์ž˜๋ชป๋œ ์ฃผ์žฅ์ž…๋‹ˆ๋‹ค!).

์‚ฌ์‹ค, ๋‹ค๋ฅธ ์ธ์ˆ˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค _ ๊ธฐ๋Šฅ ์ฒด์ธ์— ์‚ฌ์šฉ๋˜๋Š” ๋‹ค์Œ REPL๋„ ๋ฐ˜ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค _ ๋ณด๋‹ค๋Š” ans (๋‚˜๋ฅผ ์œ„ํ•ด,์ด ์ œ๊ฑฐ์— ์ถฉ๋ถ„ํ•˜๋‹ค "๋งˆ๋ฒ•").

_ ๋ฅผ ์–ธ์–ด์—์„œ "๊ทธ๊ฒƒ์˜ ๊ฐ€์น˜"๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋‹นํ•œ ์„ ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์€ ํ• ๋‹น์„ ๋ฒ„๋ฆฌ๋Š” ์ด๋ฆ„์œผ๋กœ _ ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ ๋žŒ๋‹ค์— ๋Œ€ํ•ด ์ œ์•ˆ ๋œ ์•„์ด๋””์–ด์™€ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด Lazy.jl ์–ด๋”˜๊ฐ€์— <strong i="5">@as</strong> and begin ... ๋กœ ์กด์žฌํ•œ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ์— . ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์•„์ด๋””์–ด๋Š” ๋Œ€ํ™” ์ดˆ๋ฐ˜์— ํ๊ธฐ๋˜์—ˆ์ง€๋งŒ ์œ ์šฉ์„ฑ์— ๋Œ€ํ•œ ์˜ค๋žœ ์—ญ์‚ฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž์˜ ํ•™์Šต ๊ณก์„ ์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ์ค‘์š”ํ•œ ์ด์œ ๋Š”

type Track
  hit::Array{Hit}
end
type Event
  track::Array{Track}
end

event.track[12].hit[43]

track ๋ฐ hit ๊ฐ€ ๋‹จ์ˆœํ•œ ๋ฐฐ์—ด ์ผ ๋•Œ ์ด๋ฒคํŠธ์˜ 12 ๋ฒˆ์งธ ํŠธ๋ž™์˜ 43 ๋ฒˆ์งธ ํžˆํŠธ๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ

event.getTrack(12).getHit(43)

๋™์ ์œผ๋กœ ์ œ๊ณต๋˜์–ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋˜‘๊ฐ™์€ ๊ฒƒ์„ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋งํ•˜๊ณ  ์‹ถ์ง€ ์•Š์•„

getHit(getTrack(event, 12), 43)

๋” ๊นŠ์ด ๊ฐˆ์ˆ˜๋ก ๋” ๋‚˜๋น ์ง‘๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹จ์ˆœํ•œ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ์ฒด์ธ (a la Spark)๋ณด๋‹ค ์ธ์ˆ˜๋ฅผ ๋” ๋„“๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Rust์˜ ํŠน์„ฑ ์— ๋Œ€ํ•ด ๋ฐฉ๊ธˆ ๋ฐฐ์› ๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ์ด ๊ธ€์„ ์“ฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ์ด์œ ๋กœ Julia์—์„œ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค„๋ฆฌ์•„์ฒ˜๋Ÿผ ๋…น ์ „์šฉ ๋ฐ์ดํ„ฐ๊ฐ€ structs (์ค„๋ฆฌ์•„ type ),ํ•˜์ง€๋งŒ ๊ทธ๋“ค์€ ๋˜ํ•œ์ด impl a์˜ ์ด๋ฆ„์œผ๋กœ ๊ธฐ๋Šฅ์„ ๋ฐ”์ธ๋”ฉ struct . ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ํ•œ, ๊ทธ๊ฒƒ์€ ์ˆœ์ˆ˜ํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์ด์ง€๋งŒ ์œ„์—์„œ ์„ค๋ช…ํ•œ ์  ํ‘œ๊ธฐ๋ฒ•์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

impl Event {
  fn getTrack(&self, num: i32) -> Track {
    self.track[num]
  }
}

impl Track {
  fn getHit(&self, num: i32) -> Track {
    self.track[num]
  }
}

์ค„๋ฆฌ์•„์—์„œ๋Š”

impl Event
  function getTrack(self::Event, num::Int)
    self.track[num]
  end
end

impl Track
  function getHit(self::Track, num::Int)
    self.hit[num]
  end
end

์œ„์˜ ์ œ์•ˆ ๋œ ๊ตฌ๋ฌธ์€ self ํ•ด์„์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ธ์ˆ˜ ์ผ ๋ฟ์ด๋ฏ€๋กœ ๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜์™€ ์ถฉ๋Œ์ด ์—†์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. self ์˜ ์ตœ์†Œ โ€‹โ€‹ํ•ด์„์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜์˜ ์œ ํ˜•์„ ์•”์‹œ ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ::Event ๋ฐ ::Track ๋ฅผ ์ž…๋ ฅ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•ด์„์„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ข‹์€ ์ ์€ "์ •์  ๋ฉ”์„œ๋“œ"๊ฐ€ self ๊ฐ€์—†๋Š” impl ํ•จ์ˆ˜๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (Rust๋Š” new ๊ณต์žฅ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.)

Rust์™€ ๋‹ฌ๋ฆฌ Julia๋Š” types ์— ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ค‘๋ณต์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด impls ์— ์œ ์‚ฌํ•œ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€ OOP๋Š” type ์™€ impl ๋ฉ”์†Œ๋“œ ๊ณ„์ธต์„ ์ •ํ™•ํžˆ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์„œ ๊ตฌ์ถ• ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ,์ด ์—„๊ฒฉํ•œ ๋ฏธ๋Ÿฌ๋ง์€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•ด ํ•œ ๊ฐ€์ง€ ๋ˆ์  ๊ฑฐ๋ฆฌ๋Š” ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. getTrack ๋ฐ getHit ๋Œ€์‹  impl ์—์„œ ํ•จ์ˆ˜ ์ด๋ฆ„์„ track ๋ฐ hit ๋กœ ์ง€์ • impl ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค track ๋ฐ hit ์—์„œ type . ๊ทธ๋Ÿฌ๋ฉด event.track ๊ฐ€ ๋ฐฐ์—ด์ด๋‚˜ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๊นŒ? ์ฆ‰์‹œ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋ช…ํ™•ํ™”์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ types ๋Š” Function ๊ฐœ์ฒด๋„ ํฌํ•จ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ํฌ๊ด„์  ์ธ ๊ทœ์น™์„ ์ ์šฉ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์  ๋‹ค์Œ์— ํ•ด๋‹นํ•˜๋Š” impl ๋ฅผ ๋จผ์ € ํ™•์ธํ•œ ๋‹ค์Œ ํ•ด๋‹นํ•˜๋Š” type ?

๋‹ค์‹œ ์ƒ๊ฐํ•˜๋ฉด ๊ฐœ๋…์ ์œผ๋กœ ๋™์ผํ•œ ๊ฐ์ฒด ( type ๋ฐ impl )์— ๋Œ€ํ•ด ๋‘ ๊ฐœ์˜ "ํŒจํ‚ค์ง€"๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ดํ•˜์‹ญ์‹œ์˜ค.

function Event.getTrack(self, num::Int)
  self.track[num]
end

๊ฒฐํ•ฉํ•˜๋Š” ๊ธฐ๋Šฅ getTrack ์œ ํ˜•์˜ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ Event ๋˜๋„๋ก

myEvent.getTrack(12)

(myEvent, 12) ?์— ์ ์šฉ๋œ ํ•จ์ˆ˜์™€ ๋™์ผํ•œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์€ function ํ‚ค์›Œ๋“œ ๋’ค์˜ typename-dot-functionname ๊ตฌ๋ฌธ๊ณผ ๊ทธ ํ•ด์„ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋œ ์œ ํ˜•๊ณผ ๋™์ผํ•œ ๊ฒฝ์šฐ (๋˜๋Š” ์œ„์™€ ๊ฐ™์ด ์•”์‹œ ์ ์œผ๋กœ ๋‚จ๊ฒจ์ง„ ๊ฒฝ์šฐ) Python๊ณผ ์œ ์‚ฌํ•œ self ์ด๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ "์ •์  ๋ฉ”์„œ๋“œ"๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฐ”์ธ๋”ฉ ๋œ ์œ ํ˜•๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ž…๋ ฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@jpivarski ์  ๊ตฌ๋ฌธ (์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์œผ๋ฉด ๋งŽ์€ ๋‹จ์ ์ด ์žˆ์Œ)์ด ์ฒด์ธ์„ ํ—ˆ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๊ตฌ๋ฌธ๋ณด๋‹ค ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์—ฌ์ „ํžˆ do ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ƒ์„ฑ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐ |> )์ด ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

event |> getTrack(12) |> getHit(43)

๋‚ด๊ฐ€ ๋” ์ž˜ ๋  ์ˆ˜ ๋…น์˜ ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ๊ฐ™์€ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณผ ์ˆ˜์žˆ๋Š” ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ๊ฐ™์€ ๊ฒƒ๋“ค์„ ํ•  ์ˆ˜์žˆ์„ ์ˆ˜ ์žˆ๋„๋ก์ด ํšจ๊ณผ์ ์œผ๋กœ ๊ธฐ๋Šฅ์„์œ„ํ•œ ๊ณต๊ฐ„์œผ๋กœ ์™ผ์ชฝ์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค parser.parse ๊ธฐ์กด๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š๊ณ  Julia Base.parse ํ•จ์ˆ˜. Rust ์ œ์•ˆ๊ณผ Hack ์Šคํƒ€์ผ ํŒŒ์ดํ•‘์„ ๋ชจ๋‘ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

@tlycken ์šฐ์„  ์ˆœ์œ„์— ๋”ฐ๋ผ ๋ชจํ˜ธํ•œ ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค.
|> ๋Œ€ ํ˜ธ์ถœ์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ํžŒํŠธ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
(๋˜๋Š” ์ œ์•ˆ ๋œ ๋‹ค๋ฅธ ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.)

์ค‘ํžˆ ์—ฌ๊ธฐ๋‹ค

foo(a,b) = a+b
foo(a) = b -> a-b

2 |> foo(10) == 12   #Pipe Precedence > Call Precedence 
2 |> foo(10) == 8     #Pipe Precedence < Call Precedence   

@oxinabox ์‹ค์ œ๋กœ "๋‹จ์ง€"์ •๊ทœ ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹ˆ๋ผ ์–ธ์–ด์˜ ๊ตฌ๋ฌธ ์š”์†Œ๋ผ๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. 2 |> foo(10) desugars to foo(10, 2) ๊ฑฐ์˜ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ foo(10) do x; bar(x); end desugars to foo(x -> bar(x), 10) . ์ด๋Š” ํ†ตํ™” ์šฐ์„  ์ˆœ์œ„๋ณด๋‹ค ํŒŒ์ดํ”„ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค (๋‚ด ์ƒ๊ฐ์—๋Š” ์–ด์จŒ๋“  ๊ฐ€์žฅ ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค).

๊ตฌ๋ฌธ์˜ ์ฃผ์ œ๋กœ ๋ณผ ๋•Œ . ๋Š” ์‹œ๊ฐ์ ์œผ๋กœ ๋œ ๊ฑฐ์Šฌ ๋ฆฌ๊ณ  |> ๋ณด๋‹ค ํ™•์‹คํžˆ ๋” ํ‘œ์ค€ ์ ์ž…๋‹ˆ๋‹ค. ๊ณต๋ฐฑ์—†์ด (๊ฐ๊ฐ ํ•œ ๋ฌธ์ž ์”ฉ) . ๋กœ ๊ตฌ๋ถ„ ๋œ ์œ ์ฐฝํ•œ ํ•จ์ˆ˜ ์ฒด์ธ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ˆ„๊ตฌ๋‚˜ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. |> ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ณต๋ฐฑ (๊ฐ ๋ฌธ์ž 4 ๊ฐœ)์„ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์‹œ๊ฐ์  ์†๋„ ํ–ฅ์ƒ์ด๋ฉ๋‹ˆ๋‹ค. ์‰˜ ์Šคํฌ๋ฆฝํŒ…์˜ | ๋Œ€ํ•œ ๋น„์œ ๋Š” ์ข‹์ง€๋งŒ > ๋•Œ๋ฌธ์— ์ฆ‰์‹œ ์ธ์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฝ๊ณ  ์ ์— ๋Œ€ํ•œ ์ฃผ์žฅ์€ type ์—์„œ ๋ฉค๋ฒ„ ๋ฐ์ดํ…€์„ ๊ฐ€์ ธ์™€์•ผํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด impl (๋‚ด ์ฒซ ๋ฒˆ์งธ ์ œ์•ˆ)์—์„œ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€์•ผํ•˜๋Š”์ง€ ๋ชจํ˜ธํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค (์ œ ๋‘ ๋ฒˆ์งธ ์ œ์•ˆ)? ๋‘ ๋ฒˆ์งธ ์ œ์•ˆ์—์„œ, ํ•จ์ˆ˜๋Š”์— ์˜ํ•ด ์ƒ์„ฑ ๋œ ํ•จ์ˆ˜์˜ ์ด๋ฆ„ ๊ณต๊ฐ„ ์ •์˜ type _after_ ์ •์˜๋˜์–ด์•ผ type ๋Š” ๋ฐ”๋กœ ๋ฉค๋ฒ„ ๋ฐ์ดํ…€์„ ์••๋„ํ•˜๋Š” ๊ฒƒ์„ ๊ฑฐ๋ถ€ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •์˜๋œ๋‹ค.

๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์  (์ œ ๋‘ ๋ฒˆ์งธ ์ œ์•ˆ)๊ณผ |> ๋ชจ๋‘ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์œ ์ฐฝํ•œ ์—ฐ๊ฒฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ชฉ์ ๊ณผ ํšจ๊ณผ๊ฐ€ ๋‹ค์†Œ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ„์—์„œ ์„ค๋ช…ํ•œ |> ๋Š” do ์™€ ์™„์ „ํžˆ ๋Œ€์นญ์ด ์•„๋‹™๋‹ˆ๋‹ค. do ๋Š” ์ฑ„์šฐ๋Š” ์ธ์ˆ˜๊ฐ€ ํ•จ์ˆ˜ ์—ฌ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. event |> getTrack(12) |> getHit(43) ๋ผ๊ณ  ๋งํ•˜๋ฉด |> ๋Š” ๋น„ ํ•จ์ˆ˜ ( Events ๋ฐ Tracks )์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

event |> getTrack(12) |> getHit(43) ๋ผ๊ณ  ๋งํ•˜๋ฉด |> ๋Š” ๋น„ ํ•จ์ˆ˜์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค ( Events ๋ฐ Tracks ).

์‹ค์ œ๋กœ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์™ผ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜๋กœ ์‚ฝ์ž…ํ•˜์—ฌ _ ์˜ค๋ฅธ์ชฝ์—์žˆ๋Š” ํ•จ์ˆ˜ ์ฃผ๋ฌธ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. event |> getTrack(12) ์€ (๋Š”) ์™ผ์ชฝ์—์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์˜ค๋ฅธ์ชฝ์—์žˆ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— getTrack(12, event) ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ a) ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ณด๋‹ค ์šฐ์„  ์ˆœ์œ„ (ํ˜ธ์ถœ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์—), b) ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆœ์„œ ( getHit(43, getTrack(12, event)) ๋Œ€์‹  getHit(43, getTrack(12), event) )๋ฅผ ์˜๋ฏธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. .

ํ•˜์ง€๋งŒ getTrack's ์„œ๋ช…์€

function getTrack(num::Int, event::Event)

๋”ฐ๋ผ์„œ event |> getTrack(12) event ๋ฅผ getTrack's ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜์— ์‚ฝ์ž…ํ•˜๋ฉด Function ์•„๋‹Œ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜์— Event ๋„ฃ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ do ์™€ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๋™๋“ฑํ•œ ๊ฒƒ์„ ์‹œ๋„ํ–ˆ๊ณ  Julia 0.4๋Š” ์ธ์ˆ˜๊ฐ€ ํ•จ์ˆ˜ ์—ฌ์•ผํ•œ๋‹ค๊ณ  ๋ถˆํ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. (์•„๋งˆ๋„ ๋•Œ๋ฌธ์— do event end ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค event , ๋Œ€์‹  event ์ž์ฒด.)

๋‚˜์—๊ฒŒ ํ•จ์ˆ˜ ์ฒด์ธ์€ ์  ( . ) ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ๋…ผ์˜๋˜๊ณ ์žˆ๋Š” ๋‚ด์šฉ๊ณผ๋Š” ๋ณ„๊ฐœ์˜ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, @jpivarski , ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์—†์ด Julia์˜ Rust์—์„œ ์–ธ๊ธ‰ ํ•œ ๋งŽ์€ ๊ฒƒ์„ ์ด๋ฏธ ๋‹ฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type TownCrier
  name::AbstractString
  shout::Function

  function TownCrier(name::AbstractString)
    self = new(name)
    self.shout = () -> "HELLO, $(self.name)!"
    self
  end
end

tc = TownCrier("Josh")
tc.shout()                                #=> "HELLO, Josh!"
tc.name = "Bob"
tc.shout()                                #=> "HELLO, Bob!"

๋Œ€ํ™”๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๋ฐฉํ•ดํ•˜์ง€ ์•Š๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๊ฒƒ์€ Julia์—์„œ ํšจ์œจ์ ์ธ ํ•จ์ˆ˜ ์ปค๋ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ์ปค๋ฆฌํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ํ•จ์ˆ˜ ์ฒด์ธ์—์„œ ์ธ์ˆ˜์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ด ์‚ฌ๋ผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์œ„์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋Š” ๊ธฐ๋Šฅ ๋ณธ์ฒด๋ฅผ ์ง€์ •ํ•˜๊ณ  ๋‹จ์ˆœํžˆ ๊ตฌ์„ฑ์‹œ "self"๋กœ ์ปค๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ๋‹ค๋ฉด ๋” ๊นจ๋—ํ•ฉ๋‹ˆ๋‹ค.

@andyferris ์ €๋Š” Python์„ ์‚ฌ์šฉํ•ด ์™”์œผ๋ฉฐ ์ด์ „ ํ‘œํ˜„์‹์˜ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ•˜๋Š” _๋ฅผ ์ •๋ง ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๊ธฐ๋Šฅ ๋‚ด์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘ ๋ธ”๋ก, ํ•จ์ˆ˜ ๋“ฑ ์–ด๋””์—์„œ๋‚˜ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ฒด์ธ์„ ์™„์ „ํžˆ ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜ ์ˆœ์„œ์— ๋Œ€ํ•œ ๋ชจํ˜ธํ•จ์„ ๋‚จ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด

begin
    1
    vcat(_, 2)
    vcat(3, _)
end

# [3, 1, 2]

@MikeInnes๊ฐ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด @_ ์—์„œ ์ด๋ฏธ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์›๋ž˜ ๊ทธ๋ ‡๊ฒŒ ์ž‘๋™ํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ChainMap.jl๋„ ์ง€๊ธˆ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค).

๋ฐ”๋ผ๊ฑด๋Œ€, ์ด๊ฒƒ์€ ์ ์–ด๋„ ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ ์  ์œตํ•ฉ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

begin
    [1, 2, 3]
    .+(_, 2)
    .*(_, 2)
    .-(10, _)
end

๋˜๋Š” @chain_map ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ

begin
    ~[1, 2, 3]
    +(_, 2)
    *(_, 2)
    -(10, _)
end

ํ˜„์žฌ ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ์ž ๋‚ด๋ถ€์— ์ •์˜ ๋œ ๊ฒฝ์šฐ ๊ฐ์ฒด์™€ ํ•จ์ˆ˜ ์ฒด์ธ์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Obj.times ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

type Obj
    x
    times::Function
    function Obj(x)
       this = new(x)
       this.times =  (n) -> (this.x *= n; this)
       this
    end
end

>>>Obj(2).times(3)
Obj(6,#3)

์œ ํ˜• ์ •์˜ ์™ธ๋ถ€์— ์ •์˜ ๋œ ๋ฉค๋ฒ„ ํ•จ์ˆ˜ (ํŠน์ˆ˜ ํ•จ์ˆ˜)์˜ ๊ตฌํ˜„์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด, Obj.times ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.

member function times(this::Obj, n)
     this.x *= n
     return this
end

>>>Obj(2).times(3)
Obj(6,#3)

์—ฌ๊ธฐ์„œ member ๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํŠน์ˆ˜ ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค.
๋ฉค๋ฒ„ ํ•จ์ˆ˜๋Š” ๊ฐœ์ฒด ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๊ฐœ์ฒด ๋ณ€์ˆ˜ ๋’ค์— ์ ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
์•„์ด๋””์–ด๋Š” ์œ ํ˜• ์ •์˜ ์™ธ๋ถ€์— ์ •์˜ ๋œ "๋ฉค๋ฒ„"ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ์ž ๋‚ด๋ถ€์— ์ •์˜ ๋œ ํ•จ์ˆ˜์˜ ๋™์ž‘์„ ์žฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์€ ๊ฒƒ์€ Rust์—์„œ ๋ฉ”์†Œ๋“œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉ ํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ OO ์–ธ์–ด ์—์„œ์ฒ˜๋Ÿผ ์ฒด์ธ์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐœ๋…์ ์œผ๋กœ ํ•จ์ˆ˜ ์ฒด์ธ๊ณผ ๊ตฌ๋ณ„๋ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ฝ๊ณ  ๋ช‡ ๊ฐ€์ง€ ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ์ฝ์—ˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์— ๋‚ด ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ฒด์ด๋‹ :
in1 |> function1
๊ฐ™์Œ : in1 |> function1(|>)

in2 |> function2(10)
๋™์ผ : in2 |> function2(|>,10)

๋” ๋งŽ์€ ์—ฐ๊ฒฐ :
in1 |> function1 |> function2(10,|>)

์ฒด์ธ ๋ถ„๊ธฐ ๋ฐ ๋ณ‘ํ•ฉ :
๋ถ„๊ธฐ๋กœ ๋‘ ๋ฒˆ ๋ถ„๊ธฐ out1 , out2 :
function1(a) |out1>
function2(a,b) |out2>

๋ถ„๊ธฐ out1 ๋ฐ out2 :
function3(|out1>,|out2>)

๊ฒŒ์œผ๋ฆ„์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?
function!(mutating_var) ์ปจ๋ฒค์…˜๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?
๊ฒŒ์œผ๋ฅธ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ function?() ...

๊ทธ๋ฆฌ๊ณ  ๋“ค์—ฌ ์“ฐ๊ธฐ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๊ด€๋ จ ํ˜ธ์ถœ ๊ทธ๋ž˜ํ”„์—์„œ ๋ฐ์ดํ„ฐ ์ข…์†์„ฑ์„ ์‹œ๊ฐ์ ์œผ๋กœ ์‰ฝ๊ฒŒ ์ถ”์  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ๊ธฐ์กด |> ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ ์—ฐ๊ฒฐ ํŒจํ„ด์„ ๊ฐ€์ง€๊ณ  ๋†€์•˜์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
````์ค„๋ฆฌ์•„

ํ•„ํ„ฐ

๋ถˆ๋ณ€ MyFilter {F}
flt :: F
์ข…๋ฃŒ

ํ•จ์ˆ˜ (mf :: MyFilter) (์†Œ์Šค)
ํ•„ํ„ฐ (mf.flt, ์†Œ์Šค)
์ข…๋ฃŒ

function Base.filter (flt)
๋งˆ์ด ํ•„ํ„ฐ (flt)
์ข…๋ฃŒ

์ทจํ•˜๋‹ค

๋ถˆ๋ณ€ MyTake
n :: Int64
์ข…๋ฃŒ

function (mt :: MyTake) (์†Œ์Šค)
take (source, mt.n)
์ข…๋ฃŒ

function Base.take (n)
MyTake (n)
์ข…๋ฃŒ

์ง€๋„

๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ MyMap {F}
f :: F
์ข…๋ฃŒ

ํ•จ์ˆ˜ (mm :: MyMap) (์†Œ์Šค)
์ง€๋„ (mm.f, ์†Œ์Šค)
์ข…๋ฃŒ

function Base.map (f)
๋งˆ์ด ๋งต (f)
์ข…๋ฃŒ
enable this to work: ์ค„๋ฆฌ์•„
1:10 |> filter (i-> i % 2 == 0) |> take (2) |> map (i-> i ^ 2) |> ์ˆ˜์ง‘
`` Essentially the idea is that functions like filter return a functor if they are called without a source argument, and then these functors all take one argument, namely whatever is "coming" from the left side of the |> . The |>``๊ทธ๋Ÿฐ ๋‹ค์Œ์ด ๋ชจ๋“  ํŽ‘ํ„ฐ๋ฅผ ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

filter ๋“ฑ์€ ํ•˜๋‚˜์˜ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ์˜ต์…˜ ์ค‘ ์–ด๋Š ๊ฒƒ์ด ๋” ์„ฑ๋Šฅ์ด ์ข‹์€์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด ์˜ˆ์ œ์—์„œ ๋‚˜๋Š” ๋ฎ์–ด์žˆ์–ด map(f::Any) ์ž๋ฃŒ, ์ •๋ง ๊ธฐ์กด์˜ ์ •์˜๋ฅผ ์ดํ•ดํ•˜์ง€ ์•Š๋Š” map does ...

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

์ด๊ฒƒ์€ ์ž„์˜์˜ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฉฐ MyF๊ฐ€ ์ •์˜ ๋œ ๊ธฐ๋Šฅ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๊นŒ?

์˜ˆ,์ด ๊ธฐ๋Šฅ์€ ์˜ตํŠธ ์ธ ๊ธฐ๋Šฅ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ์†”๋ฃจ์…˜์€ ์•„๋‹ˆ๋ฉฐ ์–ด๋–ค ์˜๋ฏธ์—์„œ๋Š” ๋ฒกํ„ฐํ™”์™€ ๊ฐ™์€ ์ด์•ผ๊ธฐ์ด์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ๋ฐ”๋ผ๋Š” ๋ชจ๋“  ๊ฒƒ์ด 1.0์— ์ ํ•ฉํ•˜์ง€๋Š” ์•Š๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ์ด ํŒจํ„ด์€ ์‚ฌ๋žŒ๋“ค์ด ์˜์กดํ•ด์•ผํ•˜๋Š” ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋งคํฌ๋กœ.

๋ณธ์งˆ์ ์œผ๋กœ ์•„์ด๋””์–ด๋Š” ํ•„ํ„ฐ์™€ ๊ฐ™์€ ํ•จ์ˆ˜๊ฐ€ ์†Œ์Šค ์ธ์ˆ˜์—†์ด ํ˜ธ์ถœ๋˜๋ฉด functor๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด๋Ÿฌํ•œ functor๋Š” ๋ชจ๋‘ ํ•˜๋‚˜์˜ ์ธ์ˆ˜, ์ฆ‰ |>์˜ ์™ผ์ชฝ์—์„œ "์˜ค๋Š”"์ธ์ˆ˜๋ฅผ๋ฐ›์Šต๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒ ๋ณต์žก ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋Š” ํด๋กœ์ €๋กœ ์ปค๋ง์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Base.map(f)    = (xs...) -> map(f, xs...)
Base.filter(f) = x -> filter(f, x)
Base.take(n)   = x -> take(x, n)

๋ฌผ๋ก  ์ด๊ฒƒ์€ ๋ชจ๋“  ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฏ€๋กœ ํŒจํ‚ค์ง€๊ฐ€ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ์ž‘์—…์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋‹จํŽธ์ ์œผ๋กœํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ฆฌ ์ง๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋…ผ์Ÿ์ด ์šฐ์„ ๋˜์–ด์•ผํ•ฉ๋‹ˆ๊นŒ?

์œ„์—์„œ ๋…ผ์˜ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ ๊ตฌ๋ฌธ ์†”๋ฃจ์…˜์„ ์„ ํ˜ธํ•˜์—ฌ f(a, _, b) ์„ x -> f(a, x, b) ๋‚ฎ ์ถฅ๋‹ˆ ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ„์˜ ๊ธด ๋…ผ์˜์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๊นŒ๋‹ค ๋กญ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒ ๋ณต์žก ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋Š” ํด๋กœ์ €๋กœ ์ปค๋ง์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์œ„์—์„œ ์ด๋ฏธ ์ œ์•ˆํ–ˆ์ง€๋งŒ์ด ๋‘˜ ์‚ฌ์ด์— ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์ธ์ˆ˜๊ฐ€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ ธ์•ผํ•ฉ๋‹ˆ๊นŒ?

์˜ˆ, ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ filter ๋ฐ take ์™€ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฒฝ์šฐ์—๋Š” ์ปฌ๋ ‰์…˜์„ ์ฒซ ๋ฒˆ์งธ๋กœ, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ ๋ฐ˜๋ณต์ž์™€ ๊ฐ™์€ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ด๋‹น ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๋‹ต๋ณ€์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

_ ๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํŠน์ˆ˜ ๊ธฐํ˜ธ๊ฐ€๋˜๋ฉด

์˜ˆ, ๋” ์ผ๋ฐ˜์ ์ธ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋‹ค๋Š” ๋ฐ ์ „์ ์œผ๋กœ ๋™์˜ํ•˜๋ฉฐ @malmaud๊ฐ€ ๊ทธ๋Ÿด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋กœ์ €๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์–ด์จŒ๋“  ์†์œผ๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— perf diff๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์€ ๋‹จ์ง€ ์ปค๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์‹ ์„ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ( curry(f, as...) = (bs...) -> f(as..., bs...) ). ๊ทธ๊ฒƒ์€์ง€๋„์™€ ํ•„ํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ณผ๊ฑฐ์—๋Š” curry(take, _, 2) ์™€ ๊ฐ™์€ ์„ผํ‹ฐ๋„ฌ ๊ฐ’์„ ๊ตฌํ˜„ํ•˜๋Š” curry ๊ตฌํ˜„ ์ œ์•ˆ์ด์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ํ˜„์žฌ D, Elixir, ๊ทธ๋ฆฌ๊ณ  Julia์˜ ์„ธ ๊ฐ€์ง€ ์–ธ์–ด๋ฅผ ๋ฐฐ์šฐ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ์™”์Šต๋‹ˆ๋‹ค. D์—๋Š” Rust์—์„œ์™€ ๊ฐ™์ด ๊ท ์ผ ํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ตฌ๋ฌธ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Elixir์—๋Š” ํŒŒ์ดํ”„ ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฌ๊ธฐ์—์„œ ์ œ์•ˆํ•œ ํ•จ์ˆ˜ ์ฒด์ธ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ๊ณ  ์ŠคํŠธ๋ฆผ ๋ฐ ๊ธฐํƒ€ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„ ๋ผ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ํ›จ์”ฌ ๋” ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ์–ธ์–ด ๋ชจ๋‘์—์„œ์ด ๊ธฐ๋Šฅ์„ ์ •๋ง ์ข‹์•„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ์ค„๋ฆฌ์•„์˜ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ž์Šต์„œ ๋งŒ ๋ณด์•˜์ง€๋งŒ ์ค„๋ฆฌ์•„๋„ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ” ๋ž๊ธฐ ๋•Œ๋ฌธ์— ์ฆ‰์‹œ์ด ๊ธฐ๋Šฅ์„ ๊ฒ€์ƒ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ์ด๊ฒƒ์ด ์ œ ์ธก์˜์ด ๊ธฐ๋Šฅ ์š”์ฒญ์— ๋Œ€ํ•œ +1์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…• ์—ฌ๋Ÿฌ๋ถ„,

์ด ๊ธฐ๋Šฅ ์š”์ฒญ์„ +1ํ•˜๋„๋ก ํ—ˆ์šฉ ํ•ด์ฃผ์„ธ์š”. ์ด๊ฒƒ์€ ๋งค์šฐ ์ ˆ์‹คํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ Scala ๊ตฌ๋ฌธ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

Array(1,2,3,4,5)
  .map(x => x+1)
  .filter(x => x > 5)
  .reduce(_ + _)

Spark ๋˜๋Š” ๊ธฐํƒ€ MapReduce ๊ธฐ๋ฐ˜ ๋น… ๋ฐ์ดํ„ฐ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•œ ์‚ฌ๋žŒ๋“ค์€์ด ๊ตฌ๋ฌธ์— ๋งค์šฐ ์ต์ˆ™ ํ•  ๊ฒƒ์ด๋ฉฐ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ํฌ๊ณ  ๋ณต์žกํ•œ ์ž‘์—…์„ ์ž‘์„ฑํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋น„๊ต์  ์˜ค๋ž˜๋œ R์กฐ์ฐจ๋„ ๋‹ค์Œ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

c(1,2,3,4,5) %>%
  {. + 1} %>%
  {.[which(. > 5)]} %>%
  sum

๊ฐ€์žฅ ์˜ˆ์˜์ง€๋Š” ์•Š์ง€๋งŒ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋Œ€์ฒด๋ฌผ๋กœ ์ฝ”๋“œ ๋ธ”๋ก์„ ํ˜„๋ช…ํ•˜๊ฒŒ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. Julia์—์„œ๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[1,2,3,4,5] |> 
  _ -> map(__ -> __ + 1, _) |>
  _ -> filter(__ -> __ < 5, _) |>
  _ -> reduce(+, _)

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋”์ฐํ•˜๊ณ  ์ถ”์•…ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ ์ฝ”๋“œ๋ฅผ ์Šค์นผ๋ผ๋กœ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค๋ฉด ํŒŒ์ดํ”„ ์—ฐ์‚ฐ์ž๋Š” ๋งค์šฐ ์ค‘์š”ํ•ด์ง‘๋‹ˆ๋‹ค. _ ๋ช…์‹œ ์™€์ผ๋“œ ๋“ฑ ์‚ฌ์šฉ๋˜๋Š” ์•Š๋Š” ๋‹จ์ˆœํ•œ ์†”๋ฃจ์…˜์€ _first argument_ ํ”ผ๋“œ์— ํŒŒ์ดํ”„ํ•˜์ง€๋งŒ ๊ฒฝ์šฐ์—๋งŒ ๋‚˜์„ map ์ฒซ๋ฒˆ์งธ ์ธ์ˆ˜ ๋ฐ ๊ธฐ๋Šฅ ๋“ฑ์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ทจํ•  ๋ณ€๊ฒฝ๋œ ๋‘ ๋ฒˆ์งธ๋กœ.

๊ณผ๋„ํ•œ _ -> _ + 1 ๋ฐ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด Scala์˜ Array(1,2,3).map(_ + 1) ์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ๋„ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. [1,2,3] |> map(~ + 1, _) ์ด map(~ -> ~ + 1, [1,2,3]) ๋ฒˆ์—ญ๋˜๋Š” ์œ„์˜ ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. ์ฐพ์•„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

ํ›„์ž์˜ ๊ฒฝ์šฐ ๊ฐ„๋‹จํ•œ ๊ตฌ๋ฌธ์œผ๋กœ ๋ฐฉ์†กํ•˜๋Š” [1, 2, 3] .+ 1 ๊ฝค ์ค‘๋…์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ•์†Œ (๋ฐ ํ•„ํ„ฐ๋ง)์™€ ๊ฐ™์€ ๊ฒƒ์€ ์—„์ฒญ๋‚˜๊ฒŒ ๋ฉ‹์ง€์ง€๋งŒ ํฐ ์š”์ฒญ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

ํŒŒ์ดํ•‘๊ณผ do ๋‘˜ ๋‹ค ์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜ ์ธ์ˆ˜๋ฅผ ์œ„ํ•ด ์‹ธ์šฐ๋Š” ์ ์— ์œ ์˜ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์Šค๋ ˆ๋“œ์— ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์˜จ๋‹ค๋Š” ๊ฒƒ์„ ์ƒ๊ธฐ์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ ๋‘ ๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ผ ์ œ์•ˆ ๋œ ๊ตฌ๋ฌธ์„ ํ–ฅํ•ด julia์˜ ๊ธฐ๋ณธ SISO ํŒŒ์ดํ•‘ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ™•์žฅ์„ ์ œ๊ณตํ•˜๋Š” FIVE ํŒจํ‚ค์ง€.
๋ชฉ๋ก ์ฐธ์กฐ : https://github.com/JuliaLang/julia/issues/5571#issuecomment -205754539

์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜ ์ธ์ˆ˜๋ฅผ ์œ„ํ•ด ํŒŒ์ดํ•‘๊ณผ ํˆฌ์Ÿ์„ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

๋ฒ ์ด์Šค์—์„œ ์ถ”๊ฐ€ ๋ฐฐ๊ด€ ๊ธฐ๋Šฅ์„ ์–ป์œผ๋ ค๋ฉด _ ๋“ฑ์œผ๋กœ ํ‘œ์‹œ๋œ ์œ„์น˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ฒซ ๋ฒˆ์งธ๊ฐ€ ์•„๋‹ˆ๋ผ ์ตœ์ข… ์œ„์น˜์— ๋…ผ์Ÿ์„ ์ถ”๊ฐ€ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์€ "์นด๋ ˆ / ๋ถ€๋ถ„ ์ ์šฉํ•˜๋Š” ์ฒ™"

์œ„์˜ ๋‚ด ๊ฒŒ์‹œ๋ฌผ์€ ๋ฌธ์ œ์˜ ๊ตฌ๋ฌธ ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

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

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

๋‚˜๋Š” ์ตœ๊ณ ์˜ ๋””์ž์ธ์ด ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋‹จ์ˆœํžˆ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ํ˜„์žฌ ์กด์žฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ •๊ตํ•œ ๊ตฌ๋ฌธ์„ ๊ณ ๋ คํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ Juno์™€ Julia 0.6์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

```{์ค„๋ฆฌ์•„}
LazyCall ์‚ฌ์šฉ
@lazy_call_module_methods ๊ธฐ๋ณธ ์ƒ์„ฑ๊ธฐ
@lazy_call_module_methods ๋ฐ˜๋ณต์ž ํ•„ํ„ฐ

ChainRecursive ์‚ฌ์šฉ
start_chaining ()

```{julia}
[1, 2, 3, 4, 5]
<strong i="14">@unweave</strong> ~it + 1
Base.Generator(it)
<strong i="15">@unweave</strong> ~it < 5
Iterators.filter(it)
reduce(+, it)

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์˜๊ฒฌ์—์„œ ๋ณธ ๋ช‡ ๊ฐ€์ง€ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
https://stackoverflow.com/questions/44520097/method-chaining-in-julia

@somedadaism , ๋ฌธ์ œ๋Š” ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ ์งˆ๋ฌธ์„ "๊ด‘๊ณ "ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฌธ์ œ๋ฅผ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ Julia-people์€ https://discourse.julialang.org/ ์—์„œ SO์™€ (๋”์šฑ ๊ทธ๋ ‡๋‹ค) ๋งค์šฐ ํ™œ๋™์ ์ž…๋‹ˆ๋‹ค

์ด๋Ÿฐ,์ด๊ฒŒ ์–ผ๋งˆ๋‚˜ ๋ณต์žก ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฏฟ๊ธฐ์ง€๊ฐ€ ์•Š๋„ค์š”. ๊ดœ์ฐฎ์€ ๊ตฌ๋ฌธ์˜ ๊ฒฝ์šฐ +1. ๋‚˜์—๊ฒŒ ํŒŒ์ดํ”„์˜ ์ฃผ์š” ์šฉ๋„๋Š” ๋ฐ์ดํ„ฐ (ํ”„๋ ˆ์ž„) ์ž‘์—…์ด๊ธฐ๋„ํ•ฉ๋‹ˆ๋‹ค. dplyr์„ ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ์ฒซ ๋ฒˆ์งธ / ๋งˆ์ง€๋ง‰์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ํŒจํ‚ค์ง€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๋ฐ›์•„๋“ค์ด๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์  ์ธ์ˆ˜๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ฐ™์€ ๊ฒƒ์— +1

1 |> sin |> sum(2, _)

์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๊ฐ€๋…์„ฑ๊ณผ ๋‹จ์ˆœ์„ฑ์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ์œ„ํ•ด ์ผํ•˜๋Š” ์ „์ฒด dplyr / tidyverse ์Šคํƒ€์ผ์„ ๋†“์น˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ Elixir์˜ ์—ฌ๋Ÿฌ ์ค„ ๊ตฌ๋ฌธ๋„ ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

1
|> sin
|> sum(2)
|> println

println(sum(sin(1),2))

์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์„ธ๊ณ„์˜ ์ œ์•ˆ์— ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค. _ ๋˜๋Š” ~ ๋Œ€์‹  ? ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.์ด ์—ฐ์‚ฐ์ž๋Š” ์ด๋ฏธ ( _ ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ~ ๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. not or formular). ํ˜„์žฌ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์™€ ๋™์ผํ•œ ? ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ปค๋ง ์ž๋ฆฌ ํ‘œ์‹œ ์ž์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ทธ๋“ค์˜ ์ œ์•ˆ์ด ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€์ž…๋‹ˆ๋‹ค (์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์— ์žˆ์ง€๋งŒ julia์—์„œ๋„ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค :)

const addOne = add(1, ?); // apply from the left
addOne(2); // 3

const addTen = add(?, 10); // apply from the right
addTen(2); // 12

// with pipeline
let newScore = player.score
  |> add(7, ?)
  |> clamp(0, 100, ?); // shallow stack, the pipe to `clamp` is the same frame as the pipe to `add`.

const maxGreaterThanZero = Math.max(0, ...);
maxGreaterThanZero(1, 2); // 2
maxGreaterThanZero(-1, -2); // 0

๋‚ด๊ฐ€ ๋‹ค๋ฅธ ์ด์œ ๋กœ ์“ฐ๊ธฐ ์‹œ์ž‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์š”์•ฝ.
๊ด€๋ จ ํŒจํ‚ค์ง€ ์ฃผ์„ ๋ชฉ๋ก ๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

https://github.com/JuliaLang/julia/pull/20328 ์ด๊ธฐ ๋•Œ๋ฌธ์— _ ์—‰๋ง์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ 1.x์—์„œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์€ ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์˜ต์…˜์œผ๋กœ ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค (ํ˜„์žฌ ์ƒํƒœ ์ œ์™ธ).
๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ (๋ชจ๋“  ์˜๋„์™€ ๋ชฉ์ ์„ ์œ„ํ•ด) ๊ตฌ๋ฌธ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๋งคํฌ๋กœ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

_ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ anon ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

@StefanKarpinski ์˜ Terse Lambdas ๋˜๋Š” ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์—์„œ _ (RHS ํ‘œํ˜„์‹์—์„œ)์˜ ์กด์žฌ๋Š” ์ „์ฒด ํ‘œํ˜„์‹์ด ์ต๋ช… ํ•จ์ˆ˜์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

  • ์ด๊ฒƒ์€ ๋งคํฌ๋กœ ์ฐธ์กฐ๋กœ ๊ฑฐ์˜ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ํ•  ์ˆ˜์—†๋Š” ๊ฒƒ์€ (_) ์ด _ ์™€ ๊ฐ™์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ์‹๋ณ„ ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ์‹ค์ œ๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    • ์ด๊ฒƒ์€ ๋ชจ๋“  ๊ณณ์—์„œ ์ ์šฉ๋  ๊ฒƒ์ด๋ฏ€๋กœ |> ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์˜ˆ๋ฅผ ๋“ค์–ด map(log(7,_), xs) ๋˜๋Š” log(7, _).(xs) ์™€ ๊ฐ™์ด ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•˜์—ฌ ๊ฐ ์š”์†Œ์˜ ๊ธฐ๋ณธ 7๋กœ ๋กœ๊ทธ๋ฅผ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒฝ์šฐ์—๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค xs .

    • ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์ด๋“ ํ•œ๋‹ค๋ฉด ๊ฐœ์ธ์ ์œผ๋กœ ์ด๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

|> ๋กœ ์—‰๋ง์ด๋˜์–ด ๋Œ€์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • RHS๊ฐ€ ์นด๋ ˆ์ฒ˜๋Ÿผ ํ–‰๋™ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด

    • ์‹ค์ œ๋กœ ๋‚˜๋Š” ์ด๊ฒƒ์ด ๊นจ์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (์•„๋งˆ๋„ ๋ฉ”์†Œ๋“œ ํ…Œ์ด๋ธ”์„ ํ™•์ธํ•˜๋Š” non-breaking ๋ฒ„์ „์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.)

  • _ ํŠน๋ณ„ํ•˜๊ฒŒ ๋งŒ๋“œ์„ธ์š” (์œ„์˜ ์˜ต์…˜ ๋ฐ / ๋˜๋Š” ์žฌ ์ž‘์„ฑ์„ ํ†ตํ•ด ๊ฐ€์งœ๋กœ ๋งŒ๋“œ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ• ์ฐธ์กฐ)

    • ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ์ค‘์œ„ ๋งคํฌ๋กœ ์ƒ์„ฑ์„ ํ—ˆ์šฉ ํ•œ ๋‹ค์Œ @|>@ ํ•˜๊ณ  ํŒจํ‚ค์ง€์—์„œ ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ด๋ฏธ https://github.com/JuliaLang/julia/ ๋ฌธ์ œ / 11608)

    • ๋˜๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ํŠน๋ณ„ํ•œ ์†์„ฑ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

  • ๊ด€๋ จ ํŒจํ‚ค์ง€ ๋ชฉ๋ก์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜๋งŽ์€ ๋งคํฌ๋กœ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ (๋‹ค๋ฅธ ๋ชจ๋“  ์—ฐ์‚ฐ์ž์™€๋Š” ๋‹ฌ๋ฆฌ) ๋ผ์ธ์ด ๋๋‚˜์ง€ ์•Š๊ธฐ ์ „์— ์ค„์— ํ‘œํ˜„์‹์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
|> f
|>g

ํ˜„์žฌ๋ณด๋‹ค๋Š” :

a |>
f |>
g

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

  • ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์ œ์•ˆ์ด |> (์ด๋ฏธ ์‹ซ์–ดํ•˜๋Š” ์—ฐ์‚ฐ์ž) ์Šˆํผ ๋งˆ์ˆ ์„ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์‹ซ๋‹ค.

ํŽธ์ง‘ : @StefanKarpinski ๊ฐ€ ์•„๋ž˜ ์—์„œ ์ค‘์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
๋ˆ„๊ตฐ๊ฐ€๊ฐ€ typeof(|>) <: Function ์— ์˜์กด ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ๋ณ€ํ™”๋Š” ๊ทธ๊ฒƒ์„ ์–ธ์–ด ๊ตฌ๋ฌธ์˜ ์š”์†Œ๋กœ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ณด๋„ˆ์Šค ์˜ต์…˜ : ์ ˆ๋Œ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ์˜ต์…˜ : ๋ชจ๋“  ๊ณณ์— ์ปค๋ง ์ถ”๊ฐ€ # 554

์นด๋ ˆ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ์—๋Š” ์–ธ์–ด๊ฐ€ ๋„ˆ๋ฌด ๋Šฆ์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์€ ๋ฏธ์นœ ํŒŒ๊ดด๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , ์‚ฌ๋ฐฉ์— ์—„์ฒญ๋‚œ ๋ชจํ˜ธํ•จ์„ ๋”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋งค์šฐ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•˜์‹ญ์‹œ์˜ค.

์ด ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์œผ๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณ ๋ คํ•  ๊ฐ€์น˜๊ฐ€์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
๋‚˜๋Š” ๋‹ค๋ฅธ ํ†ต์ฐฐ๋ ฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค (์ฆ‰, "+1์ด ์ด๊ฒƒ์„ ์›ํ•œ๋‹ค"๊ฑฐ๋‚˜ ์œ„์˜ ๋ฏธ์„ธ ๋ณ€์ด์˜ ๋ฐ˜๋ณต์„ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์Œ).

๋‚˜๋Š” 0.7์—์„œ |> ๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‚˜์ค‘์— ํŒŒ์ดํ”„๊ฐ€ ์ž˜ ์ž‘๋™ํ•˜๋„๋กํ•˜๋Š” ๋ฐ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋” ์œ ์šฉํ•˜๊ณ  ์•„๋งˆ๋„ ๋น„ ๊ธฐ๋Šฅ์  ์˜๋ฏธ๋ก ์œผ๋กœ ๋„์ž… ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” 0.7์—์„œ |>๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‚˜์ค‘์— ํŒŒ์ดํ”„๊ฐ€ ์ž˜ ์ž‘๋™ํ•˜๋„๋กํ•˜๋Š” ๋ฐ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋” ์œ ์šฉํ•˜๊ณ  ์•„๋งˆ๋„ ๋น„ ๊ธฐ๋Šฅ์ ์ธ ์˜๋ฏธ๋กœ ๋„์ž… ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๋ชฉ๋ก์—์„œ ์œ ์ผํ•œ ๊ตฌ๋ถ„์€ |> ๊ฐ€ ์˜ค๋ฅธํŽธ์ด ์นด๋ ˆ ์ธ ์ฒ™ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ธ์ˆ˜๋ฅผ ์ฒซ ๋ฒˆ์งธ ๋˜๋Š” ๋งˆ์ง€๋ง‰ ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜ ์œ„์น˜ (/ s) ๋˜๋Š” ๋‹ค๋ฅธ ๊ณ ์ • ์œ„์น˜ (๋‘ ๋ฒˆ์งธ๊ฐ€ ์˜๋ฏธ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Œ)์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
์‚ฝ์ž… ํ•  ์ธ์ˆ˜์˜ ๋งˆ์ปค๋กœ _ ๋ฅผ ์‚ฌ์šฉ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค .

์ด ์Šค๋ ˆ๋“œ์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ง‰์—ฐํ•˜๊ฒŒ ์ง„์ง€ํ•˜๊ฒŒ ๋ฐ›์•„ ๋“ค์ธ ๋‹ค๋ฅธ ์ œ์•ˆ์€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. |
๊ทธ ์ž‘์—…์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ํ•ฉ๋ฆฌ์ ์ด์ง€๋งŒ ๊นจ๋œจ๋ฆฌ๋Š” ์ •์˜๊ฐ€ ์žˆ๋‹ค๋ฉด ๋†€๋ž„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ง€๋‚œ 4 ๋…„ ๋™์•ˆ ์•„๋ฌด๋„ ์ œ์•ˆํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ๊ทธ๊ฒƒ์„ ๋น„๋‚œํ•˜๋Š” ๊ฒƒ์€ ๋”์ฐํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€๋Š” ์—ฌ์ „ํžˆ ๋งคํฌ๋กœ ํŒจํ‚ค์ง€ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ†ตํ•ด ๊ทธ๊ฒƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์•„์ด๋””์–ด๋Š” ๊ณ„์† ๋  ์ˆ˜ |> ํ˜„์žฌ์˜ ํ–‰๋™๊ณผ ๊ฐ™์€ ์‹œํ”„ํŠธ ํ‚ค์˜ ์‚ฌ์šฉ์„ ํ•„์š”๋กœํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์†Œ๊ฐœ \\ ํ•˜์ง€ ์•Š๋Š” ( ์ง€๊ธˆ์€ ์—ฐ์‚ฐ์ž๋กœ ๊ตฌ๋ฌธ ๋ถ„์„). ์šฐ๋ฆฌ๋Š” ์Šฌ๋ž™์—์„œ ํ•œ ๋ฒˆ ์ด์•ผ๊ธฐํ–ˆ์ง€๋งŒ ์—ญ์‚ฌ๋Š” ์•„๋งˆ๋„ ์‹œ๊ฐ„์˜ ๋ชจ๋ž˜๋กœ ์žƒ์–ด๋ฒ„๋ฆฐ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŒŒ์ดํ•‘์€ ์ข…์ข… ๋Œ€ํ™”์‹์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ์šด์˜์ž์˜ ์ž…๋ ฅ ์šฉ์ด์„ฑ์€ ์‚ฌ์šฉ๊ฐ์ด "๊ฐ€๋ฒผ์›€"์— ์˜ํ–ฅ์„์ค๋‹ˆ๋‹ค. ๋‹จ์ผ ๋ฌธ์ž | ๋„ ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ผ ๋ฌธ์ž | ๋„ ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€ํ™”์‹์œผ๋กœ ์˜ˆ,ํ•˜์ง€๋งŒ .juliarc.jl (๋‚ด๊ฐ€ ์˜ค๋žซ๋™์•ˆ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ;-p)์—์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

Shift ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋งค์šฐ ๋กœ์ผ€์ผ ์ข…์† ์†์„ฑ์ด๋ผ๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚ด ์Šค์›จ๋ด์–ด ํ‚ค๋ณด๋“œ๋Š” ๋‹ค๋ฅธ ์„ธ ๊ธ€์ž๋ฅผ์œ„ํ•œ ๊ณต๊ฐ„์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋ฌธ์ž์™€ AltGr ์กฐํ•ฉ์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ชฉ์ ์œผ๋กœ |> ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ „ํ†ต์ด ์žˆ์Šต๋‹ˆ๊นŒ? [Mathematica] (http://reference.wolfram.com/language/guide/Syntax.html)์—๋Š” ์ ‘๋ฏธ์‚ฌ ๊ธฐ๋Šฅ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„์œ„ํ•œ // ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํ‚ค๋ณด๋“œ์—์„œ ์‰ฝ๊ฒŒ ์ž…๋ ฅ ํ•  ์ˆ˜ ์žˆ๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์„ (C ++์—์„œ์™€ ๊ฐ™์ด) ๋˜๋Š” ์ •์ˆ˜ ๋‚˜๋ˆ„๊ธฐ (Python์—์„œ์™€ ๊ฐ™์ด)์—๋Š” ์•„์ง ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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

์ด ๋ชฉ์ ์œผ๋กœ |>๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ „ํ†ต์ด ์žˆ์Šต๋‹ˆ๊นŒ?

|> ์˜ ์ „ํ†ต์€ ML ๊ณ„์—ด ์–ธ์–ด์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šด์˜์ž์™€ ๊ด€๋ จํ•˜์—ฌ ML / Haskell ์ปค๋ฎค๋‹ˆํ‹ฐ์ฒ˜๋Ÿผ์ด ๊ณต๊ฐ„์„ ํƒ์ƒ‰ ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ :

  • http://www.mlton.org/InfixingOperators โ€“ ML์˜ ์ค‘์œ„ ์—ฐ์‚ฐ์ž ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์™ผ์ชฝ / ์˜ค๋ฅธ์ชฝ ์„น์…˜ / ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ /> , \> , </ , <\ ์—ฐ์‚ฐ์ž ๋ชจ์Œ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

  • http://lambda.jstolarek.com/2012/03/function-composition-and-dollar-operator-in-haskell/ โ€“ . ์‚ฌ์šฉํ•œ ํ•จ์ˆ˜ ๊ตฌ์„ฑ ๋ฐ $ ์‚ฌ์šฉํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ๋น ๋ฅธ ๊ฐœ์š” |> ๋Š” ์ฃผ์„ ์ค‘ ํ•˜๋‚˜์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.)

  • https://haskell-lang.org/tutorial/operators โ€“ >>= , =<< , >> ์˜ Monad ์ œํ’ˆ๊ตฐ์„ ํฌํ•จํ•˜์—ฌ ์žฌ๋ฏธ์žˆ๋Š” ์—ฐ์‚ฐ์ž์˜ ์ „์ฒด ์ปฌ๋ ‰์…˜์ด ํฌํ•จ ๋œ Haskell ์—ฐ์‚ฐ์ž ์šฉ์–ด์ง‘ >=> ๋ฐ <=< .

์œ„์˜ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด R์€ %> %๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์–ธ์–ด๋Š” ์˜ค๋ž˜๋˜์—ˆ์ง€๋งŒ ํŒŒ์ดํ”„ ๊ธฐ๋Šฅ์€ ๋งค์šฐ ์ž˜ ์„ค๊ณ„๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋Š” ์ค‘๊ด„ํ˜ธ ๊ตฌ๋ฌธ์œผ๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

x %>% { if(. < 5) { a(.) } else { b(.) } }

๊ทธ๊ฒƒ์€ end ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— Julia์—์„œ ์ข€ ๋” ์žฅํ™ฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ๋Š” ์ถ”์ƒ์ ์ด์ง€๋งŒ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ์˜ ์ œ์•ˆ์ด ๋…ผ์˜๋˜๊ณ ์žˆ๋Š” ์ƒํƒœ์—์„œ ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ„์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ๋‹ฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ > ๊ธฐํ˜ธ์™€ ๊ฐ™์ด ์ธ์ˆ˜๊ฐ€ ์•ž์œผ๋กœ ํŒŒ์ดํ”„๋˜๊ณ  ์žˆ๋‹ค๋Š” ์‹œ๊ฐ์  ํ‘œ์‹œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํŒŒ์ดํ”„ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ดˆ๋ณด์ž์™€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•œ ๋‹จ์„œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

|> ์˜ ์ œ์•ˆ ๋œ ์‚ฌ์šฉ์ด ํ˜„์žฌ์˜ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ๊ตฌ๋ฌธ๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋”๋ผ๋„ |> ์—ฐ์‚ฐ์ž๊ฐ€๋˜๋Š” ๊ฒƒ๊ณผ๋Š” ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์€ |> ํ›จ์”ฌ ๋” ๋งŽ์ด ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•œ ์ค‘์œ„ ํ•จ์ˆ˜๋ณด๋‹ค ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค. x |> f |> g ๋ฅผ g(f(x)) ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์œ ์ง€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋„ ์ผ๋ฐ˜ ์—ฐ์‚ฐ์ž๋กœ๋‘๋ฉด ์ถ”๊ฐ€ ๊ฐœ์„  ์‚ฌํ•ญ์ด ์ œ์™ธ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. |> ๋ฅผ postfix ํ•จ์ˆ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋น„ ์—ฐ์‚ฐ์ž๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋™์•ˆ ์—ฐ๊ฒฐ ํ•จ์ˆ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ _typical_ ์‚ฌ์šฉ์„ ์ค‘๋‹จํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ |> ์˜ _atypical_ ์‚ฌ์šฉ์„ ์ค‘๋‹จํ•˜๋ฏ€๋กœ ์—ฌ์ „ํžˆ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์šด์˜์ž๋ผ๋Š” ๊ฒƒ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๋น„์ •ํ˜• ์‚ฌ์šฉ ์ค‘๋‹จ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ค‘๋‹จ๋˜๋ฏ€๋กœ 1.x ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ํ•œ |> ๋กœ ์œ„์˜ ์ œ์•ˆ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด 1.0์˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ |> ๊ตฌ๋ฌธ์„ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@StefanKarpinski ํ˜„์žฌ ํ…Œ์ด๋ธ”์—์„œ๋„ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ |> ๊ตฌ๋ฌธ์„ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? 1.0์„ ์œ„ํ•ด ์ œ์ž๋ฆฌ์— ๋†“์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@StefanKarpinski ํ˜„์žฌ ํ…Œ์ด๋ธ”์—์„œ๋„ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ |> ๊ตฌ๋ฌธ์„ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? 1.0์„ ์œ„ํ•ด ์ œ์ž๋ฆฌ์— ๋†“์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

0.7์—์„œ ๋น„์ถ”์ฒœํ•˜๊ณ  1.0์—์„œ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ํ…Œ์ด๋ธ”์— ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ 1.x ๋™์•ˆ ๊ตฌ๋ฌธ ์š”์†Œ๋กœ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
๊ทธ ์‹œ์ ์—์„œ ๊นจ์ง€์ง€ ์•Š๋Š” ๋ณ€๊ฒฝ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ๊ทธ๊ฒƒ์„ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ €๋Š” ๊ทธ๊ฒƒ์ด ๋ชน์‹œ ์–ด๋ ค์šด ๋ณ€ํ™”๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ…Œ์ด๋ธ” ์œ„์— ์žˆ์Šต๋‹ˆ๋‹ค.

|> ์ด ์ค‘๋‹จ๋˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? Lazy.jl์˜ ๊ตฌํ˜„?

x |> f ๋Š” f(x) ๋กœ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

l> ๋ฅผ ํ๊ธฐํ•˜๋Š” ๋™์‹œ์— ํ˜„์žฌ l> ์™€ ๋™์ผํ•œ ๋™์ž‘์„ ๊ฐ–๋Š” ll> ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์ผ๋ถ€ ๊ต์ฒด์—†์ด ํ๊ธฐ ๋งŒ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด ํ˜„์žฌ ๋™์ž‘์— ์˜์กดํ•˜๋Š” ํŒจํ‚ค์ง€๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์ข‹์€ ์˜ต์…˜์—†์ด ๋‚จ๊ฒจ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์‚ฌ์ด์— ์•ฝ๊ฐ„ ๋œ ์ข‹์€ ํ‘œํ˜„์ด ๋‚˜์˜ค๋ฉด ํ˜„์žฌ ๋””์ž์ธ์„ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์•ž์œผ๋กœ l> ์— ๋Œ€ํ•œ ์ •๋ง ์ข‹์€ ์†”๋ฃจ์…˜์„ ์ฐพ์„ ์ˆ˜์žˆ๋Š” ์˜ต์…˜์„ ํ…Œ์ด๋ธ”์— ๋‚จ๊ฒจ ๋‘ก๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ฟผ๋ฆฌ ๋ฐ ์นœ๊ตฌ ์ƒํƒœ๊ณ„์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ €๋Š” R tidyverse์˜ ํŒŒ์ดํ”„ ๊ตฌ๋ฌธ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•œ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ๋งค์šฐ ํฌ๊ด„์ ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ 7 ๊ฐœ์˜ ํ…Œ์ด๋ธ” ํ˜•์‹ ํŒŒ์ผ ํ˜•์‹ (2 ๊ฐœ๊ฐ€ ๋” ๊ฐ€๊นŒ์ด ์žˆ์Œ), ๋ชจ๋“  ์ฟผ๋ฆฌ ์ž‘์—… (์˜ˆ : dplyr) ๋ฐ ํ”Œ๋กœํŒ… (๋ฉ€์ง€ ์•Š์€ ์ƒํƒœ)์— ๋Œ€ํ•œ ํŒŒ์ผ io๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๊ณง ggplot ๋Š๋‚Œ). ๊ทธ๊ฒƒ์€ ๋ชจ๋‘ l> ์˜ ํ˜„์žฌ ๊ตฌํ˜„์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ…Œ์ด๋ธ”์— l> ์— ๋Œ€ํ•ด ๋” ๋‚˜์€ ์˜ต์…˜์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋ชจ๋‘ ์ฐฌ์„ฑํ•œ๋‹ค๊ณ  ๋งํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋งŒ๋“  ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋น„์ถ”์ฒœํ•˜๋Š” ๊ฒƒ์€ ๋งŽ์€ ํŒจํ‚ค์ง€์—์„œ ๋Ÿฌ๊ทธ๋ฅผ ์ œ๊ฑฐ ํ•  ์ˆ˜์žˆ๋Š” ๋งค์šฐ ๊ธ‰์ง„์  ์ธ ๋‹จ๊ณ„๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

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

๋Œ€์•ˆ์€ ๋ฏธ๋ž˜์— ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ ์ฒด์ด๋‹ ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ, ํ˜„์žฌ ๊ตฌ๋ฌธ ์˜ค๋ฅ˜ ์ธ ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์•ˆ์€ ๋ฏธ๋ž˜์— ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ ์ฒด์ด๋‹ ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ, ํ˜„์žฌ ๊ตฌ๋ฌธ ์˜ค๋ฅ˜ ์ธ ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์ œ์•ˆ์ด ๊ทธ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์ฆ‰, ์ค„๋ฆฌ์•„ 1.0์—์„œ |> ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋“ค๊ณ  ||> ๋ฅผ ์˜ค๋Š˜์˜ |> ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ค„๋ฆฌ์•„ 1.0์ด ํ˜„์žฌ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•œ ์‚ฌ์†Œํ•œ ์„ฑ๊ฐ€์‹ฌ ๊ฒƒ |> ํ•˜๋‚˜๋กœ ์ „ํ™˜ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ||> . ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ์™„์ „ํžˆ ์ž๋™ํ™” ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ˆ„๊ตฐ๊ฐ€ |> ๋Œ€ํ•œ ์ข‹์€ ์•„์ด๋””์–ด๋ฅผ ๊ฐ–๊ฒŒ๋˜๋ฉด ํ•ด๋‹น ์–ธ์–ด๋กœ ๋‹ค์‹œ ๋„์ž… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ||> ์™€ |> ๋‘˜ ๋‹ค์žˆ์„ ๊ฒƒ์ด๊ณ , ๋ชจ๋“  ์‚ฌ๋žŒ์ด |> ๋ฅผ ์ฑ„ํƒํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ||> ๊ฐ€ ์ฒœ์ฒœํžˆ ๋ฐฐ๊ฒฝ์œผ๋กœ ์‚ฌ๋ผ์งˆ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ช‡ ๋…„ ์•ˆ์— julia 2.0์€ ||> ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์— ๊ทธ๊ฒƒ์€ a) ์ค„๋ฆฌ์•„ 1.0 ๊ธฐ๊ฐ„ ๋™์•ˆ ๋ˆ„๊ตฌ์—๊ฒŒ๋„ ์‹ค์งˆ์ ์ธ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š์„ ๊ฒƒ์ด๋ฉฐ, b) ๊ฒฐ๊ตญ |> ๋Œ€ํ•œ ์ •๋ง ์ข‹์€ ์†”๋ฃจ์…˜์„ ์œ„ํ•ด ๋ชจ๋“  ์˜ต์…˜์„ ํ…Œ์ด๋ธ”์— ๋‚จ๊ฒจ ๋‘๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

|>(x, f) = f(x)
|>(x, tuple::Tuple) = tuple[1](x, tuple[2:endof(tuple)]...) # tuple
|>(x, f, args...) = f(x, args...) # args

x = 1 |> (+, 1, 1) |> (-, 1) |> (*, 2) |> (/, 2) |> (+, 1) |> (*, 2) # tuple
y = 1 |> (+, 1, 1)... |> (-, 1)... |> (*, 2)... |> (/, 2)... |> (+, 1)... |> (*, 2)... # args

์—ฌ๋Ÿฌ ๋ฒˆ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š์ง€๋งŒ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

function fibb_tuple(n)
    if n < 3
        return n
    end
    fibb_tuple(n-3) |> (+, fibb_tuple(n-2), fibb_tuple(n-1))
end

function fibb_args(n)
    if n < 3
        return n
    end
    fibb_args(n-3) |> (+, fibb_args(n-2), fibb_args(n-1))...
end

function fibb(n)
    if n < 3
        return n
    end
    fibb(n-3) + fibb(n-2) + fibb(n-1)
end

n = 25

println("fibb_tuple")
<strong i="8">@time</strong> fibb_tuple(1)
println("fibb_args")
<strong i="9">@time</strong> fibb_args(1)
println("fibb")
<strong i="10">@time</strong> fibb(1)

println("tuple")
<strong i="11">@time</strong> fibb_tuple(n)
println("args")
<strong i="12">@time</strong> fibb_args(n)
println("fibb")
<strong i="13">@time</strong> fibb(n)
  0.005693 seconds (2.40 k allocations: 135.065 KiB)
fibb_args
  0.003483 seconds (1.06 k allocations: 60.540 KiB)
fibb
  0.002716 seconds (641 allocations: 36.021 KiB)
tuple
  1.331350 seconds (5.41 M allocations: 151.247 MiB, 20.93% gc time)
args
  0.006768 seconds (5 allocations: 176 bytes)
fibb
  0.006165 seconds (5 allocations: 176 bytes)

|>(x, tuple::Tuple) = tuple[1](x, tuple[2:endof(tuple)]...) ์€ (๋Š”) ๋”์ฐํ•ฉ๋‹ˆ๋‹ค.
|>(x, f, args...) = f(x, args...) ๋” ๋งŽ์€ ๊ธ€์ž๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ๋น ๋ฆ…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ subject |> verb(_, objects) ๊ณผ ๊ฐ™์€ ๊ตฌ๋ฌธ์ฒ˜๋Ÿผ verb(subject, objects) ์ˆ˜๋‹จ ๊ฒƒ์€ SVO๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด (๊ทธ๋Ÿฌ๋‚˜ ์ค„๋ฆฌ์•„์˜ ๊ธฐ๋ณธ์€ VSO ๋˜๋Š” VOS)์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Julia๋Š” ์ฃผ์ œ๊ฐ€ ์ฃผ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋„๋ก mutltidipatch๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. SVO ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•œ๋‹ค๋ฉด (subject1, subject2) |> verb(_, _, object1, object2) ๊ฐ™์€ ๊ตฌ๋ฌธ์„ verb(subject1, subject2, object1, object2) ์ฒ˜๋Ÿผ ํ—ˆ์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
@oxinabox๊ฐ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํŒŒ์ดํ”„ ๋ผ์ธ์œผ๋กœ ํŒŒ์•…ํ•˜๋ฉด MIMO์ž…๋‹ˆ๋‹ค.

(x)f ๋ฅผ f(x) ์–ด๋–ป์Šต๋‹ˆ๊นŒ?
(x)f(y) ๋Š” f(x)(y) ๋ฐ f(y)(x) ๋ชจ๋‘๋กœ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋จผ์ € ํ‰๊ฐ€๋ฅผ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.

(x)f # f(x)
(x)f(y) # f(y)(x)
(x)f(y)(z) # f(y)(z)(x)
(x)(y)f(z) # f(z)(y)(x)
(a)(b)f(c)(d) # f(c)(d)(b)(a)
1(2(3, 4), 5(6, 7), 8(9, 10)) # 1(2(3, 4), 5(6, 7), 8(9, 10))
1 <| (2 <| (3, 4), 5 <| (6, 7), 8 <| (9, 10)) # 1(2(3, 4), 5(6, 7), 8(9, 10)), but 2 <| (3, 4) == 2((3, 4)) so currently emit error
3 |> 2(_, 4) |> 1(_, 5(6, 7), 8(9, 10)) # 1(2(3, 4), 5(6, 7), 8(9, 10))
((3)2(_, 4))1(_, 5(6, 7), 8(9, 10)) # 1(2(3, 4), 5(6, 7), 8(9, 10))
(3, 4) |> 2(_, _) |> 1(_, 5(6, 7), 8(9, 10)) # 1(2(3, 4), 5(6, 7), 8(9, 10))
((3, 4)2)1(_, 5(6, 7), 8(9, 10)) # 1(2(3, 4), 5(6, 7), 8(9, 10))

์ด๊ฒƒ์€ vararg๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์กฐ์ž‘ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ณต๋ฐฑ์—†์ด ์ดํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

(a + b)+(c + d) # +(c + d)(a + b) == (c + d)(a + b): Error

๋Œ€์ฒด ์˜ต์…˜ : splatting ๊ตฌ๋ฌธ์— ๋‹ค๋ฅธ ์ผ€์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. f ... (x) desugar to (args ...)-> f (x, args ...)

์ด๋ ‡๊ฒŒํ•˜๋ฉด ๊ตฌ๋ฌธ ์ ์œผ๋กœ ๊ฐ€๋ฒผ์šด (์ˆ˜๋™) ์ปค๋ง์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

#Basic example:
f(a,b,c,d) = #some definition
f...(a)(b,c,d) == f(a,b,c,d)
f...(a,b)(c,d) == f(a,b,c,d)
f...(a,b,c)(d) == f(a,b,c,d)
f...(a)...(b)(c,d) == f(a,b,c,d) # etc etc

# Use in pipelining:
x |> map...(f) |> g  |> filter...(h) |> sum

์–ธ์ œ ์นด๋ ˆ๋ฅผ ๊ทธ๋งŒ๋‘๋‚˜์š”? Julia ํ•จ์ˆ˜์—๋Š” ๊ณ ์ • ๋œ ๋ฐฐ์—ด์ด ์—†์Šต๋‹ˆ๋‹ค.

Julia๋Š” ์ด๋ฏธ ์Šคํ”Œ๋ž˜ ํŒ… ์—ฐ์‚ฐ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ ํ˜„์žฌ ํ‘œ์‹œ ์—ฐ์‚ฐ์ž์™€ ๋˜‘๊ฐ™์€ ๋™์ž‘์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

I, e : f ... (x) == (args ...)-> f (x, args ...)๋Š” splatting์œผ๋กœ ๋žŒ๋‹ค๋ฅผ ๋งŒ๋“ค๊ธฐ์œ„ํ•œ ์„คํƒ•์ž…๋‹ˆ๋‹ค.

์ด ์ •์˜๋Š” ํ•ญ์ƒ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‹น์‹ ์€ ๋•Œ๋•Œ๋กœ ๋Œ€๋‹ต์„ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์— ๊ฐ์ฒด๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋งˆ์ง€๋ง‰ ์˜ˆ์—์„œ ๋งˆ์ง€๋ง‰ ๊ด„ํ˜ธ ์„ธํŠธ ์•ž์— ...๊ฐ€ ์—†๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. f ... (a) ... (b) (c, d) == f (a, b, c, d) .

|>๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜ํ™˜ ๋œ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฟก๋ฟก

๊ธฐ๋ณธ ์˜ˆ :

f (a, b, c, d) = # ์ผ๋ถ€ ์ •์˜
f ... (a) (b, c, d) == f (a, b, c, d)
f ... (a, b) (c, d) == f (a, b, c, d)
f ... (a, b, c) (d) == f (a, b, c, d)
f ... (a) ... (b) (c, d) == f (a, b, c, d) # ๋“ฑ

ํ•จ์ˆ˜ ์ฒด์ธ๊ณผ ํ•จ๊ป˜ splat์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ๋Š” ์ข‹์€ ์ง๊ฐ์ด์ง€๋งŒ ๋‚ด ๊ฐ๊ฐ์œผ๋กœ๋Š” ๋„ˆ๋ฌด ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.
์ฒด์ธ์˜ ํ•œ ์ง€์ ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹ ์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ•จ์ˆ˜ ์ฒด์ธ์—์„œ ๋ชจ๋“  ์ฒด์ธ์„ ๋”ฐ๋ผ ๋‹จ๊ณ„๋ณ„๋กœ ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  @StefanKarpinski ๊ฐ€ ์˜ณ์Šต๋‹ˆ๋‹ค, ๋‹น์‹ ์€ ๊ทธ๋“ค ์ž์‹ ์— ๊ธฐ๋Šฅ์„ ์ ์šฉํ•˜๊ณ  ๋งˆ์นจ๋‚ด ๋” ์Šค์นผ๋ผ ํ•ญ๋ชฉ์— ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์–ธ์ œ ๋ฉˆ์ถฐ์•ผํ• ์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

-(์ž˜๋ฆผ)-

๋ฏธ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€์—†๊ณ  ์ฝ์„ ์ˆ˜์—†๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋” ๋ช…ํ™•ํ•œ ์„ค๋ช…์„ ์–ป์œผ๋ ค๋ฉด ์•„๋ž˜์˜ ๋‘ ๋ฒˆ์งธ ๋ฉ”์‹œ์ง€๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค (ํฌ๋งํ•ฉ๋‹ˆ๋‹ค).

Julia๊ฐ€ ์ด๋ฏธ ์–ผ๋งˆ๋‚˜ ๊ธฐ๋Šฅ์ ์ธ์ง€๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ, ์ €๋Š” ํ•จ์ˆ˜ ์นด๋ ˆ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ @saolof ์˜ ์•„์ด๋””์–ด๋ฅผ ์•„์ฃผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋งค์šฐ ๋ช…๋ฐฑํ•œ ํ•ด์„์„ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜๋ฏธ ๋ก ์  ๋ฐ˜๋Œ€๊ฐ€ ์–ด๋””์—์„œ ์˜ค๋Š”์ง€ ์ •๋ง๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค.

์ž์‹ ์˜ repl์—์„œ ํŽธ์•ˆํ•˜๊ฒŒ ํ”„๋กœํ†  ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ctranspose(f) = (a...) -> (b...) -> f(a..., b...)

map'(+)(1:10)

map'(+)'(1:10, 11:20)(21:30)

(+)'(1,2,3)(4,5)

1:10 |> map'(x->x^2) |> filter'(iseven)

๋Š๋‚Œ์ด ์ข‹์€ ๊ฒƒ ๊ฐ™์•„์š”.

ํŽธ์ง‘ : ์ด๊ฒƒ์ด ๋˜ํ•œ ์ด๊ฒƒ์„ ๋” ์ผ๋ฐ˜ํ™”ํ•˜๋Š” ๊ฒฝ๋กœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. mapโˆ˜(+, 1:10) ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋ฉด mapโˆ˜(_, 1:10) ๋ฅผ ์จ์„œ ์นด๋ ˆ ์ธ์ˆ˜๋ฅผ ๋จผ์ € ๋ฐฐ์น˜ํ•˜๋ฉด ์นด๋ ˆ ์—ฐ์‚ฐ์ž๊ฐ€ ๋žŒ๋‹ค์˜ ๋ฒ”์œ„๋ฅผ ๊ฒฐ์ •ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ผ๋ฐ˜์ ์ธ ์นด๋ ˆ์˜ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์–ด, ์˜๋ฆฌ ํ•˜๊ตฐ์š”, @MikeInnes.

Julia์˜ ๊ทน๋‹จ์  ์ธ ํ™•์žฅ ์„ฑ์ด ์—ฌ๊ธฐ์—์„œ๋„ ๊ณผ์‹œ๋˜๋Š” ๋ฐฉ์‹์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ฒด์ธ์— ๋Œ€ํ•œ ๋งค์šฐ ๊ด‘๋ฒ”์œ„ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ํ†ตํ•ฉ ์†”๋ฃจ์…˜์€ ctranspose ...

(์„ค๋ช… :์ด ์ œ์•ˆ์œผ๋กœ 1:10 |> map'(x->x^2) |> filter'(iseven) ๋ฅผ ๋ฐ›๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๐Ÿ’ฏ %์ž…๋‹ˆ๋‹ค!)

๋ช…ํ™•ํ•˜๊ฒŒ ๋งํ•˜๋ฉด, ์‹ค์ œ๋กœ adjoint ์—ฐ์‚ฐ์ž๋ฅผ ๋‚จ์šฉํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๊ฐ„๊ฒฐํ•œ ํ•จ์ˆ˜ ์นด๋ ˆ ํ‘œ๊ธฐ๋ฒ•์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ข‹์€ ๊ฐœ๋… ์ฆ๋ช…์ž…๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์œ ๋‹ˆ ์ฝ”๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ๋„์ž…ํ•ด์•ผํ• ๊นŒ์š”? http://www.fileformat.info/info/unicode/char/1f35b/index.htm

(์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค...)

_ 's๊ฐ€ ๋žŒ๋‹ค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ํ›จ์”ฌ ๋” ์œ ์—ฐํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@bramtayl MikeInnes์˜ ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•œ ํŽธ์ง‘ ์•„์ด๋””์–ด๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ๊ณต์กด ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. @stevengj ์˜ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ์—์„œ์™€ ๊ฐ™์€ ๋…๋ฆฝํ˜• ๋ฐ‘์ค„์ด ์ž‘๋™ํ•˜๊ณ , ์œ„์˜ Mike์˜ ์•„์ด๋””์–ด์—์„œ์™€ ๊ฐ™์€ ๋…๋ฆฝํ˜• ์ปค๋ง์ด ์ž‘๋™ํ•˜๊ณ  ๋‘ ๊ฐ€์ง€๋ฅผ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ง ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ ์•ˆ์—์žˆ๋Š” _ ์˜ ๋ฒ”์œ„๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„ ์•Œ์•˜๋‹ค

๊ทธ๊ฒƒ์€ LazyCall.jl๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ์—ฌ๊ธฐ์—์„œ ์ œ์•ˆ : https://github.com/JuliaLang/julia/pull/24990#issuecomment -350490856

๋” ์‹ฌ๊ฐํ•œ ๋ฉ”๋ชจ :

๋ช…ํ™•ํ•˜๊ฒŒ ๋งํ•˜๋ฉด ์‹ค์ œ๋กœ adjoint ์—ฐ์‚ฐ์ž๋ฅผ ์•…์šฉํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๊ฑด์ „ํ•œ ์„ ํƒ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์†”๋ฃจ์…˜์ด ๊ตฌํ˜„๋˜๋ฉด ์ž…๋ ฅํ•˜๊ธฐ ์‰ฌ์šด ์—ฐ์‚ฐ์ž๊ฐ€ ์ œ๊ณต๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. 1:10 |> map'(x->x^2) ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ' ๋Œ€์ฒดํ•˜๋Š” ๋ฌธ์ž๊ฐ€ ์œ ๋‹ˆ ์ฝ”๋“œ ํ…Œ์ด๋ธ”์—์„œ ์กฐํšŒํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ (๋˜๋Š” LaTeX ํ™•์žฅ์„ ์ง€์›ํ•˜๋Š” ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ) ํ›จ์”ฌ ๋œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

adjoint ์—ฐ์‚ฐ์ž๋ฅผ ๋‚จ์šฉํ•˜๋Š” ๋Œ€์‹  ํ‘œ์‹œ๋ฅผ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • (์„ ํ˜•) ๋ฐฐ๊ด€ ๋งฅ๋ฝ์—์„œ
  • ๋‚ด๋ถ€, ํ•จ์ˆ˜ ํ˜ธ์ถœ

    • ํ›„๋ณด๋‹ค ์•ž์„ ํŠ€๊ธฐ๋‹ค

๊ทธ๋ž˜์„œ

  • splat์€ ๋ˆ„๋ฝ ๋œ ๋ฐ˜๋ณต๊ธฐ ์ธ์ˆ˜๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ์ข…์˜ ๊ณ ์ฐจ์› ํ‘œ์‹œ (์Œ์•…๊ฐ€๊ฐ€ ์žˆ๋‹ค๋ฉด anacrusis ์™€ ํ•จ๊ป˜).
์–ธ์–ด๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์ด ํ”๋“ค๋ฆฌ์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์˜ˆ

1:10
    |> map(...x->x^2)
    |> filter(...iseven)

์˜ˆ 2

genpie = (r, a=2pi, n=12) ->
  (0:n-1) |>
      map(...i -> a*i/n) |>
      map(...t -> [r*cos(t), r*sin(t)]) 

์„ค ์ˆ˜์žˆ๋‹ค

elmap = f -> (s -> map(f,s))

genpie = (r, a=2pi, n=12) ->
  (0:n-1) |>
      elmap(i -> a*i/n) |>
      elmap(t -> [r*cos(t), r*sin(t)]) 

์ด๊ฒƒ์ด ์—ฌ๊ธฐ์— ์†ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋…ผ์˜๊ฐ€ ๋” ๊ณ ๊ธ‰ / ์œ ์—ฐํ•œ ์—ฐ๊ฒฐ ๋ฐ ๊ตฌ๋ฌธ์œผ๋กœ ๋ฐœ์ „ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ... ์‹œ์ž‘ ํฌ์ŠคํŠธ๋กœ ๋Œ์•„๊ฐ€์„œ, ์•ฝ๊ฐ„์˜ ์ถ”๊ฐ€ ์„ค์ •์„ ํ†ตํ•ด ์  ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ ํ•จ์ˆ˜ ์—ฐ๊ฒฐ์ด ์ง€๊ธˆ ๊ฐ€๋Šฅํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ์€ ์ผ๊ธ‰ ํ•จ์ˆ˜ / ํด๋กœ์ €์™€ ํ•จ๊ป˜ ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ์  ๊ตฌ๋ฌธ์„ ๊ฐ–๋Š” ๊ฒฐ๊ณผ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค.

mutable struct T
    move
    scale
    display
    x
    y
end

function move(x,y)
    t.x=x
    t.y=y
    return t
end
function scale(c)
    t.x*=c
    t.y*=c
    return t
end
function display()
    @printf("(%f,%f)\n",t.x,t.y)
end

function newT(x,y)
    T(move,scale,display,x,y)
end


julia> t=newT(0,0)
T(move, scale, display, 0, 0)

julia> t.move(1,2).scale(3).display()
(3.000000,6.000000)

๊ตฌ๋ฌธ์€ ๊ธฐ์กด์˜ OOP์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๋ฉฐ "ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ"๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด ๋ฌด์—‡์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@ivanctong ์ง€๊ธˆ๊นŒ์ง€ ์„ค๋ช…ํ•œ ๊ฒƒ์€ ํ•จ์ˆ˜ ์ฒด์ธ๋ณด๋‹ค ์œ ์ฐฝํ•œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

์ฆ‰, ํ•จ์ˆ˜ ์ฒด์ธ ๋ฌธ์ œ๋ฅผ๋ณด๋‹ค ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ฉด ์œ ์ฐฝํ•œ ์ธํ„ฐํŽ˜์ด์Šค์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ถ”๊ฐ€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ Julia์˜ struct ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์ฐฝํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ Julia์˜ ์ •์‹ ๊ณผ ๋””์ž์ธ ๋ฏธํ•™์— ๋ฐ˜ํ•˜๋Š” ๊ฒƒ๋งŒ ํผ ์ €์—๊ฒŒ ์ถฉ๊ฒฉ์„์ค๋‹ˆ๋‹ค.

elixir๊ฐ€ ํŒŒ์ดํ”„ ์—ฐ์‚ฐ์ž๊ฐ€ ํ•ญ์ƒ ์™ผ์ชฝ์„ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ณ  ๋‚˜์ค‘์— ์ถ”๊ฐ€ ์ธ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ๊ฝค ์œ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. "elixir" |> String.ends_with?("ixir") ๊ฐ™์€ ๊ฒƒ์„ ์ผ๋ฅ˜ ์‹œ๋ฏผ์œผ๋กœ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ค„๋ฆฌ์•„.

๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋Š”์ด๋ฅผ Uniform Function Call Syntax ๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ธฐ๋Šฅ์€ ๋ช‡ ๊ฐ€์ง€ ์žฅ์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค (Wikipedia ์ฐธ์กฐ). Julia๊ฐ€ ์ง€์›ํ•œ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ Julia์— ๋Œ€ํ•œ ์œ ์ฐฝํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

Julia ๋‹ด๋ก  ํ† ๋ก  ํฌ๋Ÿผ์— ์งˆ๋ฌธ์„ ๊ฒŒ์‹œํ•˜์‹ญ์‹œ์˜ค.

ํ•ดํ‚น (๊ทธ๋ฆฌ๊ณ  ์˜์‹ฌ์Šค๋Ÿฌ์šด ํŒ๋‹จ!?)์— ๋งž์ถฐ ํ•จ์ˆ˜ ์ž๋ฆฌ ํ‘œ์‹œ ์ž์˜ ๊ฒฐํ•ฉ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ์ฑ…์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/c42f/MagicUnderscores.jl

https://github.com/JuliaLang/julia/pull/24990 ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ ์ฃผ์–ด์ง„ ํ•จ์ˆ˜์˜ ํŠน์ • ์Šฌ๋กฏ์ด _ ์ž๋ฆฌ ํ‘œ์‹œ ์ž ํ‘œํ˜„์‹์„ ๋‹จ๋‹จํžˆ ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ๋‹ค๋Š” ๊ด€์ฐฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ๋Š์Šจํ•˜๊ฒŒ. MagicUnderscores ๋Š”์ด ๊ธฐ๋Šฅ์„ ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ํ™•์žฅ ํ•  ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค (๋ฐฉ์†ก ๊ธฐ๊ณ„์˜ ์ •์‹ ์— ๋”ฐ๋ผ ๋งค์šฐ ๋งŽ์ด). ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

julia> <strong i="12">@_</strong> [1,2,3,4] |> filter(_>2, _)
2-element Array{Int64,1}:
 3
 4

julia> <strong i="13">@_</strong> [1,2,3,4] |> filter(_>2, _) |> length
2

"๊ทธ๋ƒฅ ์ผ์ด์•ผ". (์ผ๋ฐ˜์ ์ธ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด @_ ๋ถ„๋ช…ํžˆ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.)

์ผ๋ถ€ ๋ณ€ํ˜• @MikeInnes ์ œ์•ˆ์€ ๋‚ด ์š”๊ตฌ์— ์ ํ•ฉ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค (๋ณดํ†ต do ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•„ํ„ฐ, ๋งต, ์ถ•์†Œ, ์—ด๊ฑฐ, ์••์ถ• ๋“ฑ์˜ ๊ธด ์ฒด์ธ).

c(f) = (a...) -> (b...) -> f(a..., b...)

1:10 |> c(map)() do x
    x^2
end |> c(filter)() do x
    x > 50
end

๋” ์ด์ƒ ์ž‘๋™ํ•˜๋„๋ก ' ์„ (๋ฅผ) ์–ป์„ ์ˆ˜ ์—†์ง€๋งŒ ์ด๊ฒƒ์€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๋ณด๋‹ค ์•ฝ๊ฐ„ ์งง์Šต๋‹ˆ๋‹ค.

1:10 |> x -> map(x) do x
    x^2
end |> x -> filter(x) do x
    x > 50
end

๋˜ํ•œ ํ•˜๋‚˜๋Š” ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค

cmap = c(map)
cfilter = c(filter)
cetc = c(etc)
...

1:10 |> cmap() do x
    x^2
end |> cfilter() do x
    x > 50
end |> cetc() do ...

1.0๋กœ์„œ ๋‹น์‹ ์€ ์˜ค๋ฒ„๋กœ๋“œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค adjoint ๋Œ€์‹  ctranspose . ๋‹ค์Œ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

julia> Base.getindex(f::Function, x...) = (y...) -> f(x..., y...)

julia> 1:10 |> map[x -> x^2] |> filter[x -> x>50]
3-element Array{Int64,1}:
  64
  81
 100

์šฐ๋ฆฌ๊ฐ€ ๊ณผ๋ถ€ํ•˜ ์ˆ˜ ์žˆ๋‹ค๋ฉด apply_type ์šฐ๋ฆฌ๊ฐ€ ์–ป์„ ์ˆ˜ map{x -> x^2} :)

@MikeInnes ๋ฐฉ๊ธˆ ํ›” ์ณค์–ด์š”

๋Šฆ๊ณ  ์•ฝ๊ฐ„ ๊ฒฝ์†”ํ•œ ๊ธฐ์—ฌ-์™ผ์ชฝ ๋ฐ ์˜ค๋ฅธ์ชฝ ์นด๋ ˆ ์—ฐ์‚ฐ์ž์˜ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ˆ˜ ๋ชฉ๋ก์˜ ๋ชจ๋“  ์œ„์น˜์— ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ดํ•‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

VERSION==v"0.6.2"
import Base: ctranspose, transpose  
ctranspose(f::Function) = (a...) -> ((b...) -> f(a..., b...))  
 transpose(f::Function) = (a...) -> ((b...) -> f(b..., a...))

"little" |> (*)'''("Mary ")("had ")("a ") |> (*).'(" lamb")

Clojure์—๋Š” ๋ฉ‹์ง„ ์Šค๋ ˆ๋”ฉ ๋งคํฌ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Julia ์ƒํƒœ๊ณ„ ์–ด๋”˜๊ฐ€์— ์žˆ์Šต๋‹ˆ๊นŒ?

Clojure์—๋Š” ๋ฉ‹์ง„ ์Šค๋ ˆ๋”ฉ ๋งคํฌ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Julia ์ƒํƒœ๊ณ„ ์–ด๋”˜๊ฐ€์— ์žˆ์Šต๋‹ˆ๊นŒ?

https://github.com/MikeInnes/Lazy.jl

Clojure์—๋Š” ๋ฉ‹์ง„ ์Šค๋ ˆ๋”ฉ ๋งคํฌ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Julia ์ƒํƒœ๊ณ„ ์–ด๋”˜๊ฐ€์— ์žˆ์Šต๋‹ˆ๊นŒ?

์ ์–ด๋„ 10 ๊ฐœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ์Šค๋ ˆ๋“œ์— ๋” ๋งŽ์€ ๋ชฉ๋ก์„ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/JuliaLang/julia/issues/5571#issuecomment -205754539

๋‹ค๋ฅธ ๋‘ ํŒจํ‚ค์ง€ ๋Œ€์‹  LightQuery๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ชฉ๋ก์„ ํŽธ์ง‘ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

|> ์—ฐ์‚ฐ์ž๋Š” elixir์—์„œ ์™”๊ธฐ ๋•Œ๋ฌธ์— ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์—์„œ ์˜๊ฐ์„ ์–ป์–ด ๋ณด์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ?
elixir์—์„œ๋Š” &expr ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ณ  &n ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ„์น˜ ์ธ์ˆ˜๋ฅผ ์บก์ฒ˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ( &1 ๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜, &2 ๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜, ๊ธฐํƒ€.)
elixir์—๋Š” ์ž‘์„ฑํ•  ์ถ”๊ฐ€ ํ•ญ๋ชฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ๋ฅผ ๋“ค์–ด ์ต๋ช… ํ•จ์ˆ˜ &(&1 + 1).(10) ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ๊ด„ํ˜ธ ์•ž์— ์ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค)

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ ์ค„๋ฆฌ์•„์—์„œ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์„ ์ง€

&(&1 * 10)        # same as: v -> v * 10
&(&2 + 2*&5)      # same as: (_, x, _, _, y) -> x + 2*y
&map(sqrt, &1)    # same as: v -> map(sqtr, v)

๋”ฐ๋ผ์„œ |> ์—ฐ์‚ฐ์ž๋ฅผ ๋” ์ž˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1:9 |> &map(&1) do x
  x^2
end |> &filter(&1) do x
  x in 25:50
end

๋Œ€์‹ ์—

1:9 |> v -> map(v) do x
  x^2
end |> v -> filter(v) do x
  x in 25:50
end

์ค„ 2์™€ 3์„ .|> &(&1^2) ๋˜๋Š” .|> (v -> v^2) ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

_ ์ž๋ฆฌ ํ‘œ์‹œ์ž๊ฐ€์žˆ๋Š” ๋ช…์ œ์™€์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ ์—ฌ๊ธฐ์—์„œ ์œ„์น˜ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ‘œํ˜„์‹ ์•ž์—์žˆ๋Š” & ๋Š” ์ž๋ฆฌ ํ‘œ์‹œ ์ž์˜ ๋ฒ”์œ„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค (๋…์ž ๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ).

๋‚ด ์˜ˆ์ œ์—์„œ & ๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ? , _ , $ ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์„ ๋Œ€์‹  ์‚ฌ์šฉํ•˜๋ฉด ์ผ€์ด์Šค.

Scala๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜์— _ , ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜์— _ ๋“ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๊ฒฐํ•˜์ง€๋งŒ์ด๋ฅผ ์ ์šฉ ํ•  ์ˆ˜์žˆ๋Š” ์ƒํ™ฉ์ด ๋นจ๋ฆฌ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค (๋ฐ˜๋ณตํ•˜๊ฑฐ๋‚˜ ๋˜๋Œ๋ฆด ์ˆ˜ ์—†์Œ). ์ธ์ˆ˜์˜ ์ˆœ์„œ). ๋˜ํ•œ ํ‘œํ˜„์‹์—์„œ ํ•จ์ˆ˜๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒํ•˜๋Š” ์ ‘๋‘์‚ฌ (์œ„์˜ ์ œ์•ˆ์—์„œ & )๊ฐ€ ์—†์œผ๋ฉฐ ์‹ค์ œ๋กœ ์‚ฌ์šฉ์„ ๋ฐฉํ•ดํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์‹ค๋ฌด์ž๋กœ์„œ ์˜๋„ ํ•œ ์ธ๋ผ์ธ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ ๊ด„ํ˜ธ์™€ ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด ์ธ์‹๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉด์„œ ๋๋‚ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” ์ด์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์„ ๋„์ž… ํ•  ๋•Œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ทธ๊ฒƒ์ด ๋ชจํ˜ธํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ธ์ˆ˜์˜ ์ ‘๋‘์‚ฌ์— ๊ด€ํ•ด์„œ๋Š” $ ๋Š” ์‰˜ ์Šคํฌ๋ฆฝํŒ… ์„ธ๊ณ„์—์„œ ์ „ํ†ต์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ์ต์ˆ™ํ•œ ์บ๋ฆญํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ |> ๊ฐ€ Elixir์—์„œ ๋‚˜์˜จ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ ์‚ฌ์šฉ์ž๋“ค์ด ์ด๋ฏธ ๊ทธ ๋ชจ๋“œ์—์„œ ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ƒ๊ฐ๊ณผ ํ•จ๊ป˜ Elixir์—์„œ & ๊ฐ€์ ธ ๊ฐ€๋ผ๋Š” ์ฃผ์žฅ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ด์ „์— Elixir ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ...)

์ด์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์ด ํฌ์ฐฉ ํ•  ์ˆ˜์—†๋Š” ํ•œ ๊ฐ€์ง€๋Š” N ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ N๋ณด๋‹ค ์ ์€ ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณธ๋ฌธ์˜ $1 , $2 , $3 ๋Š” 3 ๊ฐœ์˜ ์ธ์ˆ˜๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ 4 ๊ฐœ์˜ ์ธ์ˆ˜ (๋งˆ์ง€๋ง‰์€ ๋ฌด์‹œ ๋จ)๋กœ ํ˜ธ์ถœ ๋  ์œ„์น˜์— ๋†“์œผ๋ ค๋ฉด์ด๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. (๋ชจ๋“  N์— ๋Œ€ํ•ด ID ํ•จ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ์ •์˜ํ•˜๊ณ  ๊ทธ ์ค‘ ํ•˜๋‚˜๋กœ ํ‘œํ˜„์‹์„ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค.) ์ด๊ฒƒ์€ ๋‹จ ํ•˜๋‚˜์˜ ์ธ์ˆ˜ ๋งŒ์žˆ๋Š” |> ๋’ค์— ๋„ฃ๋Š” ๋™๊ธฐ ๋ถ€์—ฌ ์‚ฌ๋ก€์™€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜๊ฐ€ ๋ฐฐ์—ด ์ธ ๊ฒƒ์ฒ˜๋Ÿผ Colon ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ getindex๋ฅผ ์˜ค๋ฒ„๋กœ๋“œํ•˜๋Š” @MikeInnes ํŠธ๋ฆญ์„ ํ™•์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

struct LazyCall{F} <: Function
    func::F
    args::Tuple
    kw::Dict
end

Base.getindex(f::Function,args...;kw...) = LazyCall{typeof(f)}(f,args,kw)

function (lf::LazyCall)(vals...; kwvals...)

    # keywords are free
    kw = merge(lf.kw, kwvals)

    # indices of free variables
    x_ = findall(x->isa(x,Colon),lf.args)
    # indices of fixed variables
    x! = setdiff(1:length(lf.args),x_)

    # the calling order is aligned with the empty spots
    xs = vcat(zip(x_,vals)...,zip(x!,lf.args[x!])...)
    args = map(x->x[2],sort(xs;by=x->x[1]))

    # unused vals go to the end
    callit = lf.func(args...,vals[length(x_)+1:end]...; kw...)

    return callit
end

[1,2,3,4,1,1,5]|> replace![ : , 1=>10, 3=>300, count=2]|> filter[>(50)]  # == [300]

log[2](2) == log[:,2](2) == log[2][2]() == log[2,2]()  # == true

๋žŒ๋‹ค ๋˜๋Š” ์Šค๋ ˆ๋”ฉ ๋งคํฌ๋กœ๋ณด๋‹ค ํ›จ์”ฌ ๋Š๋ฆฌ์ง€ ๋งŒ ๋งค์šฐ ๋ฉ‹์ง€๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋Œ“๊ธ€์„ ๋‚จ๊ธฐ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์ƒ๊ธฐ์‹œํ‚ค๊ธฐ ์œ„ํ•ด https://github.com/JuliaLang/julia/pull/24990 ์—์„œ ๊ด€๋ จ ํ† ๋ก ์„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค

๋˜ํ•œ ์ž๋ฆฌ ํ‘œ์‹œ ์ž์— ๋Œ€ํ•ด _ ๊ตฌ๋ฌธ์˜ ํ•จ์ˆ˜ ์ฒด์ธ ์นœํ™”์  ์ธ ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๋Š” https://github.com/c42f/Underscores.jl ์„ ์‚ฌ์šฉํ•ด ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์˜ˆ์ œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ @jpivarski , ๋‹น์‹ ์€ ์ƒ๋‹นํžˆ ์นœ์ˆ™ํ•˜๊ณ  ํŽธ์•ˆ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๊ด€๋ จ ๋ฌธ์ œ

i-apellaniz picture i-apellaniz  ยท  3์ฝ”๋ฉ˜ํŠธ

Keno picture Keno  ยท  3์ฝ”๋ฉ˜ํŠธ

StefanKarpinski picture StefanKarpinski  ยท  3์ฝ”๋ฉ˜ํŠธ

omus picture omus  ยท  3์ฝ”๋ฉ˜ํŠธ

wilburtownsend picture wilburtownsend  ยท  3์ฝ”๋ฉ˜ํŠธ