aboutsummaryrefslogtreecommitdiff
path: root/neb/std/math.py
diff options
context:
space:
mode:
Diffstat (limited to 'neb/std/math.py')
-rw-r--r--neb/std/math.py79
1 files changed, 79 insertions, 0 deletions
diff --git a/neb/std/math.py b/neb/std/math.py
new file mode 100644
index 0000000..85d4f55
--- /dev/null
+++ b/neb/std/math.py
@@ -0,0 +1,79 @@
+from .. import TypeEnum, Environment, Arg, Builtin, evaluate
+from ..structs import *
+import math
+
+MATH = Environment()
+
+def interpretLessThanEqual(symbol, args, env, ns):
+ return Bool(args[0].value <= args[1].value)
+
+compare_arg = Arg("num", TypeEnum.NUMBER)
+MATH.register("<=", Builtin(interpretLessThanEqual, [compare_arg, compare_arg]))
+
+def interpretGreaterThan(symbol, args, env, ns):
+ return Bool(args[0].value > args[1].value)
+
+compare_arg = Arg("num", TypeEnum.NUMBER)
+MATH.register(">", Builtin(interpretGreaterThan, [compare_arg, compare_arg]))
+
+def interpretGreaterThanEqual(symbol, args, env, ns):
+ return Bool(args[0].value >= args[1].value)
+
+MATH.register(">=", Builtin(interpretGreaterThanEqual, [compare_arg, compare_arg]))
+
+def interpretLessThan(symbol, args, env, ns):
+ return Bool(args[0].value < args[1].value)
+
+MATH.register("<", Builtin(interpretLessThan, [compare_arg, compare_arg]))
+
+def interpretAddition(symbol, args, env, ns):
+ res = 0
+ for arg in args:
+ res += arg.value
+ if isinstance(res, float):
+ return Float(res)
+ else:
+ return Int(res)
+
+term_arg = Arg("term", TypeEnum.NUMBER)
+MATH.register("+", Builtin(interpretAddition, [term_arg], term_arg))
+
+def interpretSubtraction(symbol, args, env, ns):
+ if len(args) == 1:
+ res = -args[0].value
+ else:
+ res = args[0].value
+ for arg in args[1:]:
+ res -= arg.value
+ if isinstance(res, float):
+ return Float(res)
+ else:
+ return Int(res)
+
+MATH.register("-", Builtin(interpretSubtraction, [term_arg], term_arg))
+
+def interpretMultiplication(symbol, args, env, ns):
+ res = args[0].value
+ for arg in args[1:]:
+ res = res * arg.value
+ if isinstance(res, float):
+ return Float(res)
+ else:
+ return Int(res)
+
+factor_arg = Arg("factor", TypeEnum.NUMBER)
+MATH.register("*", Builtin(interpretMultiplication, [factor_arg, factor_arg], factor_arg))
+
+def interpretDivision(symbol, args, env, ns):
+ ret = args[0].value / args[1].value
+ if int(ret) == ret:
+ return Int(int(ret))
+ else:
+ return Float(ret)
+
+MATH.register("/", Builtin(interpretDivision, [factor_arg, factor_arg]))
+
+def interpretFloor(symbol, args, env, ns):
+ return Int(math.floor(args[0].value))
+
+MATH.register("floor", Builtin(interpretFloor, [Arg("floor", TypeEnum.NUMBER)]))