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