pascalabcnet/InstallerSamples/LanguageFeatures/Pattern Matching/ArithmEval.pas
miks1965 8835a25254 Запретил match 1 with;
Запретил пустые case и with - в Delphi именно так
2018-08-16 13:33:27 +03:00

38 lines
799 B
ObjectPascal

type
Expr = interface
end;
Cons = auto class(Expr)
r: real;
end;
Add = auto class(Expr)
left,right: Expr;
end;
Mult = auto class(Expr)
left,right: Expr;
end;
Neg = auto class(Expr)
ex: Expr;
end;
// Создающие функции
function ConsC(r: real) := new Cons(r);
function AddC(l,r: Expr) := new Add(l,r);
function MultC(l,r: Expr) := new Mult(l,r);
function NegC(ex: Expr) := new Neg(ex);
// Вычисляющая функция
function Eval(e: Expr): real;
begin
match e with
Cons(c): Result := c;
Neg(n): Result := -Eval(n);
Add(l,r): Result := Eval(l) + Eval(r);
Mult(l,r): Result := Eval(l) * Eval(r);
end;
end;
begin
// -2 + 3 * 4
var r := AddC(NegC(ConsC(2)),MultC(ConsC(3),ConsC(4)));
Eval(r).Print;
end.