aboutsummaryrefslogtreecommitdiff
path: root/neb/std
diff options
context:
space:
mode:
Diffstat (limited to 'neb/std')
-rw-r--r--neb/std/core.py4
-rw-r--r--neb/std/types.py29
2 files changed, 27 insertions, 6 deletions
diff --git a/neb/std/core.py b/neb/std/core.py
index 574455d..a44417c 100644
--- a/neb/std/core.py
+++ b/neb/std/core.py
@@ -203,9 +203,9 @@ def interpretType(symbol, args, env, ns):
if not isinstance(args[1], TypeWrap):
raise InterpretPanic(symbol, "parent must be a valid type", args[1])
- elif not env.contains(args[1].name):
+ elif not env.contains(args[1].name.name):
raise InterpretPanic(symbol, f"no such type {args[1]}")
- parent = env.get(args[1].name)
+ parent = env.get(args[1].name.name)
func = args[2]
if not isinstance(func, Function):
diff --git a/neb/std/types.py b/neb/std/types.py
index 0d3db03..35dca42 100644
--- a/neb/std/types.py
+++ b/neb/std/types.py
@@ -1,4 +1,4 @@
-from .. import TypeEnum, Environment, Arg, Builtin, evaluate, InterpretPanic, NebType
+from .. import TypeEnum, Environment, Arg, Builtin, evaluate, InterpretPanic, NebType, TypeWrap
from ..structs import *
TYPES = Environment()
@@ -25,7 +25,26 @@ def interpretIsInt(symbol, args, env, ns):
TYPES.register("int?", Builtin("int?", interpretIsInt, [Arg("arg", TypeEnum.ANY)], return_type=Type(":bool")))
def interpretIsList(symbol, args, env, ns):
- return Bool(isinstance(args[0], List))
+
+ # if it's not a list, we're done
+ if not isinstance(args[0], List):
+ return Bool(False)
+
+ # if the symbol isn't a type, we're done
+ elif not isinstance(symbol, Type):
+ return Bool(True)
+
+ inner = symbol.inner
+ if inner is None or inner.name == ":any":
+ return Bool(True)
+
+ inner_type = env.get(f"{inner.name}")
+ for arg in args[0].args:
+ valid = inner_type.validate_type(arg, env, ns)
+ if valid.value is False:
+ return Bool(False)
+ return Bool(True)
+
TYPES.register("list?", Builtin("list?", interpretIsList, [Arg("arg", TypeEnum.ANY)], return_type=Type(":bool")))
@@ -83,7 +102,8 @@ TYPES.register("type?", Builtin("type?", interpretIsType, [Arg("arg", TypeEnum.A
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)
+#list_type = NebType(":list", any_type, interpretIsList)
+bracket_type = NebType(":[]", any_type, interpretIsList)
bool_type = NebType(":bool", literal_type, interpretIsBool)
number_type = NebType(":number", literal_type, interpretIsNumber)
int_type = NebType(":int", number_type, interpretIsInt)
@@ -94,7 +114,8 @@ type_type = NebType(":type", any_type, interpretIsType)
TYPES.register(":any", any_type)
TYPES.register(":literal", literal_type)
TYPES.register(":string", string_type)
-TYPES.register(":list", list_type)
+#TYPES.register(":list", list_type)
+TYPES.register(":[]", bracket_type)
TYPES.register(":bool", bool_type)
TYPES.register(":number", number_type)
TYPES.register(":int", int_type)