diff options
Diffstat (limited to 'neb/std/core.py')
| -rw-r--r-- | neb/std/core.py | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/neb/std/core.py b/neb/std/core.py index 8881468..83b164c 100644 --- a/neb/std/core.py +++ b/neb/std/core.py @@ -1,4 +1,4 @@ -from .. import TypeEnum, Environment, Arg, Builtin, UserFunction, evaluate, interpret, parse, lex, InterpretPanic +from .. import TypeEnum, Environment, Arg, Builtin, UserFunction, evaluate, interpret, parse, lex, InterpretPanic, TypeWrap, Function, UserType from ..structs import * from pathlib import Path @@ -182,3 +182,33 @@ def interpretEval(symbol, args, env, ns): eval_arg = Arg("arg", TypeEnum.ANY) CORE.register("eval", Builtin("eval", interpretEval, [eval_arg])) + +def interpretType(symbol, args, env, ns): + # (type typename parent func) + if not isinstance(args[0], Type): + raise InterpretPanic(symbol, "types must begin with a colon") + name = args[0].name # NOTE: we are not evaluating the name!! + + # TODO we may need to do namespace things here + # also, we probably shouldn't be able to rename types + + if not isinstance(args[1], TypeWrap): + raise InterpretPanic(symbol, "parent must be a valid type", args[1]) + elif not env.contains(args[1].name): + raise InterpretPanic(symbol, f"no such type {args[1]}") + parent = env.get(args[1].name) + + func = args[2] + if not isinstance(func, Function): + raise InterpretPanic(symbol, "validation must be a :func", func) + + new_type = UserType(name, parent, func) + env.register(name, new_type) + return List([]) + +type_name_arg = Arg("name", TypeEnum.ANY, lazy=True) +type_parent_arg = Arg("name", TypeEnum.ANY) +type_func_arg = Arg("func", TypeEnum.ANY) +CORE.register("type", Builtin("type", interpretType, [type_name_arg, type_parent_arg, type_func_arg])) + + |
