let rec์ ๊ฒฐ๊ตญ ๊ตฌํํ๊ณ ํ์ ์ ์ด ์ ์ด์ํ์ง๋ง ์ผ๋จ ์ฝ๋์ ์ด ์ผ์ถ ๋๊ณ ์๋ค.... (TS Output)
isEven(S(O)) == false
isEven(S(S(O)) == true
!!!!!
@ranolp@hackers.pub ยท 41 following ยท 60 followers
FunApp
(ฮ โข ๐: Humor โ Happy, ๐ : Humor) / (๐ ๐ : Happy)
let rec์ ๊ฒฐ๊ตญ ๊ตฌํํ๊ณ ํ์ ์ ์ด ์ ์ด์ํ์ง๋ง ์ผ๋จ ์ฝ๋์ ์ด ์ผ์ถ ๋๊ณ ์๋ค.... (TS Output)
isEven(S(O)) == false
isEven(S(S(O)) == true
!!!!!
์ฅ๊ณ ๋์ ๊ฒฐ๋ก ์ Lumo IR์ let-rec์ ์ถ๊ฐํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
์ผ์ด์ด ๋ ๋ธ๋ฃจ์ธ ์ธ๋ฑ์ค ์ํด์ ๋งํ๋ค
์ด์ Lumo (GitHub)์์ fixpoint๋ฅผ ๋ฐํ์ผ๋ก ์ํธ ์ฌ๊ท ๊ฐ๋ฅํ ํจ์ ๋ฌถ์์ ์ ์ํ ์ ์๋ค. ์ฌ์ฌ MVP์ ๋์ด ๋ณด์ธ๋ค. ๋ค์ ์คํ ์ ์ฝ๋์ ์ด๋ค.
์ค๋์ ์ง์
fixpoint <- (
fn[A](f: thunk (A -> produce A)): produce A {
g <- produce (thunk (
fn(x: ฮผX. thunk (X -> produce A)): produce A {
ret <- (force unroll x)(x);
(force f)(ret)
}
));
(force g)(roll g)
}
);
fixpoint_ <- fixpoint[Unit];
(force fixpoint_)(thunk (fn(m: _): _ {
`Unit/unit {}
}))
๋ ์ด์ ํ์ ๊ฒ์ฌ๊ธฐ๋ฅผ ํต๊ณผํ๋ค!
@ranolp ๋ง์๋๋ก unification ๋ก์ง์ด ๋ฌดํ๋ฃจํ์ ์ทจ์ฝํ๋๋ฐ, ์ฌ์ค ๊ทธ๋ฅ ์กฐ์ฌํด์ ์ ์ง๊ธฐ ์ด์์ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ๋๋ฆฌ๊ณ ์ใ
ใ
@bglbgl gwyng termination์ ๋ณด์ฅํ๋ ค๋ฉด occurs check๊ฐ ํ์์ ์ด๋ผ๊ณ ๋ค์์ด์.
occurs check๋ฅผ ์ ์ง์ ์ฝ๋ฉ์ ์๋ชปํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ๋ฌดํ ๋ฃจํ๋ฅผ ๋๋ค. unification ์ด๋ ต๋ค...
unification์ด global๋ก ๋์์ผ ํ๋ค๋ ์ด์ ๋ฅผ ์ด๋์ ๋ ์ดํดํ๋ค ๊ตฌ์์ Algorithm W ๋์
์ค์ ๋ก ํ์๋ฅผ ์ง๊ณ ์๋ค.
Y = forall A. ฮปf.
let g = thunk (ฮปx. (force f) ((force (unroll x)) x)) : thunk ((ฮผX. thunk (X -> A)) -> A)
in g (roll g : ฮผX. thunk (X -> A))
๋ฅผ ํ์ ๊ฒ์ฌํ ๊ฒ ์ง๋ ์ผ์ด์๋ค.
(Y[ฮปโจ isEven: nat -> bool, isOdd: nat -> bool โฉ]) (ฮปm.
ฮปโจ
isEven: ฮปn. match n {
Nat.zero as n => return true
Nat.succ as n => return (force m::isOdd) (n.0)
}
isOdd: ฮปn. match n {
Nat.zero as n => return false
Nat.succ as n => return (force m::isEven) (n.0)
}
โฉ
)
์ด์ ์ ์ฝ๋๋ฅผ ๋์ถฉ ํ์ ๊ฒ์ฌํ ์ ์๋ ๊ฑฐ ๊ฐ๋ค.
์ด์ ์๋งจํฑ์ ํ์ํ ๋งํผ ๊ตฌํํ์ผ๋ ๋๋์ด ์ ํ์ค๋ ์ฝ๋์ ์ผ๋ก ๋์ด๊ฐ ์ ์๊ฒ ๋ค.
์ฌ๊ท ๊ตฌํ์ ์ํด Y combinator๋ฅผ ์ฌ๋ฐ๋ฅธ ํญ์ผ๋ก ์ ์ธํ ์ ์๊ฒ ํ์ ๊ฒ์ฌ๊ธฐ๋ฅผ ๊ณ ์ณค์ผ๋ TyApp์ด ๊ตฌํ๋์ด ์์ง ์์ ์ํ๊น๊ฒ๋ ์คํํ ์ ์๋ค. ์ฌํ ์ผ์ด๋ค.
match ์ง๋ฉด์ unification ๊ตฌํํ๋๋ฐ ์ด๊ฑฐ ์ ์ง๊ธฐ ์ด๋ ต๊ธด ํด๋ณด์ธ๋ค
thunk (fn(x : Nat): MaybeNat {
match(unroll(x)) {
case Nat.zero as x -> return MaybeNat.nothing
case Nat.succ as x -> let y = x.0 in return MaybeNat.just(y)
}
})
๋ฅผ Lumo๋ก ํ์ ๊ฒ์ฌํ ์ ์๊ฒ ๋์๋ค. sub1์ด๋ผ๋ ์ด๋ฆ์ ๋ถ์ผ ์ ์๋ ํจ์๋ค.
RanolP shared the below article:
ใน @disjukr@hackers.pub
ํํ ์ฌ์ฉ๋๋ JavaScript์ ๋ฐฐ์ด ์ ๋ ฌ ๋ฐฉ์์ธ `arr.sort((a, b) => a - b)`๋ ์ฝ๋๋ฅผ ์ฝ๋ ๊ฐ๋ฐ์์๊ฒ ํผ๋์ ์ค ์ ์์ต๋๋ค. ์ด ๊ธ์์๋ ์ด๋ฌํ ์ ๋ ฌ ์ฝ๋๋ฅผ ๋ณผ ๋๋ง๋ค ์ค๋ฆ์ฐจ์์ธ์ง ๋ด๋ฆผ์ฐจ์์ธ์ง ํ์ธํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ ์ค์ด๊ธฐ ์ํด, ๋ ๋ช ํํ ํจ์ ์ด๋ฆ์ ์ฌ์ฉํ ๊ฒ์ ์ ์ํฉ๋๋ค. `sortAsc(arr)`์ ๊ฐ์ด ์ค๋ฆ์ฐจ์์ ์๋ฏธํ๋ ํจ์๋ช ๋ ์ข์ง๋ง, `sort123(arr)` ๋๋ `sortAbc(arr)`์ฒ๋ผ ์ ๋ ฌ ๋ฐฉํฅ์ ์ง๊ด์ ์ผ๋ก ๋ํ๋ด๋ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ฑ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ด์ฒ๋ผ ๋ช ํํ ์ด๋ฆ์ ์ฝ๋๋ฅผ ์ดํดํ๋ ๋ฐ ํ์ํ ์ธ์ง์ ๋ ธ๋ ฅ์ ์ค์ฌ์ฃผ์ด, ๊ฐ๋ฐ ์์ฐ์ฑ ํฅ์์ ๊ธฐ์ฌํ ์ ์๋ค๋ ์ ์ ๊ฐ์กฐํฉ๋๋ค.
Read more โ@ranolp ์๋ก์ด ์ธ์ด๋ฅผ ๋ง๋์๋๊ฑด๊ฐ์?
@bglbgl gwyng ๋ง์์ compiled to c/js ์ธ์ด๊ฐ ๋ชฉํ์์
ํ๊ฐ ๊ท์น์ด ์ ์ ์ด์ํด์ง๊ณ ์๋ค.
dup, drop ์ฝ์ ์ ์ํ IR โ IR ๋ฒ์ญ์ ๋ณ๊ฐ ์คํ ์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ ๋ซ๋...
ํ๊ฐ ๊ท์น์ด ์ ์ ์ด์ํด์ง๊ณ ์๋ค.
๊ฒฐ๊ตญ AST๋ฅผ ์ง๊ณ Name Resolution์ ํ ๋ค์์ AST Lowering์ ํด์ IR์ ๋ง๋ค์ด์ผ ํ ์ด๋ช ์ธ๊ฐ๋ณด๋ค
Perceus ๋ ผ๋ฌธ์ ๋ค์ ์ฝ๊ณ ์๋ค. ๋ค ์ฝ์ผ๋ฉด ์์ฝ ์ ๋ฆฌํด์ ํด์ปค์คํ์ ๊ธ ํ๋ฒ ์ฌ๋ฆด ๋ฏ ํ๋ค.
ํ์ํ ๋๋ฌด ์ด๋ ต๋ค
์๊ฐํด๋ณด๋ variant/record ๊ท์น ์ ๊ฒ ์๋์์
ํ์ํ ๋๋ฌด ์ด๋ ต๋ค
๋๋ค ํจ์์ Introduction Rule๊น์ง ์์ฑํ๋ค.
์ง๊ธ ํ์ ๊ฒ์ฌ ๋๋ ๊ฑฐ:
() : ()Nat.zeroNat.succ(Nat.zero)Nat.succ(Nat.succ(Nat.zero))Nat.zero : Natthunk (ฮปx. return ()) : thunk (() -> ())(์ ํธ์์ koka ์ฝ๋๋ ๊ทธ๋ ๊ณ ์ด ํธ์์ effekt ์ฝ๋๋ ๊ทธ๋ ๊ณ ๊ท์ฐฎ์์ ๋์ถฉ Gemini ์์ผฐ๋ค. ํ๋ ค๋ ์ํด ๋ฐ๋๋ค)
๋ฐ๋ฉด Effekt์ Capability Passing Style ๋ฉํ ๋ชจ๋ธ๋ก ์๊ฐํ๋ฉด ์ฝ๊ฐ ์์์ด ๋ฌ๋ผ์ง๋๋ฐ, Capability๋ ๊ฐ ์ฃผ์ ์ ๊ด์ ์ผ๋ก ๋ณด๊ธฐ ๋๋ฌธ์ Effect๋ฅผ it happens๊ฐ ์๋๋ผ it requires๋ก ๋ณธ๋ค. ๊ทธ๋์ named handler ๊ฐ์ ์ฝ๋๋ฅผ ์ด๋ ๊ฒ ์ด๋ค. ๊ฑ computation์ ๋ฐ๋ ํจ์์ธ ๊ฒ.
fun swap[A]() {h1: State[A]} {h2: State[A]}: Unit = {
val a = h1.get();
val b = h2.get();
h1.set(a);
h2.set(b);
}
koka๋ happens์ง๋ง effekt๋ requires๋ค. ํ์ง๋ง named handler์์๋ ๋ ๋ค ๊ทธ๋ฅ computation์ ์ธ์๋ก ๋๊ธฐ๋ ๋ชจ์์์ ์๋ ดํ๋ค.
Scala์ given - using์ ์ฌ์ฉํ Effect ๋ชจ์ฌ๋ ์๋ง Capability Passing Style์ ๊ฐ๊น์ฐ๋๊น Effekt์ ํด์์ ๋ฐ๋ฅผ ๊ฑฐ๋ก ๋ณธ๋ค.
swap :: State a (State a ()) ๊ฐ์ ํจ์๋ฅผ algebraic effect๋ก ๊ธฐ์ ํ๋ ค๋ฉด ๊ฐ์ ํจ๊ณผ๊ฐ ๋๋ฒ ๋์ค๊ธฐ์ koka๋ named handlers๋ฅผ ์คํํ๊ณ ์๋ค.
์ณ์ ๋ฐฉํฅ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๊ธฐ์กด์ koka๋ masked effect๋ผ๋ ๋ณต์กํ ๊ฐ๋
์ ์ฌ์ฉํด outer effect์ ์ ๊ทผํ๋ค.
fun swap-with-mask() : <state<a>, state<a>> () {
val inner-val = get() // innermost
val outer-val = mask<state<a>> { get() } // skip the innermost
set(outer-val) // innermost
mask<state<a>> { set(inner-val) } // skip the innermost
}
ํ์ง๋ง named handler์ ํจ๊ป๋ผ๋ฉด ์ด๋ ๊ฒ ์ธ ์ ์๋ค
fun swap-with-named-handlers(h1, h2) : <state<a>> () {
val val1 = perform get() at h1
val val2 = perform get() at h2
perform set(val2) at h1
perform set(val1) at h2
}
(์ ํธ์์ koka ์ฝ๋๋ ๊ทธ๋ ๊ณ ์ด ํธ์์ effekt ์ฝ๋๋ ๊ทธ๋ ๊ณ ๊ท์ฐฎ์์ ๋์ถฉ Gemini ์์ผฐ๋ค. ํ๋ ค๋ ์ํด ๋ฐ๋๋ค)
๋ฐ๋ฉด Effekt์ Capability Passing Style ๋ฉํ ๋ชจ๋ธ๋ก ์๊ฐํ๋ฉด ์ฝ๊ฐ ์์์ด ๋ฌ๋ผ์ง๋๋ฐ, Capability๋ ๊ฐ ์ฃผ์ ์ ๊ด์ ์ผ๋ก ๋ณด๊ธฐ ๋๋ฌธ์ Effect๋ฅผ it happens๊ฐ ์๋๋ผ it requires๋ก ๋ณธ๋ค. ๊ทธ๋์ named handler ๊ฐ์ ์ฝ๋๋ฅผ ์ด๋ ๊ฒ ์ด๋ค. ๊ฑ computation์ ๋ฐ๋ ํจ์์ธ ๊ฒ.
fun swap[A]() {h1: State[A]} {h2: State[A]}: Unit = {
val a = h1.get();
val b = h2.get();
h1.set(a);
h2.set(b);
}
koka๋ happens์ง๋ง effekt๋ requires๋ค. ํ์ง๋ง named handler์์๋ ๋ ๋ค ๊ทธ๋ฅ computation์ ์ธ์๋ก ๋๊ธฐ๋ ๋ชจ์์์ ์๋ ดํ๋ค.
swap :: State a (State a ()) ๊ฐ์ ํจ์๋ฅผ algebraic effect๋ก ๊ธฐ์ ํ๋ ค๋ฉด ๊ฐ์ ํจ๊ณผ๊ฐ ๋๋ฒ ๋์ค๊ธฐ์ koka๋ named handlers๋ฅผ ์คํํ๊ณ ์๋ค.
์ณ์ ๋ฐฉํฅ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๊ธฐ์กด์ koka๋ masked effect๋ผ๋ ๋ณต์กํ ๊ฐ๋
์ ์ฌ์ฉํด outer effect์ ์ ๊ทผํ๋ค.
fun swap-with-mask() : <state<a>, state<a>> () {
val inner-val = get() // innermost
val outer-val = mask<state<a>> { get() } // skip the innermost
set(outer-val) // innermost
mask<state<a>> { set(inner-val) } // skip the innermost
}
ํ์ง๋ง named handler์ ํจ๊ป๋ผ๋ฉด ์ด๋ ๊ฒ ์ธ ์ ์๋ค
fun swap-with-named-handlers(h1, h2) : <state<a>> () {
val val1 = perform get() at h1
val val2 = perform get() at h2
perform set(val2) at h1
perform set(val1) at h2
}
Call-by-Push-Value๋ฅผ ๋ค์ ๋ฐฉ๋ฌธํ๊ณ ์๋๋ฐ ์๋ฌธ์ด ๋ ๋์ง ์์...
์ tag๋ฅผ ์ผ๊ธ ์๋ฏผ์ผ๋ก ๋ง๋ค๊ณ ์๋น ๋ฐฉ๋ฒ์ (1) ์์กดํจ์ ฮ _iโI Bแตข (2) ๊ตฌ๋ถ ํฉ ฮฃ_iโI Aแตข ์ด๋ ๊ฒ 2๊ฐ๋ ๋ง๋ค๊ฒ ํ์ง
ํ์ ๊ฒ์ฌ๊ธฐ ์ถ๋ ฅ์ ๊ฐ์ ํ๋ค. ์์ง Introduction Rule๋ฐ์ ์๊ธฐ ๋๋ฌธ์ Pfenning Recipe๋ฅผ ๋ฐ๋ผ์ ๋ชจ๋ check ๊ท์น์ด๋ค.
x : A๋ฉด inl x๋ ์์์ B์ ๋ํด A + B๋ก ๊ฒ์ฌ๋ ์ ์๋ค
ํ
v : unroll ฯ โน roll v : ฯ
๋ญ๊ฐ ๋น์ฐํ๋ค๋ฉด ๋น์ฐํ๊ธด ํ๋ฐ ํ ์ฌ๋ฐ๋ค
RanolP @ranolp@hackers.pub
์ด ๊ธ์ ํ๋ก๊ทธ๋จ์์ ์ด๋ฆ ์ถฉ๋์ ํผํ๊ณ ์ฝ๋๋ฅผ ์ ํํ๊ฒ ํ๊ฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก de Bruijn index๋ฅผ ์๊ฐํ๋ค. ๋ณ์ ์ด๋ฆ์ผ๋ก ์ธํ ํผ๋์ ํด๊ฒฐํ๊ธฐ ์ํด ฮฑ-๋ณํ์ ์ค๋ช ํ๊ณ , de Bruijn level๊ณผ index๋ฅผ ํตํด ๋ณ์๋ฅผ ์ซ์๋ก ํํํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ค. ํนํ, de Bruijn index๋ ๋ณ์๊ฐ ์ผ๋ง๋ ๋ฐ๊นฅ ์ค์ฝํ๋ฅผ ์ฐธ์กฐํ๋์ง ๋ํ๋ด์ด, ํ์์ ์ฆ๋ช ์์ ์ด๋ฆ ์๋ ๋ณ์๋ค์ ๋ค๋ฃจ๋ ๋ฐ ์ ์ฉํจ์ ๊ฐ์กฐํ๋ค. ์ด๋ฅผ ํตํด ์ฝ๋์ ๋ณธ์ง์ ๋ช ํํ ํ๊ณ , ํ์์ ์ฆ๋ช ๊ณผ์ ์์ ๋์ผํ ๊ฒ์ ์ฝ๊ฒ ์๋ณํ ์ ์๊ฒ ๋๋ค.
Read more โRanolP shared the below article:
Ailrun (UTC-5/-4) @ailrun@hackers.pub
์ด ๊ธ์ ํจ์ํ ์ธ์ด์ ํต์ฌ ๊ฐ๋ ์ ๋๋ค ๋์๋ฅผ ํตํด ์๊ฐํ๋ฉฐ, ํจ์ํ ์ธ์ด์ ํ๊ฐ ๋ฐฉ์์ ๋ํ ๊น์ด ์๋ ์ดํด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋๋ค ๋์์ ๊ธฐ๋ณธ ์์์ธ ๋ณ์, ํจ์, ํจ์ ํธ์ถ์ ์ค๋ช ํ๊ณ , ๊ฐ์ ์ํ ํธ์ถ(CBV)๊ณผ ์ด๋ฆ์ ์ํ ํธ์ถ(CBN)์ ์ฐจ์ด์ ์ ๋ช ํํ ๋ถ์ํฉ๋๋ค. ํนํ, ํด ๋ธ๋ ์ธ ๋ ๋น์ "๊ฐ ๋ฐ๊ธฐ์ ์ํ ํธ์ถ(CBPV)"์ ์๊ฐํ๋ฉฐ, ์ด ๋ฐฉ์์ด CBV์ CBN์ ๋ชจ๋ ํฌ๊ดํ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ์์ ๊ฐ์กฐํฉ๋๋ค. CBPV๊ฐ ํจ์์ ํจ์ ํธ์ถ์ ์คํ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ป๊ฒ ๋ค๋ฅด๊ฒ ํด์ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ํตํด ๋๋ค ๋์๋ฅผ ๊ธฐ๊ณ ์์ค์ผ๋ก ์ปดํ์ผํ ๋ ์ป์ ์ ์๋ ์ด์ ์ ์ค๋ช ํฉ๋๋ค. ํญ์ ๋ถ์๊ณผ ๊ฐ์ ์ต์ ํ ๊ธฐ๋ฒ์ CBPV๋ฅผ ํตํด ์ด๋ป๊ฒ ๋ ๋ช ํํ๊ฒ ํํํ ์ ์๋์ง ๋ณด์ฌ์ฃผ๋ฉฐ, GHC ์ปดํ์ผ๋ฌ์ ์ค๊ฐ ์ธ์ด๋ก์ CBPV์ ์ค์์ฑ์ ๋ถ๊ฐํฉ๋๋ค. ์ด ๊ธ์ ํจ์ํ ์ธ์ด์ ๊น์ ์ด๋ก ์ ๋ฐฐ๊ฒฝ๊ณผ ์ค์ ์ปดํ์ผ๋ฌ ๊ตฌํ ์ฌ์ด์ ์ฐ๊ฒฐ๊ณ ๋ฆฌ๋ฅผ ํ๊ตฌํ๊ณ ์ ํ๋ ๋ ์์๊ฒ ์ ์ฉํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
Read more โRanolP @ranolp@hackers.pub
์ด ๊ธ์ ํจ์ ํ์ , ํฉ ํ์ , ๊ณฑ ํ์ ๊ณผ ๋ ผ๋ฆฌ ์ฐ์ฐ์ ๋์ ๊ด๊ณ๋ฅผ ํ๊ตฌํ๋ฉฐ, ํนํ ๋ถ์ (negation)์ ํ์ ์์คํ ์์ ์ด๋ป๊ฒ ํํํ ์ ์๋์ง์ ๋ํด ์ค๋ช ํฉ๋๋ค. "P๊ฐ ์๋๋ค"๋ "P์ด๋ฉด ๊ฑฐ์ง์ด๋ค"์ ๋์น๋ผ๋ ์ ์ ์ด์ฉํ์ฌ, ํ์ ์ด๋ก ์์ ๊ฐ์ด ์์์ ๊ฑฐ์ง์ผ๋ก ํด์ํ๊ณ , ์ด๋ฅผ ํตํด "์ ์๋ฅผ 0์ผ๋ก ๋๋ ์ ์๋ค"๋ ๋ช ์ ๋ฅผ ํ์ ์ผ๋ก ํํํ๋ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค. `div_by_zero :: Int -> โฅ`์ ๊ฐ์ ํํ์ ํตํด ํ์ ์ฒด๊ณ์ ๋ช ์ ๋ ผ๋ฆฌ ๊ฐ์ ์ปค๋ฆฌ-ํ์๋ ๋์์ ๋ณด์ฌ์ฃผ๋ฉฐ, ํ์ ์์คํ ์ด ๋ ผ๋ฆฌ์ ์ถ๋ก ๊ณผ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋์ง์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
Read more โ์ด์ ํ์ ๊ฒ์ฌ๊ธฐ ์ง๋ ๋ฐ์๋ ์ต์ํด์ง๊ณ ์๋๋ฐ ๊ฒ์ ์ดํ์ ํ์ ์ ๋ณด๋ฅผ ์ด๋ป๊ฒ ์ฝ๋ ์์ฑ ๊ณผ์ ์์ ์ ์ฉํํ๋์ง ๋ชจ๋ฅด๊ฒ ๋ค
๋ชจ๋ ๋ ธ๋์ ๊ณ ์ ์๋ณ์๋ฅผ ๋ถ์ฌํ๊ณ ์ธ๋ถ์ ๊ฑฐ๋ํ ํด์๋งต Expr โ Type์ ๋ง๋๋ ์๋ฐ์ ์๋?
์ด์ ํ์ ๊ฒ์ฌ๊ธฐ ์ง๋ ๋ฐ์๋ ์ต์ํด์ง๊ณ ์๋๋ฐ ๊ฒ์ ์ดํ์ ํ์ ์ ๋ณด๋ฅผ ์ด๋ป๊ฒ ์ฝ๋ ์์ฑ ๊ณผ์ ์์ ์ ์ฉํํ๋์ง ๋ชจ๋ฅด๊ฒ ๋ค
Higher-Rank Polymorphism์ด ์์ด์ผ ํ๋๊ฐ์ ๋ํด ๊ณ ๋ฏผํ๋ ์ค ์์ผ๋ฉด unification ๊ตฌํ์ด ๊ท์ฐฎ์์ง๋ค๋ ๊ฑฐ ๊ฐ์๋ฐ
ํด์ปค์คํ์ ํ์ด์ง ๋งจ ์๋ก ๋ฒํผ์ด ์์ผ๋ฉด ์ข๊ฒ ๋ค
Higher-Order Abstract Syntax๊ฐ ์ ์ ์ฉํ์ง ์ดํด๋ณด๊ณ ์๋๋ฐ ์์ง์ ์ ๋ชจ๋ฅด๊ฒ ๋ค ๋ฉํ ์ธ์ด์ ๋์ ์ธ์ด๊ฐ ์๋ค๋ถํฐ ๊ธฐ๊ธฐ๋ฌ๋ฌํ๋ฐ
โ์/์ โ๊ณผ โ๋ค/ํโ์ ๋น๋์นญ์ฑ์ ํ๊ตญ์ด ํ์ต์๋ค์๊ฒ ์ง์ฅ์ ์ ์ฌํ ๊ฒ์ด๋ค.
์ฐธ๊ณ ๋ก ์ด๊ฑฐ ๋ค ๊ตญ๋ฆฝ๊ตญ์ด์์ ์๋ชป์ด ์๋๋ผ ํ๊ตญ์ด์ ์๋ชป์. ์ด๊ฑด ํ์ค๊ตญ์ด๋์ฌ์ ์ด ๊ทธ๋ฅ ํ์ค์ ๋ฐ์ํ์ ๋ฟ์ด๋ค. ์ฆ ์ด ๊ธ์ ์ฝ๊ณ ์๋ ๋น์ ๋ 0.000001% ์ ๋ ์๋ชป์ด ์๋ค.
- โ์์ผโ์ ๋ฏธ๋์ธ๋ฐ(์: ์์ผ์ ์์ธกํ๋ค), โ๋ท์ผโ๋ ๋ฏธ๋๋ค(์: ๋ท์ผ์ ๋ถํํ๋ค). ๋ง์ฃ ?
- ๋ง์ฐฌ๊ฐ์ง๋ก, โ์๊ธธโ์ ๋ฏธ๋๋ค(์: ์๊ธธ์ด ์ฐฝ์ฐฝํ ์ ์์ด). ๊ทธ๋ฐ๋ฐ โ๋ท๊ธธโ๋ ๋ฏธ๋๋ค(์: ์์์ ๋ท๊ธธ์ ์๊ฐํ๋ฉด ๊ฑฑ์ ์ด ์์ ๋ค).
- โ๋ท๋ โ๋ ๋ฏธ๋๊ณ (์: ์ฐ๋ฆฌ๋ ๋ท๋ ๋ ๋ง๋๊ฒ ๋์๋ค), โํ๋ โ๋ ๋ฏธ๋๋ค(์: ํ๋ ์ ๊ธฐ์ฝํ๋ค). ๊ทธ๋ฐ๋ฐ โ์๋ โ๋ ๋ฏธ๋๋ค(์: ์๋ ์ด ์ฐฝ์ฐฝํ๋ค). ํฌํํ๊ฒ โ์ ๋ โ๋ง ๊ณผ๊ฑฐ์ด๋ค.
- ๊ทธ๋ฐ๋ฐ โ์๋ โ์ ๊ฐํน ๊ณผ๊ฑฐ๋ฅผ ๊ฐ๋ฆฌํฌ ์๋ ์๋ค(์: ์ผ์ฐ์ด ์๋ ์ ํญ๊ตฐ์ ์์๊ณ โฆ).
- ๊ดํ์ฌํ์ โ๋คโ๋ โํโ๋ฅผ ๋ถ์ฌ์ ์์ ์ ๋ํ๋ผ ์ ์๋ค(์: โ๊ณ ์น ๋ค์ ๋ชจ์ตโ ๋๋ โ๊ณ ์น ํ์ ๋ชจ์ตโ). ๊ทธ๋ฐ๋ฐ ๋ฐ๋๋ก ํ๋ ค๋ฉด ๊ดํ์ฌํ์ด ์๋๋ผ ๋ช
์ฌํ์ ์จ์ผ ํ๋ค(์: โ๊ณ ์น๊ธฐ ์ ์ ๋ชจ์ตโ). ๊ทธ๋ฆฌ๊ณ , โ์ โ๋ง ์ธ ์ ์๋ค. โ์โ์ ์ฌ๊ธฐ์ ์์ ์ธ ์ ์๋ค.
- โํ์ผโ์ ๋ฏธ๋์ ์๋ฌด ๋ ์ด๋ ๋ค ๊ฐ๋ฆฌํค๋ฉฐ, ํน์ ํ ๋ ์ ๊ฐ๋ฆฌํฌ ์ ์๋ค. ๋ฐ๋ฉด โ์ ์ผโ์ ์ง์ , ์ฆ ์ธ์ ํ ๊ณผ๊ฑฐ์ 1์ผ๋ง ๊ฐ๋ฆฌํจ๋ค.
- ๊ทธ๋ฐ๋ฐ ๋ โ์ ๋ โ์ ์ธ์ ํ ๊ณผ๊ฑฐ์ 1์ผ์ ๊ฐ๋ฆฌํฌ ์๋ ์๊ณ , ๊ณผ๊ฑฐ์ ์๋ฌด ๋ ์ ๊ฐ๋ฆฌํฌ ์๋ ์๋ค.
- ๊ทธ๋ฐ๋ฐ ๋ โํ๋ โ์ ๋ฏธ๋์ ์๋ฌด ๋ ์ ๋ปํ๋ฉฐ, ์ธ์ ํ ๋ฏธ๋์ 1์ผ์ ๊ฐ๋ฆฌํฌ ์ ์๋ค.
- โ์ ๋
โ๊ณผ โํ๋
โ์ ๊ฐ๊ฐ ๊ณผ๊ฑฐ์ ์๋ฌด ํด, ๋๋ ๋ฏธ๋์ ์๋ฌด ํด๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์๋ค. ๋, ๋์นญ์ธ๊ฐ?!
- ํ์ง๋ง ํน์ ํ ํด๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ, โ์ ๋
โ์ ์ธ์ ํ ๊ณผ๊ฑฐ์ ํด๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๋ฐ๋ฉด โํ๋
โ์ โ์ฌํด์ ๋ค์๋ค์ ํดโ์ด๋ค.
- โฆ๋ญ๋ผ๊ณ ? ์๋ํ๋ฉด ๋ฏธ๋์ ํด๋ค์ ์์๋๋ก โ๋ด๋
โ-โํ๋
โ-โ๋ดํ๋
โ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ฑ
์ ์์ด๋ฒ๋ฆฌ๊ณ ์ถ์ฃ ?
- ์ฐธ๊ณ ๋ก โ๋ดํ๋
โ์ ๋์์ด์์ด์ด๋ค. ์ฌํด๊ฐ 2025๋
์ด๋ผ๋ฉด ๋ดํ๋
์ 2027๋
์ ๊ฐ๋ฆฌํฌ ์๋ ์๊ณ 2028๋
์ ๊ฐ๋ฆฌํฌ ์๋ ์๋ค. (์ด๊ฒ ์ธ์ด๋?)
- โํ๋
โ์ด โ์ฌํด์ ๋ค์๋ค์ ํดโ๊ฐ ๋๋ ์ด ์๋ฆฌ๋ ์ค์ง โ๋
โ์๋ง ์ ์ฉ๋๋ค. ์๋ฅผ ๋ค์ด โํ์ผโ, โํ์ฃผโ, โํ์โ ๋ฑ์๋ ๊ทธ๋ฐ ์๋ฏธ๊ฐ ์๋ค.
- โํ์ผโ์ ๋ฏธ๋์ ์๋ฌด ๋ ์ด๋ค. ํ์ง๋ง โํ์ฃผโ์ โํ์โ์ ์ธ์ ํ ๋ฏธ๋์ ๊ฒ ํ๋๋ง ๊ฐ๋ฆฌํจ๋ค.
- โ์ ๋
โ์ ์ธ์ ํ ๊ณผ๊ฑฐ์ ํด์ด์ง๋ง, ๊ณผ๊ฑฐ์ ๋ชจ๋ ํด๋ฅผ ๋ค ๊ฐ๋ฆฌํฌ ์๋ ์๋ค(์: ์ฐ๋ฆฌ๋ ์ ๋
์ ๊ธฐ๋ก๋ค์ ๊ฒํ ํ์ฌ ๊ทธ ์ฌ๋์ ํ์ ์ ์กฐ์ฌํด ๋ณด๊ธฐ๋ก ํ๋ค).
- ๋ฐ๋ฉด โ์ ์ผโ, โ์ ์ฃผโ, โ์ ์โ์ ์ค์ง ์ธ์ ํ ๊ณผ๊ฑฐ์ ํ๋๋ง ๊ฐ๋ฆฌํฌ ์ ์๋ค.
- โ์ ๋ฌโ๊ณผ โํ๋ฌโ๋ ๋น๋์นญ์ด๋ค.
๋๋์ฒด ์ด๊ฑธ ์ด๋ป๊ฒ ๋ฐฐ์์ ์ฐ๋ผ๋ ๊ฒ์ธ์ง. ์๊ฐํด ๋ณด๋ฉด ๋๋ ์ค์ ๋ก ์ด๋ ๊ฒ ์ฐ๊ณ ์๋ค๋ ๊ฒ๋ ๊ธฐ๊ฐ ์ฐฌ๋ค.
๊ทธ๋ฐ์:
- โ์ง๋๋ โ์๋ ํน์ ํ ๋ ์ ๊ฐ๋ฆฌํค๋ ๋ป์ด ์ ํ ์๋ค. ๋ฐ๋ฉด โ์ง๋์ฃผโ, โ์ง๋๋ฌโ, โ์ง๋ํดโ๋ ๋ชจ๋ ๊ณผ๊ฑฐ์ ์ธ์ ํ ํ๋๋ง ๊ฐ๋ฆฌํจ๋ค.
- โ๋ค์ ๋ โ๊ณผ โ๋ค์๋ โ์ ์๋ฏธ๊ฐ ์์ ํ ๋ค๋ฅด๋ค. โ๋ค์๋ โ์ โ์ ํ์ฌ์ง์ง ์๋ํ ๋ฏธ๋์ ์ด๋ค ๋ โ์ด๋ค. ๋ฐ๋ผ์ ์ธ์ ํ ๋ฏธ๋์ 1์ผ์ ๊ฐ๋ฆฌํฌ ๋์๋ โ๋ค์ ๋ โ๋ง ์ธ ์ ์๋ค. (๋์ ํ ๋ชป ์ธ์ฐ์๊ฒ ์ผ๋ฉด ๊ทธ๋ฅ โ์ดํฟ๋ โ๋ก ํผ์ ํ์๋ผโฆ)
์ ๋ณด ๋ฆฌํฐ๋ฌ์ ๊ด๋ จ ์๊ฒฌ์ ๋ณด์กดํ๋ฌ ์๋ค. ์ฐ๋ฆฌ๋ ํํ ์์ด ์๋ฃ๊ฐ ํ๊ตญ์ด ์๋ฃ๋ณด๋ค ๋ซ๋ค๋ ๋ฌธํ์ฌ๋์ฃผ์์ ์๊ฒฌ์ ๊ณต๊ฐํ๊ณค ํ๋ค. ํ์ง๋ง ์ฌ๊ธฐ์ ์จ์ ์๊ฒฌ์ด ์ฌ๋ฟ ์๋ค. ํ๋์ฉ ๊น๋ณด๋ฉฐ ์๋ฏธํด๋ณด์.
์์ด ์๋ฃ๋ ํ๊ตญ์ด ์๋ฃ๋ณด๋ค ๋ซ๋ค. => ์ ๋์๊น? ๋์์ด ๋๊ธฐ ๋๋ฌธ์. ์ ๋์์ด ๋ ๊น? => (์ง์ค์ ๊ฐ๊น๊ธฐ ๋๋ฌธ์, ๋ค์ํ ๊ฒฝํ์ด ์ ์๋์ด ์๊ธฐ ๋๋ฌธ์). ์ ์ง์ค์ ๊ฐ๊น์ธ๊น? => 1์ฐจ ์ถ์ฒ์ ๊ฐ๊น๊ธฐ ๋๋ฌธ์. ์ 1์ฐจ ์ถ์ฒ์ ๊ฐ๊น์ธ๊น? => ์ฌ์ฉ์๊ฐ ๋ค์์ด๊ธฐ ๋๋ฌธ์ ์ง์ ์ฌ์ฉํ๊ฑฐ๋ ๋ฒ์ญ๋์ด 2์ฐจ ์ถ์ฒ๋ก ๊ธฐ๋ฅํ๊ธฐ ๋๋ฌธ์. ์ ๋ค์ํ ๊ฒฝํ์ด ์์๊น? => ์์ฐ์๊ฐ ์๋ฃ ์์ฑ ์ ์์ด๋ฅผ ์ ํํ ํ๋ฅ ์ด ํ๊ตญ์ด๋ณด๋ค ๋๊ธฐ ๋๋ฌธ์.
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๋ ์์ด ์๋ฃ๊ฐ ๋์ ์ด์ ๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ํํํ ์ ์๋ค.
ํ์ ๊ณต๊ฐ์ ๋ํ๊ณ , ์ ๋ณด ์ ํ ๊ณผ์ ์์์ ์๊ณก์ ์ค์ด๊ธฐ ์ํด์ ์์ด ์น ํ์์ด ํจ๊ณผ์ ์ด๋ค. ๋ค๋ง ์์ด ์น์ด "์ธ์ ๋" ์ข์ ๊ฑด ์๋๋ค. ํ์ปด์คํผ์ค ์๋ฃ๊ฐ ๋ฏธ๊ตญ์ ๋ง๊ฒ ๋๊ฐ, ์๋๋ฉด ํ๊ตญ์ ๋ง๊ฒ ๋๊ฐ? 1์ฐจ ์ถ์ฒ์ ๊ฐ๊น์ด ๊ณณ์ ํฅํด ์๊ณก์ ์ค์ด๊ณ , ๊ทธ ์์์ ํ์ ๊ณต๊ฐ์ ์ต๋ํ ํจ์จ์ ์ผ๋ก ๋ํ์ผ ํ๋ค.
์์ด ๊ฒ์์ด๋ผ๋ ํผ์์ ์ธ ํ์์์ ๋ฒ์ด๋ ์ ๋ณด ํ์์ ๋ณธ์ง์ ์ข๋ ๊ฒ์ด ์ข๋ค.
์ค๋๋ง์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์ด์ผ๊ธฐํ๋ฌ ์๋ค. ์ค๋ ์ฃผ์ ๋ ํ์ ์คํฌ๋ฆฝํธ์ ํต์ฌ ๊ฐ์น๋ค.
๋ง์ ์ฌ๋๋ค์ด ์ ์ ํ์ ์ธ์ด๋ฅผ ๋์ ํ๋ ์ด์ ๋ก ์์ ์ฑ(Soundness)๋ฅผ ์ด์ผ๊ธฐํ๋ค. ๋ง๋ ๋ง์ด๋ค. ํ์ง๋ง ํ์ ์คํฌ๋ฆฝํธ์์ ์์ ์ฑ์ 2๋ฑ ๊ฐ์น๋ค. ๊ทธ๋ผ 1๋ฑ ๊ฐ์น๋ ๋ญ๊น?
๋ฐ๋ก ๊ฐ๋ฐ ๊ฒฝํ ๊ฐ์ ์ด๋ค. ๊ตฌ์ฒด์ ์ผ๋ก, ์ค๋ฅ ๋๊ธฐ ์ฌ์ด ๊ตฌ๋ฌธ์ ์ ๋นํ ์ค์ด๊ณ ์๋ ์์ฑ์ ๊ฐ์ ํ๋ฉฐ ํฐ ๊ท๋ชจ ๋ฆฌํฉํ ๋ง ์ ์ฌ๋ฆฌ์ (๊ทธ๋ฆฌ๊ณ any ๊ฐ์ ๊ธฐ๋ฅ์ ์ ์ผ๋ค๋ ๊ฐ์ ํ์ ๋ฐํ์์๋ ์ ์๋ฏธํ ์์ค์) ์์ ์ฑ์ ์ป๊ฒ ๋ค๋ ๊ฑฐ๋ค.
ํ์ ์คํฌ๋ฆฝํธ ๊ณต์ ์ํค ๋ฌธ์์๋ ์์ ์ฑ์ ๋ชฉํ๊ฐ ์๋๋ผ๊ณ ๋์์๋ค (#). ์ฐ๋ฆฌ๋ ๋๋๋ก ๋๊ตฌ์ ๋ชฉ์ ์ ๋ค์ด๋ง์ง ์๋ ๋ถํ์ํ ๊ธฐ๋๋ฅผ ํ๊ณค ํ๋ค. ํ์ง๋ง ๋๊ตฌ ๊ฐ๋ฐ์์ ์ธ์ฐ๋ ๊ฑด ์ฌ์ฉ์๋ก์ ์ข์ ์ ๋ต์ด ์๋๋ค.
์กฐ๊ฑด๋ถ ํ์ ๊ณผ ์ฌ๊ท ํ์ , ํ ํ๋ฆฟ ๋ฌธ์์ด ํ์ , infer ๋ฑ์ ๋ณด๋ผ. ์ ์ ๋ถ์ ๋์ด๋๊ฐ ์ง์์ ์ผ๋ก ์ฌ๋ผ๊ฐ๋ ํฌํํ ๊ธฐ๋ฅ๋ค์ด ์ธ์ด์ ๊ณ์ ์ถ๊ฐ๋๋ ์ด์ ๊ฐ ๋ฌด์์ธ๊ฐ. ์ถ๋ก ์ ํฌ๊ธฐํ๊ณ any๊ฐ ๋์ค๊ณค ํ๋ ์ด์ ๊ฐ ๋ฌด์์ธ๊ฐ.
๊ทธ๋ค์ด ์ถ๊ตฌํ๋ ๊ฒ ์์ ํ ์ธ๊ณ๊ฐ ์๋ ์ค์ฉ์ ์ธ ์ธ๊ณ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
RanolP @ranolp@hackers.pub
์ด ๊ธ์์๋ ํ๋ก์ ํธ ์งํ ์ ๊ธฐ์ ์คํ ์ ์ ์ ๋ํ ๊ฒฝํ์ ๋ฒ์น์ธ "ํ์คํ ๋ณด์กด ๋ฒ์น"์ ์๊ฐํ๋ฉฐ, ํํ ๊ธฐ์ ์คํ์ ๊ณผ๋ํ๊ฒ ์ ํํ ๊ฒฝ์ฐ ํ๋ก์ ํธ๊ฐ ์ฐ์ผ๋ก ๊ฐ ์ ์์์ ๊ฒฝ๊ณ ํฉ๋๋ค. ์ ์๋ ์ ๊ธฐ์ ๋์ ์ ๋ฐ์ํ๋ ํธํ์ฑ ๋ฌธ์ ์ ๊ทธ๋ก ์ธํ ์ถ๊ฐ ์์ ์ ๋ถ๋ด์ ์ค๋ช ํ๋ฉฐ, ์ปค๋ฎค๋ํฐ๊ฐ ํฌ๊ณ ์ฑ์ํ ๊ธฐ์ ์ ์ค์์ฑ์ ๊ฐ์กฐํฉ๋๋ค. ํํ ๊ธฐ์ ์ ์ฌ์ฉํ๋๋ผ๋ ํ๋ก์ ํธ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ด๋ ์ ์๋ ๋ ๊ฐ์ง ์กฐ๊ฑด, ์ฆ ๊ธฐ์ ์ ์์ ์ฑ๊ณผ ๊ฐ๋ฐ์์ ์๋ จ๋๋ฅผ ์ ์ํ๋ฉฐ, ํ์คํ์ ์ฌ์ฉํ๊ธฐ ์ ์ ์ถฉ๋ถํ ํ์ต๊ณผ ๊ฒฝํ์ ํตํด ๊ธฐ์ ์ ๋ด์ฑ์ ๊ธธ๋ฌ์ผ ํจ์ ์ญ์คํฉ๋๋ค. ์ด ๊ธ์ ๊ธฐ์ ์คํ ์ ํ์ ์ค์์ฑ๊ณผ ๊ฐ๋ฐ์์ ์ญ๋ ๊ฐํ ํ์์ฑ์ ๋์์ ๊ฐ์กฐํ๋ฉฐ, ๊ท ํ ์กํ ๊ธฐ์ ์คํ ์ ํ์ด ํ๋ก์ ํธ ์ฑ๊ณต์ ๋ฏธ์น๋ ์ํฅ์ ์์ฌํฉ๋๋ค.
Read more โJS์์ Promise๋ await์ผ๋ก ๊ฐ์ ์ฝ๋ ๊ฒ ์ธ์, ํ์ฌ pending ์ํ๋ฅผ ์ฝ๋ ๋ฑ์ ๋์์ ํ์ฉํ์ง ์๋๋ค. ์ด๊ฑฐ ์ ์๋๋๊ณ ํ๋ฉด Promise์ ์๋ฏธ๋ก ๊ณผ ๋ฐฐ๊ฒฝ ์ฒ ํ์ด ์ด์ฉ๊ตฌ์ ์ฉ๊ตฌํ๋ ๋๋ต์ด ๋์์จ๋ค. ๋ด ์๊ฐ์ ๊ทธ๊ฑด ํ๋ ธ๋ค. ์ด์ ๋
๊ฐ๋จํ ๋๋ต: ๊ฐ๋ฅํ๋ฉด์ ์ ์ํด์ค?
์ฝ๊ฐ๋ ๋ณต์กํ ๋๋ต
๊ทธ ์ ์ฝ ์กฐ๊ฑด์ Promise๊ฐ callback๊ณผ ๊ฐ์ ์๋ฏธ์ ๋ค๋ฅธ ํํ์ผ๋๋ ์ฑ๋ฆฝํ๋ค. callback์ด ์ ๋ฌํ๋ ๊ฐ์ ํน์ ์์ = t์ ์กด์ฌํ๋ ๊ฒ์ด๋ค. t์ดํ์ ๊ทธ ๊ฐ์ ์ฌ์ฉํ๊ธฐ์ํด์ ๋ฐ๋ก ์ ์ฅ์ ํด๋๋๊ฐํด์ ๊ฐ์ ์กด์ฌ์๊ธฐ๋ฅผ >= t ๋ก ๋ฐ๊พธ์ด์ผํ๋ค.
๊ทธ๋ฐ๋ฐ Promise๋ await์ ์ฌ๋ฌ๋ฒ ํ๋๊ฑธ ํ์ฉํ๋ค. await x; await x; ์ด๋ฐ์์ผ๋ก. ๊ฐ์ด ์์ผ๋ฉด ๊ธฐ๋ค๋ฆฌ๊ณ , ๊ฐ์ด ํ๋ฒ ๋ค์ด์ค๋ฉด ๊ทธ๊ฑธ ๊ณ์ํด์ ๋๋ ค์ค๋ค. ์ฌ๊ธฐ์ Promise๊ฐ callback์ด๋ ๋ค๋ฅธ๊ฒ ๋๋ฌ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก callback๊ณผ ๋ค๋ฅด๊ฒ ๋์ํ๊ธฐ์ํด ๊ฐ์ ์ฌ๋ถ ๋ฑ์ ๋ด๋ถ ์ํ๋ก ๊ฐ๊ณ ์์์ ๋ฐ์ ์๋ค.
์์ฝํ๋ฉด, callback๊ณผ ์์ ํ ์ํธํธํ๋ ๋ ์ ๋นํ๋๋ ์ ์ฝ์ callback์ด ์๋๋ฉด์ ๊ฐ์ํ๋๊น ๋ฌธ์ ๋ ์๊ธฐ๋ค.
๋ฌธ๋ฒ ๊ฐ์กฐ๊ฐ ๋ฐ๋ ๋๊ฐ ํ์ฐธ ์ง๋ ๊ฒ ๊ฐ์๋ฐ, AI๊ฐ ๋ณ์๋ณ ๊ฑธ ๋คํ๋ ์ธ์์ ์์ง๋ ๋์ ๋ณด์ด๋ ์์๋ค์ด ์๋ค์.
์๋ฅผ ๋ค๋ฉด, ์๋ณ์(๋ณ์), ํจ์, ๋ฑ ๋ฌธ๋ฒ ์์์ ๋ฐ๋ผ ์์ ์
ํ๋ค๊ฑฐ๋ ํ๋ ๊ฒ ์๋,
์ ์ญ์ด๋, ๋ก์ปฌ์ด๋๋ก ์์ ๋ฌ๋ฆฌ ํ๋ค๋ ์ง,
์ค๋ฅธ์ชฝ ์ฐ์ ๊ฒฐํฉ ์ฐ์ฐ์๋ฉด ๋นจ๊ฐ์, ์ผ์ชฝ ์ฐ์ ๊ฒฐํฉ์ด๋ฉด ํ๋์ ํ๋ค๋ ์ง,
์๋งจํฑ ๋ฌธ๋ฒ ๊ฐ์กฐ๊ฐ ์ผ๋ฐํ ๋ ๋๊ฐ ๋ ๊ฒ ๊ฐ์๋ฐ, ํน์ ์ ๋ง ๋ชจ๋ฅด๊ณ ์๋ ๊ฑด๊ฐ์?
RanolP shared the below article:
ๆดช ๆฐๆ (Hong Minhee) @hongminhee@hackers.pub
This post explores the enduring challenge in software programming of how to pass invisible contextual information, such as loggers or request contexts, through applications without cumbersome explicit parameter passing. It examines various approaches throughout history, including dynamic scoping, aspect-oriented programming (AOP), context variables, monads, and effect systems. Each method offers a unique solution, from the simplicity of dynamic scoping in early Lisp to the modularity of AOP and the type-safe encoding of effects in modern functional programming. The post highlights the trade-offs of each approach, such as the unpredictability of dynamic scoping or the complexity of monad transformers. It also touches on how context variables are used in modern asynchronous and parallel programming, as well as in UI frameworks like React. The author concludes by noting that the art of passing the invisible is an eternal theme in software programming, and this post provides valuable insights into the evolution and future directions of this critical aspect of software architecture.
Read more โโDeprecationโ์ ๅฐๆ๋๋ ้ๅ่ช ็ฟป่ญฏ่ช๊ฐ ๅฎ็ซ๋ ๅฟ ่ฆ๊ฐ ์๋ค.
https://hackers.pub/@hongminhee/01977192-399f-76c5-9d8c-07051a8a803a
@hongminheeๆดช ๆฐๆ (Hong Minhee)
์กฐ๊ธ ๊ธธ์ง๋ง ์ ๊ฑฐ ์์ (์๋ฌธ: Features deprecated / ์ ๊ฑฐ ์์ ์ธ ๊ธฐ๋ฅ)์ด ๊ทธ๋ญ์ ๋ญ ์ธ๋งํ ๋ฒ์ญ์ด์ธ ๊ฑฐ ๊ฐ๊ณ ์.
Gemini๋ฅผ ๊ตด๋ ค๋ณด๋ ์ฌ๋ฐ๋ ๋ฒ์ญ์ด๋ฅผ ๋ช ์ ์ํด์ฃผ๋ค์.
๋ค๋ง ์ฌ์ ํ ์ ๊ฒ๋ '์ ๊ฑฐ ์์ /์ ๊ฑฐํ '์ด ๊ฐ์ฅ ์๋ฟ๋ค์.
๋: ๊ฑด์ ํ ์ก์ ์ ๊ฑด์ ํ ์ ์ ์ด ๊น๋ ๋ค(Sound body โ Sound mind) โ ๊ฑด์ ํ์ง ์์ ์ ์ ์ด๋ผ๋ฉด ์ก์ ๋ ๊ฑด์ ํ์ง ์๋ค (ยฌSound mind โ ยฌSound body)
@: ๋น์ ์ ๋ช ์ ์ ๋์ฐ์ ์ฐธ๊ฐ์ด ๊ฐ๋ค๋ ์ฃผ์ฅ์ ํ๋ฉฐ ๋ฐฐ์ค๋ฅ ์ ๊ฐ์ ํ๊ณ ๋ง์์ต๋๋ค!!
๋: ์ ์ง์ฆ๋
์๋ํฐ๊ฐ ํ์ค์ผ์ ํ์ ์๋ฌ๋ฉ์์ง๋ฅผ ๋ณด์ฌ์ค๋ ํธ๋ฒ๋ง์ผ๋ก ๋จ๋ ์ฐฝ์ผ๋ก๋ ๋ถ์กฑํ๊ฑฐ ๊ฐ๋ค. ๋ณ๋์ ๋ทฐ๋ฅผ ๋ง๋ค์ด์ ํฌ๊ฒ ๋ณด์ฌ์ฃผ๊ณ ๋ richํ ๊ธฐ๋ฅ(๋ฉ์์ง์ ํฌํจ๋ ์ฌ๋ณผ๋ก์ navigation ๋ฑ)์ ์ ๊ณตํ๋ฉด ์ข๊ฒ ๋ค.
์, ํด์ปค์คํ์์ summary, detail ํ๊ทธ ์ง์๋๋๊ฑฐ ๋ฐฉ๊ธ ์ฒ์๋ดค์ด
๋ญ๋ผ๋ ๊ฑฐ์์ฌ
We eventually end up with constraints of the shape โ
โ and there always exists a and such that we can reduce the constraint to an equivalent constraint .โ (Parreaux and Chau, 2022, p. 10)
์ Ctrl + Enter๋ก ์ฌ๋ฆฌ๊ธฐ ๋๋๊น ๋๋ฌด ํธํ๋ค ์ด๊ฒ SNS์ง