type Variable
= () => Unit
type Context
= Variable
=> Float
type Expression
= Context
=> Float
type Operator
= (Expression, Expression
) => Expression
def value
(variable
: Variable
)(context
: Context
) = context
(variable
)
def constant
(value
: Float
)(context
: Context
) = value
def operator
(floatOperator
: (Float, Float
) => Float
)(a
: Expression, b
: Expression
)(context
: Context
) = { floatOperator(a(context), b(context))
}
val plus
: Operator
= operator
(_ +
_) val minus
: Operator
= operator
(_ -
_) val multiply
: Operator
= operator
(_ * _) val divide
: Operator
= operator
(_ /
_) }
def sqrt
(x
: Expression
)(context
: Context
) = math.
sqrt(x
(context
)).
toFloat
val expression
= plus
(minus
(multiply
(divide
(value
(a
), value
(b
)), value
(c
)), value
(d
)), sqrt
(constant
(25f
)))
val context
= Map
(a -
> 1f, b -
> 2f, c -
> 3f, d -
> 4f
) println(expression(context))
}
b2JqZWN0IFN5bWJvbGljRXhwcmVzc2lvbnMgewoJdHlwZSBWYXJpYWJsZSA9ICgpID0+IFVuaXQKCXR5cGUgQ29udGV4dCA9IFZhcmlhYmxlID0+IEZsb2F0Cgl0eXBlIEV4cHJlc3Npb24gPSBDb250ZXh0ID0+IEZsb2F0Cgl0eXBlIE9wZXJhdG9yID0gKEV4cHJlc3Npb24sIEV4cHJlc3Npb24pID0+IEV4cHJlc3Npb24KCQoJZGVmIHZhcmlhYmxlID0gKCkgPT4gKCkKCQoJZGVmIHZhbHVlKHZhcmlhYmxlOiBWYXJpYWJsZSkoY29udGV4dDogQ29udGV4dCkgPSBjb250ZXh0KHZhcmlhYmxlKQoJCglkZWYgY29uc3RhbnQodmFsdWU6IEZsb2F0KShjb250ZXh0OiBDb250ZXh0KSA9IHZhbHVlCgkKCWRlZiBvcGVyYXRvcihmbG9hdE9wZXJhdG9yOiAoRmxvYXQsIEZsb2F0KSA9PiBGbG9hdCkoYTogRXhwcmVzc2lvbiwgYjogRXhwcmVzc2lvbikoY29udGV4dDogQ29udGV4dCkgPSB7CgkgIGZsb2F0T3BlcmF0b3IoYShjb250ZXh0KSwgYihjb250ZXh0KSkKCX0KCQoJdmFsIHBsdXM6IE9wZXJhdG9yID0gb3BlcmF0b3IoXyArIF8pCgl2YWwgbWludXM6IE9wZXJhdG9yID0gb3BlcmF0b3IoXyAtIF8pCgl2YWwgbXVsdGlwbHk6IE9wZXJhdG9yID0gb3BlcmF0b3IoXyAqIF8pCgl2YWwgZGl2aWRlOiBPcGVyYXRvciA9IG9wZXJhdG9yKF8gLyBfKQp9CgpvYmplY3QgTWFpbiBleHRlbmRzIEFwcCB7CglpbXBvcnQgU3ltYm9saWNFeHByZXNzaW9ucy5fCgkKCWRlZiBzcXJ0KHg6IEV4cHJlc3Npb24pKGNvbnRleHQ6IENvbnRleHQpID0gbWF0aC5zcXJ0KHgoY29udGV4dCkpLnRvRmxvYXQKCQoJdmFsIGEgPSB2YXJpYWJsZQoJdmFsIGIgPSB2YXJpYWJsZQoJdmFsIGMgPSB2YXJpYWJsZQoJdmFsIGQgPSB2YXJpYWJsZQoJCgl2YWwgZXhwcmVzc2lvbiA9IHBsdXMobWludXMobXVsdGlwbHkoZGl2aWRlKHZhbHVlKGEpLCB2YWx1ZShiKSksIHZhbHVlKGMpKSwgdmFsdWUoZCkpLCBzcXJ0KGNvbnN0YW50KDI1ZikpKQoKCXZhbCBjb250ZXh0ID0gTWFwKGEgLT4gMWYsIGIgLT4gMmYsIGMgLT4gM2YsIGQgLT4gNGYpCglwcmludGxuKGV4cHJlc3Npb24oY29udGV4dCkpCn0=