Re[7]: Функциональное программирование в Nemerle
От: WolfHound  
Дата: 17.05.07 14:07
Оценка: 10 (1)
Здравствуйте, 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>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.