aboutsummaryrefslogtreecommitdiff
path: root/neb
diff options
context:
space:
mode:
authormryouse2022-07-29 19:35:26 +0000
committermryouse2022-07-29 19:35:26 +0000
commit8c7ff22c9cce5478eb20046b7f5f649f529cdf95 (patch)
tree842c4e79a0e2b05f52e89e556f39b3f8f6978eb7 /neb
parent82f5622dd6babf8d3984b694a3267aa3eae92d12 (diff)
implement a :nil type, which is the empty list
Diffstat (limited to 'neb')
-rw-r--r--neb/std/types.py10
-rw-r--r--neb/structs.py2
2 files changed, 11 insertions, 1 deletions
diff --git a/neb/std/types.py b/neb/std/types.py
index 44906d8..20aa27a 100644
--- a/neb/std/types.py
+++ b/neb/std/types.py
@@ -174,12 +174,21 @@ istype_multi = MultiFunction("type?")
istype_multi.register(istype_func)
TYPES.register("type?", istype_multi)
+def interpretIsNil(symbol, args, env, ns):
+ return Bool(isinstance(args[0], List) and len(args[0].args) == 0)
+
+isnil_func = Builtin("nil?", interpretIsNil, [Arg("arg", TypeEnum.ANY)], return_type=Type(":bool"))
+isnil_multi = MultiFunction("nil?")
+isnil_multi.register(isnil_func)
+TYPES.register("nil?", isnil_multi)
+
# 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)
bracket_type = NebType(":[]", any_type, interpretIsList)
+nil_type = NebType(":nil", bracket_type, interpretIsNil)
brace_type = NebType(":{}", any_type, interpretIsNonEmptyList)
bool_type = NebType(":bool", literal_type, interpretIsBool)
number_type = NebType(":number", literal_type, interpretIsNumber)
@@ -193,6 +202,7 @@ TYPES.register(":literal", literal_type)
TYPES.register(":string", string_type)
#TYPES.register(":list", list_type)
TYPES.register(":[]", bracket_type)
+TYPES.register(":nil", nil_type)
TYPES.register(":{}", brace_type)
TYPES.register(":bool", bool_type)
TYPES.register(":number", number_type)
diff --git a/neb/structs.py b/neb/structs.py
index 8c643b5..2423a69 100644
--- a/neb/structs.py
+++ b/neb/structs.py
@@ -121,7 +121,7 @@ class Type:
else:
return self.name
-_native_types = ":any :literal :string :bool :number :int :float :[] :{} :handle :type"
+_native_types = ":any :literal :string :bool :number :int :float :[] :nil :{} :handle :type"
ALL_TYPES = {x: Type(x) for x in _native_types.split(" ")}
class Symbol: