diff options
| author | mryouse | 2022-06-26 01:31:14 +0000 |
|---|---|---|
| committer | mryouse | 2022-06-26 01:31:14 +0000 |
| commit | 182a05b85113631a611169a6724162ae9247b55e (patch) | |
| tree | 4524b495f79c1e71cf1f001edf274c7ccd6a495b | |
| parent | 976c0a01e9e28d13037c9b1a5045789b3500d9fe (diff) | |
add return types to builtins
| -rw-r--r-- | neb/std/boolean.py | 8 | ||||
| -rw-r--r-- | neb/std/core.py | 13 | ||||
| -rw-r--r-- | neb/std/fs.py | 8 | ||||
| -rw-r--r-- | neb/std/functools.py | 4 | ||||
| -rw-r--r-- | neb/std/lists.py | 24 | ||||
| -rw-r--r-- | neb/std/math.py | 18 | ||||
| -rw-r--r-- | neb/std/repl.py | 6 | ||||
| -rw-r--r-- | neb/std/strings.py | 12 | ||||
| -rw-r--r-- | neb/std/sys.py | 8 | ||||
| -rw-r--r-- | neb/std/term.py | 6 | ||||
| -rw-r--r-- | neb/std/types.py | 20 |
11 files changed, 63 insertions, 64 deletions
diff --git a/neb/std/boolean.py b/neb/std/boolean.py index 1d99737..973fa67 100644 --- a/neb/std/boolean.py +++ b/neb/std/boolean.py @@ -14,7 +14,7 @@ def interpretOr(symbol, args, env, ns): return Bool(False) or_arg = Arg("arg", TypeEnum.BOOL, lazy=True) -BOOLEAN.register("or", Builtin("or", interpretOr, [or_arg, or_arg], or_arg)) +BOOLEAN.register("or", Builtin("or", interpretOr, [or_arg, or_arg], or_arg, Type(":bool"))) def interpretAnd(symbol, args, env, ns): # and returns false for the first expression that returns false @@ -26,7 +26,7 @@ def interpretAnd(symbol, args, env, ns): return ev return Bool(True) -BOOLEAN.register("and", Builtin("and", interpretAnd, [or_arg, or_arg], or_arg)) +BOOLEAN.register("and", Builtin("and", interpretAnd, [or_arg, or_arg], or_arg, Type(":bool"))) def interpretEq(symbol, args, env, ns): # NOTE this currently only works for literals @@ -37,11 +37,11 @@ def interpretEq(symbol, args, env, ns): return Bool(False) eq_arg = Arg("value", TypeEnum.LITERAL) -BOOLEAN.register("eq?", Builtin("eq?", interpretEq, [eq_arg, eq_arg])) +BOOLEAN.register("eq?", Builtin("eq?", interpretEq, [eq_arg, eq_arg], return_type=Type(":bool"))) def interpretNot(symbol, args, env, ns): return Bool(not args[0].value) not_arg = Arg("not", TypeEnum.BOOL) -BOOLEAN.register("not", Builtin("not", interpretNot, [not_arg])) +BOOLEAN.register("not", Builtin("not", interpretNot, [not_arg], return_type=Type(":bool"))) diff --git a/neb/std/core.py b/neb/std/core.py index d9f512e..1c3c4b4 100644 --- a/neb/std/core.py +++ b/neb/std/core.py @@ -30,7 +30,7 @@ def interpretDef(symbol, args, env, ns): def_name_arg = Arg("name", TypeEnum.ANY, lazy=True) def_val_arg = Arg("value", TypeEnum.ANY) -CORE.register("def", Builtin("def", interpretDef, [def_name_arg, def_val_arg])) +CORE.register("def", Builtin("def", interpretDef, [def_name_arg, def_val_arg], return_type=Type(":list"))) def interpretRedef(symbol, args, env, ns): if not isinstance(args[0], Symbol): @@ -42,7 +42,7 @@ def interpretRedef(symbol, args, env, ns): env.reregister(name, args[1]) return List([]) -CORE.register("redef", Builtin("redef", interpretRedef, [def_name_arg, def_val_arg])) +CORE.register("redef", Builtin("redef", interpretRedef, [def_name_arg, def_val_arg], return_type=Type(":list"))) def interpretLambda(symbol, args, env, ns): new_args = args @@ -121,7 +121,7 @@ def interpretFunc(symbol, args, env, ns): env.register(name, func) return List([]) -CORE.register("func", Builtin("func", interpretFunc, [def_name_arg, lambda_args_arg, lambda_body_arg], lambda_body_arg)) +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): ret = List([]) @@ -157,14 +157,14 @@ def interpretUse(symbol, args, env, ns): interpret(parse(lex(data)), env, ns) return List([]) -CORE.register("use", Builtin("use", interpretUse, [Arg("filename", TypeEnum.STRING)])) +CORE.register("use", Builtin("use", interpretUse, [Arg("filename", TypeEnum.STRING)], return_type=Type(":list"))) def interpretAssert(symbol, args, env, ns): if args[0].value != True: raise InterpretPanic(symbol, "assertion failed") return List([]) -CORE.register("assert", Builtin("assert", interpretAssert, [Arg("cond", TypeEnum.BOOL)])) +CORE.register("assert", Builtin("assert", interpretAssert, [Arg("cond", TypeEnum.BOOL)], return_type=Type(":list"))) def interpretUseAs(symbol, args, env, ns): target_file_name = args[0].value @@ -176,7 +176,7 @@ def interpretUseAs(symbol, args, env, ns): interpret(parse(lex(data)), env, args[1].name) return List([]) -CORE.register("use-as", Builtin("use-as", interpretUseAs, [Arg("filename", TypeEnum.STRING), Arg("namespace", TypeEnum.ANY, lazy=True)])) +CORE.register("use-as", Builtin("use-as", interpretUseAs, [Arg("filename", TypeEnum.STRING), Arg("namespace", TypeEnum.ANY, lazy=True)], return_type=Type(":list"))) def interpretQuote(symbol, args, env, ns): return args[0] @@ -218,4 +218,3 @@ 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])) - diff --git a/neb/std/fs.py b/neb/std/fs.py index 5983e20..495c7ea 100644 --- a/neb/std/fs.py +++ b/neb/std/fs.py @@ -8,13 +8,13 @@ FS = Environment() def interpretExists(symbol, args, env, ns): return Bool(Path(args[0].value).resolve().exists()) -FS.register("exists?", Builtin("exists?", interpretExists, [Arg("filename", TypeEnum.STRING)])) +FS.register("exists?", Builtin("exists?", interpretExists, [Arg("filename", TypeEnum.STRING)], return_type=Type(":bool"))) def interpretGlob(symbol, args, env, ns): items = glob(args[0].value) return List([String(item) for item in items]) -FS.register("glob", Builtin("glob", interpretGlob, [Arg("regex", TypeEnum.STRING)])) +FS.register("glob", Builtin("glob", interpretGlob, [Arg("regex", TypeEnum.STRING)], return_type=Type(":string"))) def interpretUnlink(symbol, args, env, ns): target_path = Path(args[0].value).resolve() @@ -23,7 +23,7 @@ def interpretUnlink(symbol, args, env, ns): target_path.unlink() return List([]) -FS.register("unlink", Builtin("unlink", interpretUnlink, [Arg("filename", TypeEnum.STRING)])) +FS.register("unlink", Builtin("unlink", interpretUnlink, [Arg("filename", TypeEnum.STRING)], return_type=Type(":list"))) def interpretWithWrite(symbol, args, env, ns): target_file = args[0] @@ -57,5 +57,5 @@ def interpretReadLines(symbol, args, env, ns): out = List([String(d) for d in data]) # all lines are strings return out -FS.register("read-lines", Builtin("read-lines", interpretReadLines, [Arg("filename", TypeEnum.STRING)])) +FS.register("read-lines", Builtin("read-lines", interpretReadLines, [Arg("filename", TypeEnum.STRING)], return_type=Type(":list"))) diff --git a/neb/std/functools.py b/neb/std/functools.py index facc97d..9e426b8 100644 --- a/neb/std/functools.py +++ b/neb/std/functools.py @@ -17,7 +17,7 @@ def interpretFilter(symbol, args, env, ns): out.append(arg) return List(out) -FUNCTOOLS.register("filter", Builtin("filter", interpretFilter, [Arg("func", TypeEnum.ANY), Arg("list", TypeEnum.LIST)])) +FUNCTOOLS.register("filter", Builtin("filter", interpretFilter, [Arg("func", TypeEnum.ANY), Arg("list", TypeEnum.LIST)], return_type=Type(":list"))) def interpretMap(symbol, args, env, ns): func = args[0] @@ -32,7 +32,7 @@ def interpretMap(symbol, args, env, ns): out.append(ev) return List(out) -FUNCTOOLS.register("map", Builtin("map", interpretMap, [Arg("func", TypeEnum.ANY), Arg("list", TypeEnum.LIST)])) +FUNCTOOLS.register("map", Builtin("map", interpretMap, [Arg("func", TypeEnum.ANY), Arg("list", TypeEnum.LIST)], return_type=Type(":list"))) def interpretApply(symbol, args, env, ns): # TODO: to support lambdas, we can't assume the func is defined diff --git a/neb/std/lists.py b/neb/std/lists.py index 5aaab53..1ecbb6d 100644 --- a/neb/std/lists.py +++ b/neb/std/lists.py @@ -7,7 +7,7 @@ LISTS = Environment() def interpretListLength(symbol, args, env, ns): return Int(len(args[0].args)) -LISTS.register("list-length", Builtin("list-length", interpretListLength, [Arg("arg", TypeEnum.LIST)])) +LISTS.register("list-length", Builtin("list-length", interpretListLength, [Arg("arg", TypeEnum.LIST)], return_type=Type(":int"))) def interpretFirst(symbol, args, env, ns): if len(args[0].args) == 0: @@ -20,26 +20,26 @@ def interpretRest(symbol, args, env, ns): # TODO do we know it's not evaluated? return List(args[0].args[1:]) # we don't evaluate the remainder of the list -LISTS.register("rest", Builtin("rest", interpretRest, [Arg("arg", TypeEnum.LIST)])) +LISTS.register("rest", Builtin("rest", interpretRest, [Arg("arg", TypeEnum.LIST)], return_type=Type(":list"))) def interpretListReverse(symbol, args, env, ns): new_args = args[0].args[:] # make a copy of the args new_args.reverse() return List(new_args) -LISTS.register("list-reverse", Builtin("list-reverse", interpretListReverse, [Arg("list", TypeEnum.LIST)])) +LISTS.register("list-reverse", Builtin("list-reverse", interpretListReverse, [Arg("list", TypeEnum.LIST)], return_type=Type(":list"))) def interpretEmpty(symbol, args, env, ns): return Bool(len(args[0].args) == 0) -LISTS.register("empty?", Builtin("empty?", interpretEmpty, [Arg("list", TypeEnum.LIST)])) +LISTS.register("empty?", Builtin("empty?", interpretEmpty, [Arg("list", TypeEnum.LIST)], return_type=Type(":bool"))) def interpretShuf(symbol, args, env, ns): items = args[0].args[:] random.shuffle(items) return List(items) -LISTS.register("shuf", Builtin("shuf", interpretShuf, [Arg("list", TypeEnum.LIST)])) +LISTS.register("shuf", Builtin("shuf", interpretShuf, [Arg("list", TypeEnum.LIST)], return_type=Type(":list"))) def interpretIn(symbol, args, env, ns): target = args[0] @@ -51,7 +51,7 @@ def interpretIn(symbol, args, env, ns): in_target_arg = Arg("target", TypeEnum.LITERAL) in_list_arg = Arg("list", TypeEnum.LIST) -LISTS.register("in?", Builtin("in?", interpretIn, [in_target_arg, in_list_arg])) +LISTS.register("in?", Builtin("in?", interpretIn, [in_target_arg, in_list_arg], return_type=Type(":bool"))) def interpretLast(symbol, args, env, ns): if len(args[0].args) == 0: @@ -72,7 +72,7 @@ def interpretSlice(symbol, args, env, ns): slice_list_arg = Arg("list", TypeEnum.LIST) slice_idx_arg = Arg("idx", TypeEnum.INT) slice_length_arg = Arg("length", TypeEnum.INT, optional=True) -LISTS.register("slice", Builtin("slice", interpretSlice, [slice_list_arg, slice_idx_arg, slice_length_arg])) +LISTS.register("slice", Builtin("slice", interpretSlice, [slice_list_arg, slice_idx_arg, slice_length_arg], return_type=Type(":list"))) def interpretAppend(symbol, args, env, ns): lst = args[0] @@ -80,7 +80,7 @@ def interpretAppend(symbol, args, env, ns): items = lst.args[:] return List(items + [val]) -LISTS.register("append", Builtin("append", interpretAppend, [Arg("list", TypeEnum.LIST), Arg("item", TypeEnum.ANY)])) +LISTS.register("append", Builtin("append", interpretAppend, [Arg("list", TypeEnum.LIST), Arg("item", TypeEnum.ANY)], return_type=Type(":list"))) # TODO: this is actually for records/structs/whatever they're called def interpretRemove(symbol, args, env, ns): @@ -92,7 +92,7 @@ def interpretRemove(symbol, args, env, ns): out.append(arg) return List(out) -LISTS.register("remove", Builtin("remove", interpretRemove, [Arg("list", TypeEnum.LIST), Arg("key", TypeEnum.ANY)])) +LISTS.register("remove", Builtin("remove", interpretRemove, [Arg("list", TypeEnum.LIST), Arg("key", TypeEnum.ANY)], return_type=Type(":list"))) def interpretZip(symbol, args, env, ns): z1 = args[0] @@ -107,12 +107,12 @@ def interpretZip(symbol, args, env, ns): return List(out) zip_arg = Arg("list", TypeEnum.LIST) -LISTS.register("zip", Builtin("zip", interpretZip, [zip_arg, zip_arg])) +LISTS.register("zip", Builtin("zip", interpretZip, [zip_arg, zip_arg], return_type=Type(":list"))) def interpretList(symbol, args, env, ns): return List(args) -LISTS.register("list", Builtin("list", interpretList, [], Arg("item", TypeEnum.ANY))) +LISTS.register("list", Builtin("list", interpretList, [], Arg("item", TypeEnum.ANY), Type(":list"))) def interpretSortNumbers(symbol, args, env, ns): items = [] @@ -129,4 +129,4 @@ def interpretSortNumbers(symbol, args, env, ns): out.append(Float(item)) return List(out) -LISTS.register("sort-numbers", Builtin("sort-numbers", interpretSortNumbers, [Arg("list", TypeEnum.LIST)])) +LISTS.register("sort-numbers", Builtin("sort-numbers", interpretSortNumbers, [Arg("list", TypeEnum.LIST)], return_type=Type(":list"))) diff --git a/neb/std/math.py b/neb/std/math.py index 66d153e..79ef332 100644 --- a/neb/std/math.py +++ b/neb/std/math.py @@ -8,23 +8,23 @@ def interpretLessThanEqual(symbol, args, env, ns): return Bool(args[0].value <= args[1].value) compare_arg = Arg("num", TypeEnum.NUMBER) -MATH.register("<=", Builtin("<=", interpretLessThanEqual, [compare_arg, compare_arg])) +MATH.register("<=", Builtin("<=", interpretLessThanEqual, [compare_arg, compare_arg], return_type=Type(":bool"))) def interpretGreaterThan(symbol, args, env, ns): return Bool(args[0].value > args[1].value) compare_arg = Arg("num", TypeEnum.NUMBER) -MATH.register(">", Builtin(">", interpretGreaterThan, [compare_arg, compare_arg])) +MATH.register(">", Builtin(">", interpretGreaterThan, [compare_arg, compare_arg], return_type=Type(":bool"))) def interpretGreaterThanEqual(symbol, args, env, ns): return Bool(args[0].value >= args[1].value) -MATH.register(">=", Builtin(">=", interpretGreaterThanEqual, [compare_arg, compare_arg])) +MATH.register(">=", Builtin(">=", interpretGreaterThanEqual, [compare_arg, compare_arg], return_type=Type(":bool"))) def interpretLessThan(symbol, args, env, ns): return Bool(args[0].value < args[1].value) -MATH.register("<", Builtin("<", interpretLessThan, [compare_arg, compare_arg])) +MATH.register("<", Builtin("<", interpretLessThan, [compare_arg, compare_arg], return_type=Type(":bool"))) def interpretAddition(symbol, args, env, ns): res = 0 @@ -36,7 +36,7 @@ def interpretAddition(symbol, args, env, ns): return Int(res) term_arg = Arg("term", TypeEnum.NUMBER) -MATH.register("+", Builtin("+", interpretAddition, [term_arg], term_arg)) +MATH.register("+", Builtin("+", interpretAddition, [term_arg], term_arg, Type(":number"))) def interpretSubtraction(symbol, args, env, ns): if len(args) == 1: @@ -50,7 +50,7 @@ def interpretSubtraction(symbol, args, env, ns): else: return Int(res) -MATH.register("-", Builtin("-", interpretSubtraction, [term_arg], term_arg)) +MATH.register("-", Builtin("-", interpretSubtraction, [term_arg], term_arg, Type(":number"))) def interpretMultiplication(symbol, args, env, ns): res = args[0].value @@ -62,7 +62,7 @@ def interpretMultiplication(symbol, args, env, ns): return Int(res) factor_arg = Arg("factor", TypeEnum.NUMBER) -MATH.register("*", Builtin("*", interpretMultiplication, [factor_arg, factor_arg], factor_arg)) +MATH.register("*", Builtin("*", interpretMultiplication, [factor_arg, factor_arg], factor_arg, Type(":number"))) def interpretDivision(symbol, args, env, ns): ret = args[0].value / args[1].value @@ -71,9 +71,9 @@ def interpretDivision(symbol, args, env, ns): else: return Float(ret) -MATH.register("/", Builtin("/", interpretDivision, [factor_arg, factor_arg])) +MATH.register("/", Builtin("/", interpretDivision, [factor_arg, factor_arg], return_type=Type(":number"))) def interpretFloor(symbol, args, env, ns): return Int(math.floor(args[0].value)) -MATH.register("floor", Builtin("floor", interpretFloor, [Arg("floor", TypeEnum.NUMBER)])) +MATH.register("floor", Builtin("floor", interpretFloor, [Arg("floor", TypeEnum.NUMBER)], return_type=Type(":int"))) diff --git a/neb/std/repl.py b/neb/std/repl.py index 39aba3b..43b514e 100644 --- a/neb/std/repl.py +++ b/neb/std/repl.py @@ -9,16 +9,16 @@ def interpretHowTo(symbol, args, env, ns): print(args[0].describe()) return List([]) -REPL.register("howto", Builtin("howto", interpretHowTo, [Arg("symbol", TypeEnum.ANY)])) +REPL.register("howto", Builtin("howto", interpretHowTo, [Arg("symbol", TypeEnum.ANY)], return_type=Type(":list"))) def interpretSymbols(symbol, args, env, ns): keys = [Symbol(k, -1) for k,v in env.environment.items()] return List(keys) -REPL.register("symbols", Builtin("symbols", interpretSymbols, [])) +REPL.register("symbols", Builtin("symbols", interpretSymbols, [], return_type=Type(":list"))) def interpretUserSymbols(symbol, args, env, ns): keys = [Symbol(k, -1) for k,v in env.environment.items() if isinstance(v, UserFunction) or isinstance(v, Literal)] return List(keys) -REPL.register("user-symbols", Builtin("user-symbols", interpretUserSymbols, [])) +REPL.register("user-symbols", Builtin("user-symbols", interpretUserSymbols, [], return_type=Type(":list"))) diff --git a/neb/std/strings.py b/neb/std/strings.py index 68f02d5..7e3177e 100644 --- a/neb/std/strings.py +++ b/neb/std/strings.py @@ -10,12 +10,12 @@ def interpretConcat(symbol, args, env, ns): return String(out) string_arg = Arg("arg", TypeEnum.STRING) -STRINGS.register("concat", Builtin("concat", interpretConcat, [string_arg, string_arg], string_arg)) +STRINGS.register("concat", Builtin("concat", interpretConcat, [string_arg, string_arg], string_arg, Type(":string"))) def interpretStrip(symbol, args, env, ns): return String(args[0].value.strip()) -STRINGS.register("strip", Builtin("strip", interpretStrip, [Arg("filename", TypeEnum.STRING)])) +STRINGS.register("strip", Builtin("strip", interpretStrip, [Arg("filename", TypeEnum.STRING)], return_type=Type(":string"))) def interpretSplit(symbol, args, env, ns): target = args[0] @@ -25,7 +25,7 @@ def interpretSplit(symbol, args, env, ns): ret = target.value.split(splitter.value) return List([String(r) for r in ret]) -STRINGS.register("split", Builtin("split", interpretSplit, [Arg("target", TypeEnum.STRING)], Arg("splitter", TypeEnum.STRING, optional=True))) +STRINGS.register("split", Builtin("split", interpretSplit, [Arg("target", TypeEnum.STRING)], Arg("splitter", TypeEnum.STRING, optional=True), Type(":list"))) def interpretJoin(symbol, args, env, ns): lst = args[0] @@ -34,16 +34,16 @@ def interpretJoin(symbol, args, env, ns): join_list_arg = Arg("list", TypeEnum.LIST) join_string_arg = Arg("joiner", TypeEnum.STRING) -STRINGS.register("join", Builtin("join", interpretJoin, [join_list_arg, join_string_arg])) +STRINGS.register("join", Builtin("join", interpretJoin, [join_list_arg, join_string_arg], return_type=Type(":string"))) def interpretFirstChar(symbol, args, env, ns): if len(args[0].value) == 0: raise InterpretPanic(symbol, ":string is empty", ev) return String(args[0].value[0]) -STRINGS.register("first-char", Builtin("first-char", interpretFirstChar, [Arg("string", TypeEnum.STRING)])) +STRINGS.register("first-char", Builtin("first-char", interpretFirstChar, [Arg("string", TypeEnum.STRING)], return_type=Type(":string"))) def interpretRestChar(symbol, args, env, ns): return String(args[0].value[1:]) -STRINGS.register("rest-char", Builtin("rest-char", interpretRestChar, [Arg("string", TypeEnum.STRING)])) +STRINGS.register("rest-char", Builtin("rest-char", interpretRestChar, [Arg("string", TypeEnum.STRING)], return_type=Type(":string"))) diff --git a/neb/std/sys.py b/neb/std/sys.py index 98266f2..61e83c2 100644 --- a/neb/std/sys.py +++ b/neb/std/sys.py @@ -12,13 +12,13 @@ def interpretArgv(symbol, args, env, ns): out.append(String(arg)) return List(out) -SYS.register("argv", Builtin("argv", interpretArgv, [])) +SYS.register("argv", Builtin("argv", interpretArgv, [], return_type=Type(":list"))) def interpretShell(symbol, args, env, ns): ret = subprocess.run(shlex.split(args[0].value), capture_output=True) return List([String(r) for r in ret.stdout.decode("utf-8").split("\n")]) -SYS.register("$", Builtin("$", interpretShell, [Arg("command", TypeEnum.STRING)])) +SYS.register("$", Builtin("$", interpretShell, [Arg("command", TypeEnum.STRING)], return_type=Type(":list"))) def interpretExit(symbol, args, env, ns): status = 0 if len(args) == 0 else args[0].value @@ -26,10 +26,10 @@ def interpretExit(symbol, args, env, ns): return List([]) exit_arg = Arg("status", TypeEnum.INT, optional=True) -SYS.register("exit", Builtin("exit", interpretExit, [exit_arg])) +SYS.register("exit", Builtin("exit", interpretExit, [exit_arg], return_type=Type(":list"))) def interpretPrint(symbol, args, env, ns): print(args[0].value) return List([]) # print returns nothing -SYS.register("print", Builtin("print", interpretPrint, [Arg("arg", TypeEnum.STRING)])) +SYS.register("print", Builtin("print", interpretPrint, [Arg("arg", TypeEnum.STRING)], return_type=Type(":list"))) diff --git a/neb/std/term.py b/neb/std/term.py index 59f6fdf..e028b00 100644 --- a/neb/std/term.py +++ b/neb/std/term.py @@ -9,13 +9,13 @@ def interpretClear(symbol, args, env, ns): subprocess.run(["clear"]) return List([]) -TERM.register("clear", Builtin("clear", interpretClear, [])) +TERM.register("clear", Builtin("clear", interpretClear, [], return_type=Type(":list"))) def interpretReadLine(symbol, args, env, ns): ret = input(args[0].value) return String(ret) -TERM.register("read-line", Builtin("read-line", interpretReadLine, [Arg("prompt", TypeEnum.STRING)])) +TERM.register("read-line", Builtin("read-line", interpretReadLine, [Arg("prompt", TypeEnum.STRING)], return_type=Type(":string"))) def interpretReadChar(symbol, args, env, ns): import termios, tty @@ -30,4 +30,4 @@ def interpretReadChar(symbol, args, env, ns): termios.tcsetattr(fd, termios.TCSADRAIN, old) return String(ch.decode("utf-8")) -TERM.register("read-char", Builtin("read-char", interpretReadChar, [])) +TERM.register("read-char", Builtin("read-char", interpretReadChar, [], return_type=Type(":string"))) diff --git a/neb/std/types.py b/neb/std/types.py index b5fb993..f8d5405 100644 --- a/neb/std/types.py +++ b/neb/std/types.py @@ -6,33 +6,33 @@ TYPES = Environment() def interpretIsBool(symbol, args, env, ns): return Bool(isinstance(args[0], Bool)) -TYPES.register("bool?", Builtin("bool?", interpretIsBool, [Arg("arg", TypeEnum.ANY)])) +TYPES.register("bool?", Builtin("bool?", interpretIsBool, [Arg("arg", TypeEnum.ANY)], return_type=Type(":bool"))) def interpretIsFloat(symbol, args, env, ns): return Bool(isinstance(args[0], Float)) -TYPES.register("float?", Builtin("float?", interpretIsFloat, [Arg("arg", TypeEnum.ANY)])) +TYPES.register("float?", Builtin("float?", interpretIsFloat, [Arg("arg", TypeEnum.ANY)], return_type=Type(":bool"))) def interpretIsNumber(symbol, args, env, ns): ret = isinstance(args[0], Int) or isinstance(args[0], Float) return Bool(ret) -TYPES.register("number?", Builtin("number?", interpretIsNumber, [Arg("arg", TypeEnum.ANY)])) +TYPES.register("number?", Builtin("number?", interpretIsNumber, [Arg("arg", TypeEnum.ANY)], return_type=Type(":bool"))) def interpretIsInt(symbol, args, env, ns): return Bool(isinstance(args[0], Int)) -TYPES.register("int?", Builtin("int?", interpretIsInt, [Arg("arg", TypeEnum.ANY)])) +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)) -TYPES.register("list?", Builtin("list?", interpretIsList, [Arg("arg", TypeEnum.ANY)])) +TYPES.register("list?", Builtin("list?", interpretIsList, [Arg("arg", TypeEnum.ANY)], return_type=Type(":bool"))) def interpretIsString(symbol, args, env, ns): return Bool(isinstance(args[0], String)) -TYPES.register("string?", Builtin("string?", interpretIsString, [Arg("arg", TypeEnum.ANY)])) +TYPES.register("string?", Builtin("string?", interpretIsString, [Arg("arg", TypeEnum.ANY)], return_type=Type(":bool"))) def interpretStringToInt(symbol, args, env, ns): try: @@ -41,7 +41,7 @@ def interpretStringToInt(symbol, args, env, ns): except: raise InterpretPanic(symbol, "can't convert to an :int", args[0]) -TYPES.register("string->int", Builtin("string->int", interpretStringToInt, [Arg("arg", TypeEnum.STRING)])) +TYPES.register("string->int", Builtin("string->int", interpretStringToInt, [Arg("arg", TypeEnum.STRING)], return_type=Type(":int"))) def interpretToString(symbol, args, env, ns): item = args[0] @@ -52,7 +52,7 @@ def interpretToString(symbol, args, env, ns): else: return String(f"{item}") -TYPES.register("->string", Builtin("->string", interpretToString, [Arg("arg", TypeEnum.ANY)])) +TYPES.register("->string", Builtin("->string", interpretToString, [Arg("arg", TypeEnum.ANY)], return_type=Type(":string"))) def interpretTypeOf(symbol, args, env, ns): return Type(f"{args[0].type_}") @@ -62,12 +62,12 @@ TYPES.register("typeof", Builtin("typeof", interpretTypeOf, [Arg("candidate", Ty def interpretIsAny(symbol, args, env, ns): return Bool(True) -TYPES.register("any?", Builtin("any?", interpretIsAny, [Arg("arg", TypeEnum.ANY)])) +TYPES.register("any?", Builtin("any?", interpretIsAny, [Arg("arg", TypeEnum.ANY)], return_type=Type(":bool"))) def interpretIsLiteral(symbol, args, env, ns): return Bool(isinstance(args[0], Literal)) -TYPES.register("literal?", Builtin("literal?", interpretIsLiteral, [Arg("arg", TypeEnum.ANY)])) +TYPES.register("literal?", Builtin("literal?", interpretIsLiteral, [Arg("arg", TypeEnum.ANY)], return_type=Type(":bool"))) # add types to env any_type = NebType(":any", None, interpretIsAny) |
