#include <iostream>
#include <map>
#include <stack>
#include <string>
#define _USE_MATH_DEFINES
#include <cmath>
#define NUMBERS(X) \
X(Zero, 0.0) X(One, 1.0) X(Two, 2.0) X(Three, 3.0) \
X(Four, 4.0) X(Five, 5.0) X(Six, 6.0) X(Seven, 7.0) \
X(Eight, 8.0) X(Nine, 9.0) X(Ten, 10.0) X(Eleven, 11) \
X(Pi, M_PI)
#define make delete new
#define OPERATIONS(X) X(Add, +) X(Sub, -) X(Mul, *) X(Div, /)
#define VARIABLES(X) X(x) X(y) X(z)
std::map<std::string, double> variables;
std::stack<double> stack;
struct Top {
Top(double& x) {
x = stack.top();
}
};
struct Pop {
Pop(double& x) {
delete new Top(x);
stack.pop();
}
};
struct Push {
Push (double x){
stack.push(x);
}
};
struct Number {
Number (double v) {
delete new Push(v);
}
};
#define NUMBER_CLASS(Name, value) \
struct Name { \
Name () { \
delete new Number(value); \
} \
};
NUMBERS(NUMBER_CLASS)
#define OPERATION_CLASS(Name, X) \
struct Name { \
Name () { \
double x, y; \
delete new Pop(y); \
delete new Pop(x); \
delete new Push(x X y); \
} \
};
OPERATIONS(OPERATION_CLASS)
struct VarSet {
VarSet(const std::string& name) {
double x;
delete new Pop(x);
variables[name] = x;
}
};
struct VarGet {
VarGet(const std::string& name) {
delete new Push(variables[name]);
}
};
#define VARIABLE_DEFINE_CLASS(Name) \
struct set ## Name { \
set ## Name () { \
delete new VarSet(#Name); \
} \
};
#define VARIABLE_GET_CLASS(Name) \
struct Name { \
Name () { \
delete new VarGet(#Name); \
} \
};
VARIABLES(VARIABLE_DEFINE_CLASS)
VARIABLES(VARIABLE_GET_CLASS)
struct Print {
template<typename n> Print (n x) {
std::cout << x << std::endl;
}
Print () {
double x;
delete new Top(x);
std::cout << x << std::endl;
}
};
int main() {
make Pi;
make One;
make Two;
make Add;
make Div;
make Print("PI/3:");
make Print;
make setx;
make One;
make One;
make One;
make Add;
make Add;
make x;
make Mul;
make Print("PI:");
make Print;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c3RhY2s+CiNpbmNsdWRlIDxzdHJpbmc+CgoKI2RlZmluZSBfVVNFX01BVEhfREVGSU5FUwojaW5jbHVkZSA8Y21hdGg+CgojZGVmaW5lIE5VTUJFUlMoWCkgXAoJWChaZXJvLCAwLjApCVgoT25lLCAxLjApCQlYKFR3bywgMi4wKQkJWChUaHJlZSwgMy4wKQlcCglYKEZvdXIsIDQuMCkJWChGaXZlLCA1LjApCVgoU2l4LCA2LjApCQlYKFNldmVuLCA3LjApCVwKCVgoRWlnaHQsIDguMCkJWChOaW5lLCA5LjApCVgoVGVuLCAxMC4wKQlYKEVsZXZlbiwgMTEpCVwKCVgoUGksIE1fUEkpCgojZGVmaW5lIG1ha2UgZGVsZXRlIG5ldwojZGVmaW5lIE9QRVJBVElPTlMoWCkgWChBZGQsICspIFgoU3ViLCAtKSBYKE11bCwgKikgWChEaXYsIC8pCgojZGVmaW5lIFZBUklBQkxFUyhYKSBYKHgpIFgoeSkgWCh6KQoKc3RkOjptYXA8c3RkOjpzdHJpbmcsIGRvdWJsZT4gdmFyaWFibGVzOwpzdGQ6OnN0YWNrPGRvdWJsZT4gc3RhY2s7CgpzdHJ1Y3QgVG9wIHsKCVRvcChkb3VibGUmIHgpIHsKCQl4ID0gc3RhY2sudG9wKCk7Cgl9Cn07CgpzdHJ1Y3QgUG9wIHsKCVBvcChkb3VibGUmIHgpIHsKCQlkZWxldGUgbmV3IFRvcCh4KTsKCQlzdGFjay5wb3AoKTsKCX0KfTsKCnN0cnVjdCBQdXNoIHsKCVB1c2ggKGRvdWJsZSB4KXsKCQlzdGFjay5wdXNoKHgpOwoJfQp9OwoKc3RydWN0IE51bWJlciB7CglOdW1iZXIgKGRvdWJsZSB2KSB7CgkJZGVsZXRlIG5ldyBQdXNoKHYpOwoJfQp9OwoKI2RlZmluZSBOVU1CRVJfQ0xBU1MoTmFtZSwgdmFsdWUpIFwKc3RydWN0IE5hbWUgeyAgICAgICAgICAgICAgICAgICAgIFwKCU5hbWUgKCkgeyAgICAgICAgICAgICAgICAgICAgIFwKCQlkZWxldGUgbmV3IE51bWJlcih2YWx1ZSk7IFwKCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKfTsKCk5VTUJFUlMoTlVNQkVSX0NMQVNTKQoKI2RlZmluZSBPUEVSQVRJT05fQ0xBU1MoTmFtZSwgWCkgXApzdHJ1Y3QgTmFtZSB7ICAgICAgICAgICAgICAgICAgICBcCglOYW1lICgpIHsgICAgICAgICAgICAgICAgICAgIFwKCQlkb3VibGUgeCwgeTsgICAgICAgICAgICAgXAoJCWRlbGV0ZSBuZXcgUG9wKHkpOyAgICAgICBcCgkJZGVsZXRlIG5ldyBQb3AoeCk7ICAgICAgIFwKCQlkZWxldGUgbmV3IFB1c2goeCBYIHkpOyAgXAoJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCn07CgpPUEVSQVRJT05TKE9QRVJBVElPTl9DTEFTUykKCnN0cnVjdCBWYXJTZXQgewoJVmFyU2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CgkJZG91YmxlIHg7CgkJZGVsZXRlIG5ldyBQb3AoeCk7CgkJdmFyaWFibGVzW25hbWVdID0geDsKCX0KfTsKCnN0cnVjdCBWYXJHZXQgewoJVmFyR2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CgkJZGVsZXRlIG5ldyBQdXNoKHZhcmlhYmxlc1tuYW1lXSk7Cgl9Cn07CgojZGVmaW5lIFZBUklBQkxFX0RFRklORV9DTEFTUyhOYW1lKSBcCnN0cnVjdCBzZXQgIyMgTmFtZSB7ICAgICAgICAgICAgICAgIFwKCXNldCAjIyBOYW1lICgpIHsgICAgICAgICAgICAgICAgXAoJCWRlbGV0ZSBuZXcgVmFyU2V0KCNOYW1lKTsgICBcCgl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKfTsKCiNkZWZpbmUgVkFSSUFCTEVfR0VUX0NMQVNTKE5hbWUpICAgXApzdHJ1Y3QgTmFtZSB7ICAgICAgICAgICAgICAgICAgICAgIFwKCU5hbWUgKCkgeyAgICAgICAgICAgICAgICAgICAgICBcCgkJZGVsZXRlIG5ldyBWYXJHZXQoI05hbWUpOyAgXAoJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKfTsKClZBUklBQkxFUyhWQVJJQUJMRV9ERUZJTkVfQ0xBU1MpClZBUklBQkxFUyhWQVJJQUJMRV9HRVRfQ0xBU1MpCgpzdHJ1Y3QgUHJpbnQgewoJdGVtcGxhdGU8dHlwZW5hbWUgbj4gUHJpbnQgKG4geCkgewoJCXN0ZDo6Y291dCA8PCB4IDw8IHN0ZDo6ZW5kbDsKCX0KCVByaW50ICgpIHsKCQlkb3VibGUgeDsKCQlkZWxldGUgbmV3IFRvcCh4KTsKCQlzdGQ6OmNvdXQgPDwgeCA8PCBzdGQ6OmVuZGw7Cgl9Cn07CgppbnQgbWFpbigpIHsKCQoJbWFrZSBQaTsKCW1ha2UgIE9uZTsKCW1ha2UgIFR3bzsKCW1ha2UgIEFkZDsKCW1ha2UgIERpdjsKCW1ha2UgIFByaW50KCJQSS8zOiIpOwoJbWFrZSAgUHJpbnQ7CgltYWtlICBzZXR4OwoJCgltYWtlICBPbmU7CgltYWtlICBPbmU7CgltYWtlICBPbmU7CgltYWtlICBBZGQ7CgltYWtlICBBZGQ7CgltYWtlICB4OwoJbWFrZSAgTXVsOwoJbWFrZSAgUHJpbnQoIlBJOiIpOwoJbWFrZSAgUHJpbnQ7CgkKCXJldHVybiAwOwp9