diff options
Diffstat (limited to 'neb/std')
| -rw-r--r-- | neb/std/core.py | 4 | ||||
| -rw-r--r-- | neb/std/types.py | 29 |
2 files changed, 27 insertions, 6 deletions
diff --git a/neb/std/core.py b/neb/std/core.py index 1c3c4b4..d846498 100644 --- a/neb/std/core.py +++ b/neb/std/core.py @@ -201,9 +201,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 872f29a..9cd8e6d 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"))) @@ -78,7 +97,8 @@ TYPES.register("handle?", Builtin("handle?", interpretIsHandle, [Arg("arg", Type 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) @@ -88,7 +108,8 @@ handle_type = NebType(":handle", any_type, interpretIsHandle) 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) |
