Arithmetic evaluation: Difference between revisions

no edit summary
m (Spelling/grammar/aesthetics.)
No edit summary
Line 7:
*Multiplication/Division (left to right)
*Addition/Subtraction (left to right)
 
=={{header|D}}==
 
module test;
import std.stdio;
int calculate(string expr)
{
string take(int count)
{
auto res = expr[0 .. count];
expr = expr[count .. $];
return res;
}
string peek(int count)
{
if (expr.length < count) count = expr.length;
return expr [0 .. count];
}
int delegate(int level) descent;
// grab the next number from the input expression
int getNumber()
{
int res;
// if our "number" is a parantheses-wrapped expression, evaluate it
if (peek(1) == "(") { take(1); return descent(0); }
while (expr.length)
{
auto next = peek(1)[0];
// if the next character is a digit ...
if (next >= '0' && next <= '9')
{
res = res * 10 + (next-'0');
take(1);
} else return res;
}
return res;
}
// descent evaluates a level-l expression (1: multiplication and division, 0: also addition and subtraction)
descent = (int l) {
auto num = getNumber; // get the first number of our expression
while (expr.length)
{
auto op = take(1)[0];
if (op == ')') return num; // expression end
if (op == '*') num *= getNumber;
if (op == '/') num /= getNumber;
if (l == 1) return num;
if (op == '+') num += descent(1);
if (op == '-') num -= descent(1);
}
return num;
};
return descent(0);
}
void main()
{
writefln(calculate("(3+50)*7-9"), ", ", (3+50)*7-9);
}
 
=={{header|Haskell}}==
Anonymous user