From cdb50f80db059deee785bfccef7f2c9c333ea063 Mon Sep 17 00:00:00 2001 From: mryouse Date: Wed, 6 Jul 2022 00:21:27 +0000 Subject: implement string length function --- neb/std/strings.py | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'neb') diff --git a/neb/std/strings.py b/neb/std/strings.py index 7e3177e..0da64da 100644 --- a/neb/std/strings.py +++ b/neb/std/strings.py @@ -47,3 +47,8 @@ def interpretRestChar(symbol, args, env, ns): return String(args[0].value[1:]) STRINGS.register("rest-char", Builtin("rest-char", interpretRestChar, [Arg("string", TypeEnum.STRING)], return_type=Type(":string"))) + +def interpretLength(symbol, args, env, ns): + return Int(len(args[0].value)) + +STRINGS.register("length", Builtin("length", interpretLength, [Arg("string", TypeEnum.STRING)], return_type=Type(":int"))) -- cgit v1.2.3 From 7ae8bce37e0fa24ce9cdbcc51bfc1ed4c3c690e6 Mon Sep 17 00:00:00 2001 From: mryouse Date: Wed, 6 Jul 2022 00:23:47 +0000 Subject: implement env function --- neb/std/sys.py | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'neb') diff --git a/neb/std/sys.py b/neb/std/sys.py index 3dc87e9..525895a 100644 --- a/neb/std/sys.py +++ b/neb/std/sys.py @@ -43,3 +43,9 @@ def interpretBench(symbol, args, env, ns): return ret SYS.register("bench", Builtin("bench", interpretBench, [Arg("command", TypeEnum.ANY, lazy=True)], return_type=Type(":any"))) + +def interpretEnv(symbol, args, env, ns): + items = os.environ[args[0].value].split(":") + return List([String(item) for item in items]) + +SYS.register("env", Builtin("env", interpretEnv, [Arg("regex", TypeEnum.STRING)], return_type=Type(":string"))) -- cgit v1.2.3 From 8b2996445fb91125d8c367ddac246ea3d2d05adc Mon Sep 17 00:00:00 2001 From: mryouse Date: Wed, 6 Jul 2022 01:03:14 +0000 Subject: add a type to :handle --- neb/structs.py | 1 + 1 file changed, 1 insertion(+) (limited to 'neb') diff --git a/neb/structs.py b/neb/structs.py index 8598344..c5707a4 100644 --- a/neb/structs.py +++ b/neb/structs.py @@ -94,6 +94,7 @@ class String(Literal): class Handle: def __init__(self, file): self.file = file + self.type_ = TypeEnum.HANDLE def __str__(self): return f"{self.file.name} :handle" -- cgit v1.2.3 From 6ee92c12a58637101e1cd54caea222630a2e9d4b Mon Sep 17 00:00:00 2001 From: mryouse Date: Wed, 6 Jul 2022 01:55:50 +0000 Subject: add a type to types called :type --- neb/__init__.py | 1 + neb/std/types.py | 7 +++++++ neb/typeclass.py | 1 + 3 files changed, 9 insertions(+) (limited to 'neb') diff --git a/neb/__init__.py b/neb/__init__.py index 7296c58..dd7245a 100644 --- a/neb/__init__.py +++ b/neb/__init__.py @@ -174,6 +174,7 @@ class TypeWrap: self.name = name self.parent = parent self.is_func = is_func + self.type_ = TypeEnum.TYPE def validate_type(self, target, env, ns): # if it's an any type, it's valid diff --git a/neb/std/types.py b/neb/std/types.py index 872f29a..0d3db03 100644 --- a/neb/std/types.py +++ b/neb/std/types.py @@ -74,6 +74,11 @@ def interpretIsHandle(symbol, args, env, ns): TYPES.register("handle?", Builtin("handle?", interpretIsHandle, [Arg("arg", TypeEnum.ANY)], return_type=Type(":bool"))) +def interpretIsType(symbol, args, env, ns): + return Bool(isinstance(args[0], TypeWrap)) + +TYPES.register("type?", Builtin("type?", interpretIsType, [Arg("arg", TypeEnum.ANY)], return_type=Type(":bool"))) + # add types to env any_type = NebType(":any", None, interpretIsAny) literal_type = NebType(":literal", any_type, interpretIsLiteral) @@ -84,6 +89,7 @@ number_type = NebType(":number", literal_type, interpretIsNumber) int_type = NebType(":int", number_type, interpretIsInt) float_type = NebType(":float", number_type, interpretIsFloat) handle_type = NebType(":handle", any_type, interpretIsHandle) +type_type = NebType(":type", any_type, interpretIsType) TYPES.register(":any", any_type) TYPES.register(":literal", literal_type) @@ -94,3 +100,4 @@ TYPES.register(":number", number_type) TYPES.register(":int", int_type) TYPES.register(":float", float_type) TYPES.register(":handle", handle_type) +TYPES.register(":type", type_type) diff --git a/neb/typeclass.py b/neb/typeclass.py index a6daaf9..75f61b1 100644 --- a/neb/typeclass.py +++ b/neb/typeclass.py @@ -10,6 +10,7 @@ class TypeEnum(Enum): LITERAL = auto() BOOL = auto() HANDLE = auto() + TYPE = auto() USER = auto() def __str__(self): -- cgit v1.2.3 From 276dd853729a7c71ef4805786793bbc8f651b00d Mon Sep 17 00:00:00 2001 From: mryouse Date: Wed, 6 Jul 2022 02:17:02 +0000 Subject: bugfix: 'while' and 'block' missing new environment --- neb/std/core.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'neb') diff --git a/neb/std/core.py b/neb/std/core.py index 1c3c4b4..574455d 100644 --- a/neb/std/core.py +++ b/neb/std/core.py @@ -124,25 +124,27 @@ def interpretFunc(symbol, args, env, ns): CORE.register("func", Builtin("func", interpretFunc, [def_name_arg, lambda_args_arg, lambda_body_arg], lambda_body_arg, Type(":list"))) def interpretBlock(symbol, args, env, ns): + new_env = Environment(env) ret = List([]) for arg in args: - ret = evaluate(arg, env, ns) + ret = evaluate(arg, new_env, ns) return ret block_arg = Arg("expr", TypeEnum.ANY, lazy=True) CORE.register("block", Builtin("block", interpretBlock, [block_arg], block_arg)) def interpretWhile(symbol, args, env, ns): + new_env = Environment(env) cond = args[0] ret = List([]) while True: - ev = evaluate(cond, env, ns) + ev = evaluate(cond, new_env, ns) if not isinstance(ev, Bool): raise InterpretPanic(symbol, "expects a :bool condition", ev) if not ev.value: break for arg in args[1:]: - ret = evaluate(arg, env, ns) + ret = evaluate(arg, new_env, ns) return ret CORE.register("while", Builtin("while", interpretWhile, [Arg("cond", TypeEnum.BOOL, lazy=True)], Arg("expr", TypeEnum.ANY, lazy=True))) -- cgit v1.2.3