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.py31
1 files changed, 30 insertions, 1 deletions
diff --git a/neb/std/types.py b/neb/std/types.py
index ab099e2..b5fb993 100644
--- a/neb/std/types.py
+++ b/neb/std/types.py
@@ -1,4 +1,4 @@
-from .. import TypeEnum, Environment, Arg, Builtin, evaluate, InterpretPanic
+from .. import TypeEnum, Environment, Arg, Builtin, evaluate, InterpretPanic, NebType
from ..structs import *
TYPES = Environment()
@@ -58,3 +58,32 @@ def interpretTypeOf(symbol, args, env, ns):
return Type(f"{args[0].type_}")
TYPES.register("typeof", Builtin("typeof", interpretTypeOf, [Arg("candidate", TypeEnum.ANY)]))
+
+def interpretIsAny(symbol, args, env, ns):
+ return Bool(True)
+
+TYPES.register("any?", Builtin("any?", interpretIsAny, [Arg("arg", TypeEnum.ANY)]))
+
+def interpretIsLiteral(symbol, args, env, ns):
+ return Bool(isinstance(args[0], Literal))
+
+TYPES.register("literal?", Builtin("literal?", interpretIsLiteral, [Arg("arg", TypeEnum.ANY)]))
+
+# add types to env
+any_type = NebType(":any", None, interpretIsAny)
+literal_type = NebType(":literal", any_type, interpretIsLiteral)
+string_type = NebType(":string", literal_type, interpretIsString)
+list_type = NebType(":list", any_type, interpretIsList)
+bool_type = NebType(":bool", literal_type, interpretIsBool)
+number_type = NebType(":number", literal_type, interpretIsNumber)
+int_type = NebType(":int", number_type, interpretIsInt)
+float_type = NebType(":float", number_type, interpretIsFloat)
+
+TYPES.register(":any", any_type)
+TYPES.register(":literal", literal_type)
+TYPES.register(":string", string_type)
+TYPES.register(":list", list_type)
+TYPES.register(":bool", bool_type)
+TYPES.register(":number", number_type)
+TYPES.register(":int", int_type)
+TYPES.register(":float", float_type)