diff options
| author | mryouse | 2022-07-27 00:43:17 +0000 |
|---|---|---|
| committer | mryouse | 2022-07-27 00:43:17 +0000 |
| commit | aa52ae991cd7bfaebd358f7d1a9482613b82396c (patch) | |
| tree | ddfe4fe51bc5280a59df970f2b13d75cf5215128 /neb/std/types.py | |
| parent | f2125f46a689abd037b081a17c112ec3170ee0e4 (diff) | |
implement {} syntax for non-empty lists
Diffstat (limited to 'neb/std/types.py')
| -rw-r--r-- | neb/std/types.py | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/neb/std/types.py b/neb/std/types.py index 7e77597..cc40066 100644 --- a/neb/std/types.py +++ b/neb/std/types.py @@ -62,6 +62,32 @@ islist_multi = MultiFunction("list?") islist_multi.register(islist_func) TYPES.register("list?", islist_multi) +def interpretIsNonEmptyList(symbol, args, env, ns): + + # if it's not a list, we're done + if not (isinstance(args[0], List) or isinstance(args[0], Expr)): + return Bool(False) + + # if it's empty, we're done + elif len(args[0].args) == 0: + 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) + + def interpretIsString(symbol, args, env, ns): return Bool(isinstance(args[0], String)) @@ -142,6 +168,7 @@ literal_type = NebType(":literal", any_type, interpretIsLiteral) string_type = NebType(":string", literal_type, interpretIsString) #list_type = NebType(":list", any_type, interpretIsList) bracket_type = NebType(":[]", any_type, interpretIsList) +brace_type = NebType(":{}", any_type, interpretIsNonEmptyList) bool_type = NebType(":bool", literal_type, interpretIsBool) number_type = NebType(":number", literal_type, interpretIsNumber) int_type = NebType(":int", number_type, interpretIsInt) @@ -154,6 +181,7 @@ TYPES.register(":literal", literal_type) TYPES.register(":string", string_type) #TYPES.register(":list", list_type) TYPES.register(":[]", bracket_type) +TYPES.register(":{}", brace_type) TYPES.register(":bool", bool_type) TYPES.register(":number", number_type) TYPES.register(":int", int_type) |
