Advertisement
CaelmBleidd

Untitled

Apr 23rd, 2018
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // var binaryFunction = function (h) {
  2. //     return function (f, g) {
  3. //         return function (x, y, z) {
  4. //             return h(f(x, y, z), g(x, y, z))
  5. //         }
  6. //     }
  7. // };
  8. //
  9. // var unaryFunction = function (h) {
  10. //     return function (f) {
  11. //         return function (x, y, z) {
  12. //             return h(f(x, y, z))
  13. //         }
  14. //     }
  15. // };
  16.  
  17. var cnst = function (arg) {
  18.     return function () {
  19.         return arg
  20.     }
  21. };
  22.  
  23. var variable = function (arg) {
  24.     return function () {
  25.         // return arguments[["x", "y", "z"].indexOf(arg)]
  26.         switch (arg) {
  27.             case "x":
  28.                 return arguments[0];
  29.             case "y":
  30.                 return arguments[1];
  31.             case "z":
  32.                 return arguments[2];
  33.         }
  34.     }
  35. };
  36.  
  37. function argsToArray(args) {
  38.     return Array.prototype.slice.call(args);
  39. }
  40.  
  41. var commonOperation = function (f) {
  42.     return function () {
  43.         var newArgs = argsToArray(arguments);
  44.         return function (x, y, z) {
  45.             var brandNewArguments = newArgs.map(function (f) {
  46.                 return f(x, y, z)
  47.             });
  48.             return f.apply(null, brandNewArguments)
  49.         }
  50.     }
  51. };
  52.  
  53. var add = commonOperation(function (x, y) {
  54.     return x + y
  55. });
  56.  
  57. var subtract = commonOperation(function (x, y) {
  58.     return x - y
  59. });
  60.  
  61. var multiply = commonOperation(function (x, y) {
  62.     return x * y
  63. });
  64.  
  65. var divide = commonOperation(function (x, y) {
  66.     return x / y
  67. });
  68.  
  69. var negate = commonOperation(function (x) {
  70.     return -x
  71. });
  72.  
  73. var cube = commonOperation(function (x) {
  74.     return x * x * x
  75. });
  76.  
  77. var cuberoot = commonOperation(function (x) {
  78.     return Math.pow(x, 1 / 3)
  79. });
  80.  
  81. var min3 = commonOperation(function (a, b, c) {
  82.     return Math.min(a, b, c);
  83. });
  84.  
  85. var max5 = commonOperation(function (a, b, c, d, e) {
  86.     return Math.max(a, b, c, d, e);
  87. });
  88.  
  89. var pi = cnst(Math.PI);
  90.  
  91. var e = cnst(Math.E);
  92.  
  93. var x = variable("x");
  94.  
  95. var y = variable("y");
  96.  
  97. var z = variable("z");
  98.  
  99. var parse = function (expression) {
  100.     var tokens = expression.split(' ');
  101.     var stack = [];
  102.     var tokensLen = tokens.length;
  103.     for (var i = 0; i < tokensLen; i++) {
  104.         switch (tokens[i]) {
  105.             case "+":
  106.                 var sum = stack.pop();
  107.                 stack.push(add(stack.pop(), sum));
  108.                 break;
  109.             case "-":
  110.                 var minus = stack.pop();
  111.                 stack.push(subtract(stack.pop(), minus));
  112.                 break;
  113.             case "*":
  114.                 var mul = stack.pop();
  115.                 stack.push(multiply(stack.pop(), mul));
  116.                 break;
  117.             case "/":
  118.                 var div = stack.pop();
  119.                 stack.push(divide(stack.pop(), div));
  120.                 break;
  121.             case "cube":
  122.                 stack.push(cube(stack.pop()));
  123.                 break;
  124.             case "cuberoot":
  125.                 stack.push(cuberoot(stack.pop()));
  126.                 break;
  127.             case "min3":
  128.                 stack.push(min3(stack.pop(), stack.pop(), stack.pop()));
  129.                 break;
  130.             case "max5":
  131.                 stack.push(max5(stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop()));
  132.                 break;
  133.             case "negate":
  134.                 stack.push(negate(stack.pop()));
  135.                 break;
  136.             case "":
  137.                 break;
  138.             case "pi":
  139.                 stack.push(pi);
  140.                 break;
  141.             case "e":
  142.                 stack.push(e);
  143.                 break;
  144.             default:
  145.                 var token = parseInt(tokens[i]);
  146.                 if (isNaN(token)) {
  147.                     stack.push(variable(tokens[i]));
  148.                 } else {
  149.                     stack.push(cnst(token));
  150.                 }
  151.         }
  152.     }
  153.     return stack.pop()
  154. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement