Здравствуйте, VladD2, Вы писали:
VD>VD> public Convert(transform : Expr -> Expr) : Expr // добавили поддержку трансформации выражений
VD> {
VD> def res = transform(this);
VD> match (res)
VD> {
VD> | Literal => res
VD> | Plus (e1, e2) => Plus (e1.Convert(transform), e2.Convert(transform))
VD> | Minus(e1, e2) => Minus(e1.Convert(transform), e2.Convert(transform))
VD> | Mul (e1, e2) => Mul (e1.Convert(transform), e2.Convert(transform))
VD> | Div (e1, e2) => Div (e1.Convert(transform), e2.Convert(transform))
VD> | Call(name, parms) => Call(name, parms.Map(_.Convert(transform)))
VD> }
VD> }
VD> def expr = expr.Convert(fun(e : Expr) { | Mul(x, Literal(1.0)) => x | _ => e });
VD>
ИМХО у тебя тут ошибочка.
Ибо выражение
Mul(Mul(Literal(5), Literal(1)), Literal(1))
Будет преобразовано в
Mul(Literal(5), Literal(1))
Я бы написал так:
public Convert(transform : Expr -> Expr) : Expr // добавили поддержку трансформации выражений
{
def res = match (this)
{
| Literal => this
| Plus (e1, e2) => Plus (e1.Convert(transform), e2.Convert(transform))
| Minus(e1, e2) => Minus(e1.Convert(transform), e2.Convert(transform))
| Mul (e1, e2) => Mul (e1.Convert(transform), e2.Convert(transform))
| Div (e1, e2) => Div (e1.Convert(transform), e2.Convert(transform))
| Call(name, parms) => Call(name, parms.Map(_.Convert(transform)))
}
transform(res);
}
Тогда это выражение будет преобразовано в Literal(5)
... << RSDN@Home 1.2.0 alpha rev. 673>>