fork download
  1. #include <iostream>
  2. #include <map>
  3. #include <stack>
  4. #include <string>
  5.  
  6.  
  7. #define _USE_MATH_DEFINES
  8. #include <cmath>
  9.  
  10. #define NUMBERS(X) \
  11. X(Zero, 0.0) X(One, 1.0) X(Two, 2.0) X(Three, 3.0) \
  12. X(Four, 4.0) X(Five, 5.0) X(Six, 6.0) X(Seven, 7.0) \
  13. X(Eight, 8.0) X(Nine, 9.0) X(Ten, 10.0) X(Eleven, 11) \
  14. X(Pi, M_PI)
  15.  
  16. #define make delete new
  17. #define OPERATIONS(X) X(Add, +) X(Sub, -) X(Mul, *) X(Div, /)
  18.  
  19. #define VARIABLES(X) X(x) X(y) X(z)
  20.  
  21. std::map<std::string, double> variables;
  22. std::stack<double> stack;
  23.  
  24. struct Top {
  25. Top(double& x) {
  26. x = stack.top();
  27. }
  28. };
  29.  
  30. struct Pop {
  31. Pop(double& x) {
  32. delete new Top(x);
  33. stack.pop();
  34. }
  35. };
  36.  
  37. struct Push {
  38. Push (double x){
  39. stack.push(x);
  40. }
  41. };
  42.  
  43. struct Number {
  44. Number (double v) {
  45. delete new Push(v);
  46. }
  47. };
  48.  
  49. #define NUMBER_CLASS(Name, value) \
  50. struct Name { \
  51. Name () { \
  52. delete new Number(value); \
  53. } \
  54. };
  55.  
  56. NUMBERS(NUMBER_CLASS)
  57.  
  58. #define OPERATION_CLASS(Name, X) \
  59. struct Name { \
  60. Name () { \
  61. double x, y; \
  62. delete new Pop(y); \
  63. delete new Pop(x); \
  64. delete new Push(x X y); \
  65. } \
  66. };
  67.  
  68. OPERATIONS(OPERATION_CLASS)
  69.  
  70. struct VarSet {
  71. VarSet(const std::string& name) {
  72. double x;
  73. delete new Pop(x);
  74. variables[name] = x;
  75. }
  76. };
  77.  
  78. struct VarGet {
  79. VarGet(const std::string& name) {
  80. delete new Push(variables[name]);
  81. }
  82. };
  83.  
  84. #define VARIABLE_DEFINE_CLASS(Name) \
  85. struct set ## Name { \
  86. set ## Name () { \
  87. delete new VarSet(#Name); \
  88. } \
  89. };
  90.  
  91. #define VARIABLE_GET_CLASS(Name) \
  92. struct Name { \
  93. Name () { \
  94. delete new VarGet(#Name); \
  95. } \
  96. };
  97.  
  98. VARIABLES(VARIABLE_DEFINE_CLASS)
  99. VARIABLES(VARIABLE_GET_CLASS)
  100.  
  101. struct Print {
  102. template<typename n> Print (n x) {
  103. std::cout << x << std::endl;
  104. }
  105. Print () {
  106. double x;
  107. delete new Top(x);
  108. std::cout << x << std::endl;
  109. }
  110. };
  111.  
  112. int main() {
  113.  
  114. make Pi;
  115. make One;
  116. make Two;
  117. make Add;
  118. make Div;
  119. make Print("PI/3:");
  120. make Print;
  121. make setx;
  122.  
  123. make One;
  124. make One;
  125. make One;
  126. make Add;
  127. make Add;
  128. make x;
  129. make Mul;
  130. make Print("PI:");
  131. make Print;
  132.  
  133. return 0;
  134. }
Success #stdin #stdout 0s 3484KB
stdin
Standard input is empty
stdout
PI/3:
1.0472
PI:
3.14159