μ΄λ€ μΈμ΄μ λν΄, κ·Έ μΈμ΄μ λ¬Έλ²μ λν ννμ μ μνλ©΄μ κ·Έκ²(νν)μ μ¬μ©νμ¬ ν΄λΉ μΈμ΄λ‘ κΈ°μ λ λ¬Έμ₯μ ν΄μνλ ν΄μμλ₯Ό ν¨κ» μ μνλ€.
νΉμ ν μ’ λ₯μ λ¬Έμ κ° μμ£Ό λ°μν λλ, μ΄λ€ κ°κ²°ν μΈμ΄λ₯Ό μ¨μ κ·Έ λ¬Έμ λ₯Ό λ¬Έμ₯μΌλ‘ νννλ κ²μ΄ λμ μ μλ€. κ·Έλ¦¬κ³ λμ κ·Έ λ¬Έμ₯μ ν΄μνλ ν΄μμλ₯Ό λ§λ€μ΄ λ¬Έμ₯μ ν΄μνκ² νμ¬ λ¬Έμ λ₯Ό ν΄κ²°νλ€. μ΄λ ν΄κ²°μ νμν μ½λλ₯Ό μμ±νκΈ°λ³΄λ¨ κ°λ¨ν μΈμ΄λ‘ λ¬Έμ₯μ λ°λ³΅μ μΌλ‘ μμ±νκΈ°λ§ νλ©΄ ν΄κ²° λ μ μλ€.
μλ₯Όλ€λ©΄ λ€μκ³Ό κ°λ€. μ΄λ€ ν¨ν΄μ μΌμΉλλ λ¬Έμμ΄μ μ°Ύλ λ¬Έμ λ μΌλ°μ μΈ λ¬Έμ μ μνλ€. μ΄λ, μ κ· ννμμ λ¬Έμμ΄ ν¨ν΄μ μ μνλ λ° μ¬μ©λλ νμ€ μΈμ΄λ€. λ¬Έμμ΄μμ μ΄λ€ ν¨ν΄μ μ°Ύλ μκ³ λ¦¬μ¦μ λ§€λ² μμ±νλ κ²λ³΄λ€, λ°κ²¬ν λ¬Έμμ΄μ μ μνλ μ κ· ννμμ ν΄μνλ μκ³ λ¦¬μ¦μ ν λ² λ§λλ κ²μ΄ λ λ«λ€.
ν΄μμ ν¨ν΄μ κ°λ¨ν μΈμ΄μ λ¬Έλ²μ μ μνλ λ°©λ²κ³Ό κ·Έ μΈμ΄λ‘ λ¬Έμ₯μ ꡬμ±νλ λ°©λ², μ΄λ€ λ¬Έμ₯μ ν΄μνλ λ°©λ²μ μ€λͺ νλ€.
- ꡬ문 λΆμ μμ±κΈ°λ μΆμ ꡬ문 νΈλ¦¬λ₯Ό μμ±νμ§ μκ³ λ λ¬Έμ₯μ ν΄μ ν μ μκΈ° λλ¬Έμ, μκ°κ³Ό 곡κ°μ μ μ½ ν μ μλ€.
- μΌμ°¨μ μΌλ‘ ꡬ문 λΆμ νΈλ¦¬λ₯Ό λ€λ₯Έ ννλ‘ λ²μν λ.
sealed class Expression {
class Constant(val value: Int) : Expression()
class Add(val left: Expression, val right: Expression) : Expression()
class Mul(val left: Expression, val right: Expression) : Expression()
class Interpreter {
fun interpret(expression: Expression): Int = when (expression) {
is Mul -> interpret(expression.left) * interpret(expression.right)
is Add -> interpret(expression.left) + interpret(expression.right)
is Constant -> expression.value
}
}
fun toInt(): Int = Interpreter().interpret(this)
}
fun main() {
println(Expression.Constant(2).toInt())
println(Expression.Add(Expression.Constant(2), Expression.Constant(3)).toInt())
println(Expression.Mul(Expression.Constant(2), Expression.Constant(3)).toInt())
}