diff options
| author | mryouse | 2022-07-01 02:45:23 +0000 | 
|---|---|---|
| committer | mryouse | 2022-07-01 02:45:23 +0000 | 
| commit | d914e16f0b4de7a20df9dbd2d5baa97fa08424a7 (patch) | |
| tree | af5a686e6159fd129bac304ba26ea3eb7b481f7e /neb/std/types.py | |
| parent | bf8900200c25d383c883501446a8048ad8966d94 (diff) | |
attempt to add a generic list type
Diffstat (limited to 'neb/std/types.py')
| -rw-r--r-- | neb/std/types.py | 36 | 
1 files changed, 30 insertions, 6 deletions
| diff --git a/neb/std/types.py b/neb/std/types.py index b5422da..80288fa 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,29 @@ 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_func = env.get(inner.name).is_func + +    for arg in args[0].args: +        if inner_func(inner, [arg], env, ns).value is False: +            return Bool(False) + +        #if not isinstance(arg, String): +        #    return Bool(False) +    return Bool(True) +  TYPES.register("list?", Builtin("list?", interpretIsList, [Arg("arg", TypeEnum.ANY)], return_type=Type(":bool"))) @@ -83,20 +105,22 @@ TYPES.register("list-of-string?", Builtin("list-of-string?", interpretIsListOfSt  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)  float_type = NebType(":float", number_type, interpretIsFloat) -list_of_string_type = NebType(":[:string]", list_type, interpretIsListOfString) +#list_of_string_type = NebType(":[:string]", list_type, interpretIsListOfString)  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)  TYPES.register(":float", float_type) -TYPES.register(":[:string]", list_of_string_type) +#TYPES.register(":[:string]", list_of_string_type) | 
