aboutsummaryrefslogtreecommitdiff
path: root/neb/std/types.py
diff options
context:
space:
mode:
Diffstat (limited to 'neb/std/types.py')
-rw-r--r--neb/std/types.py60
1 files changed, 60 insertions, 0 deletions
diff --git a/neb/std/types.py b/neb/std/types.py
new file mode 100644
index 0000000..3cf55ac
--- /dev/null
+++ b/neb/std/types.py
@@ -0,0 +1,60 @@
+from .. import TypeEnum, Environment, Arg, Builtin, evaluate
+from ..structs import *
+
+TYPES = Environment()
+
+def interpretIsBool(symbol, args, env, ns):
+ return Bool(isinstance(args[0], Bool))
+
+TYPES.register("bool?", Builtin(interpretIsBool, [Arg("arg", TypeEnum.ANY)]))
+
+def interpretIsFloat(symbol, args, env, ns):
+ return Bool(isinstance(args[0], Float))
+
+TYPES.register("float?", Builtin(interpretIsFloat, [Arg("arg", TypeEnum.ANY)]))
+
+def interpretIsNumber(symbol, args, env, ns):
+ ret = isinstance(args[0], Int) or isinstance(args[0], Float)
+ return Bool(ret)
+
+TYPES.register("number?", Builtin(interpretIsNumber, [Arg("arg", TypeEnum.ANY)]))
+
+def interpretIsInt(symbol, args, env, ns):
+ return Bool(isinstance(args[0], Int))
+
+TYPES.register("int?", Builtin(interpretIsInt, [Arg("arg", TypeEnum.ANY)]))
+
+def interpretIsList(symbol, args, env, ns):
+ return Bool(isinstance(args[0], List))
+
+TYPES.register("list?", Builtin(interpretIsList, [Arg("arg", TypeEnum.ANY)]))
+
+def interpretIsString(symbol, args, env, ns):
+ return Bool(isinstance(args[0], String))
+
+TYPES.register("string?", Builtin(interpretIsString, [Arg("arg", TypeEnum.ANY)]))
+
+def interpretStringToInt(symbol, args, env, ns):
+ try:
+ val = int(args[0].value)
+ return Int(val)
+ except:
+ raise InterpretPanic(symbol, "can't convert to an :int", args[0])
+
+TYPES.register("string->int", Builtin(interpretStringToInt, [Arg("arg", TypeEnum.STRING)]))
+
+def interpretToString(symbol, args, env, ns):
+ item = args[0]
+ if isinstance(item, String):
+ return item
+ elif isinstance(item, Literal):
+ return String(str(item))
+ else:
+ return String(f"{item}")
+
+TYPES.register("->string", Builtin(interpretToString, [Arg("arg", TypeEnum.ANY)]))
+
+def interpretTypeOf(symbol, args, env, ns):
+ return Type(f"{args[0].type_}")
+
+TYPES.register("typeof", Builtin(interpretTypeOf, [Arg("candidate", TypeEnum.ANY)]))