๊ฐ์ด ์ฒซ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ก ํจ์์ ์ ๋ฌ๋๊ณ ๊ฐ์ ๋ํ ํจ์ ํธ์ถ์ ์ ๋ฌ ๋ ๋งค๊ฐ ๋ณ์๊ฐ ๋์ค์ ์ถ๊ฐ๋๋๋ก Any์์ ํจ์ ํธ์ถ์ ํ์ฉ ํ ์ ์์ต๋๊น?
์ ์.
sum(a::Int, b::Int) -> a + b
a = 1
sum(1, 2) # = 3
a.sum(2) # = 3 or
1.sum(2) # = 3
๋ฐํ์ ์์ธ๋ฅผ ํผํ๊ธฐ ์ํด ํจ์๊ฐ ๋ฐํ ํ ๋ด์ฉ์ ๊ฒฐ์ ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ํ๋ผ ์ ์์ต๋๊น?
.
๊ตฌ๋ฌธ์ ๋งค์ฐ ์ ์ฉํ๋ฏ๋ก ํจ์ ํธ์ถ์ ๋์์ด๋ก๋ง ์ฌ์ฉํ์ง๋ ์์ต๋๋ค. 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์์ Lazy.jl์๋ ์ด์ @as>
๋ฅผ ๊ตฌํํ ์๋ ์์ต๋๋ค.@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
.|>
๋ก ์๋ง์ด๋์ด ๋์ฒด๋ฅผ ์ํํฉ๋๋ค.์ต์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
_
ํน๋ณํ๊ฒ ๋ง๋์ธ์ (์์ ์ต์
๋ฐ / ๋๋ ์ฌ ์์ฑ์ ํตํด ๊ฐ์ง๋ก ๋ง๋๋ ๋ค์ํ ๋ฐฉ๋ฒ ์ฐธ์กฐ)@|>@
ํ๊ณ ํจํค์ง์์ ์ํ๋ ๋ฐฉ์์ผ๋ก ์ ์ ํ ์ ์์ต๋๋ค (์ด๋ฏธ https://github.com/JuliaLang/julia/ ๋ฌธ์ / 11608)|> f
|>g
ํ์ฌ๋ณด๋ค๋ :
a |>
f |>
g
(๋ธ๋ก์ ๊ดํธ๋ก ๋ฌถ์ง ์๊ณ ๋ ๋งคํฌ๋ก๋ก ๊ตฌํํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ธ๋ก์ ๊ดํธ๋ก ๋ฌถ์ผ๋ฉด ์ด์จ๋ ์๋ํฉ๋๋ค)
|>
(์ด๋ฏธ ์ซ์ดํ๋ ์ฐ์ฐ์) ์ํผ ๋ง์ ์ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์ซ๋ค.ํธ์ง : @StefanKarpinski ๊ฐ ์๋ ์์ ์ค์ํ ๋ณ๊ฒฝ ์ฌํญ์
๋๋ค.
๋๊ตฐ๊ฐ๊ฐ typeof(|>) <: Function
์ ์์กด ํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ๋ณํ๋ ๊ทธ๊ฒ์ ์ธ์ด ๊ตฌ๋ฌธ์ ์์๋ก ๋ง๋ค ๊ฒ์
๋๋ค.
์นด๋ ๋ฅผ ์ถ๊ฐํ๊ธฐ์๋ ์ธ์ด๊ฐ ๋๋ฌด ๋ฆ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋ฏธ์น ํ๊ดด๊ฐ ๋ ๊ฒ์ด๊ณ , ์ฌ๋ฐฉ์ ์์ฒญ๋ ๋ชจํธํจ์ ๋ํ ๊ฒ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋งค์ฐ ํผ๋์ค๋ฌ์ํ์ญ์์ค.
์ด ๋ ๊ฐ์ง ์ต์
์ผ๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ๊ณ ๋ คํ ๊ฐ์น๊ฐ์๋ ๋ชจ๋ ๊ฒ์ ๋ค๋ฃน๋๋ค.
๋๋ ๋ค๋ฅธ ํต์ฐฐ๋ ฅ์ด ์๋ค๊ณ ์๊ฐํ์ง ์๋๋ค (์ฆ, "+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 ์ฐ์ฐ์๋ฅผ ๋จ์ฉํ๋ ๋์ ํ์๋ฅผ ์ฌ์ฌ์ฉ ํ ์ ์์ต๋๋ค.
๊ทธ๋์
์ผ์ข
์ ๊ณ ์ฐจ์ ํ์ (์์
๊ฐ๊ฐ ์๋ค๋ฉด 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 ์ํ๊ณ ์ด๋๊ฐ์ ์์ต๋๊น?
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 , ๋น์ ์ ์๋นํ ์น์ํ๊ณ ํธ์ ํ ๊ฒ์
๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ทธ๋์ ์ฐ๋ฆฌ์ ํ์ฌ ๋ค์ํ ๋ ธ๋ ฅ ๋ชฉ๋ก ๋ฑ
๋๋ ์ฌ๋๋ค์ด ์ด๊ฒ์ ํ์ธํ๋ ๊ฒ์ด ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค (์ด์์ ์ผ๋ก๋ ์๊ฒฌ์ ๋งํ๊ธฐ ์ ์, ๊ทธ๋ฌ๋ w / e)
๊ทธ๋ค์ ๋ชจ๋ ์ฝ๊ฐ ๋ค๋ฆ ๋๋ค.
(๋๋ ์ฐ๋์์ผ๋ก ์ฃผ๋ฌธํ๋ ค๊ณ ํฉ๋๋ค).
ํจํค์ง
๋น ํจํค์ง ํ๋กํ ํ์
๊ด๋ จ :
์๋ง๋ ์ด๊ฒ์ ์์ ๊ฒ์๋ฌผ ์ค ํ๋์์ ํธ์ง๋์ด์ผํฉ๋๋ค.
์ ๋ฐ์ดํธ ๋ ์ง : 2020 ๋ 4 ์ 20 ์ผ