aboutsummaryrefslogtreecommitdiff
path: root/neb/std/repl.py
diff options
context:
space:
mode:
authormryouse2022-07-20 20:56:47 +0000
committermryouse2022-07-20 20:56:47 +0000
commit56d552fd9ccc7a1723fe789f822e9485a37bffae (patch)
treecde5fb26fb36f8a4819dcb505a453ac50d8afaea /neb/std/repl.py
parentc3ec685f06c0656c38196cc3b15af4e25acb38a2 (diff)
WIP implement multifunc for repl
Diffstat (limited to 'neb/std/repl.py')
-rw-r--r--neb/std/repl.py58
1 files changed, 47 insertions, 11 deletions
diff --git a/neb/std/repl.py b/neb/std/repl.py
index 3168770..0ad7454 100644
--- a/neb/std/repl.py
+++ b/neb/std/repl.py
@@ -1,4 +1,4 @@
-from .. import TypeEnum, Environment, Arg, Builtin, UserFunction, Function, evaluate, InterpretPanic, Callable, NebSyntax, lex, parse
+from .. import TypeEnum, Environment, Arg, Builtin, UserFunction, Function, evaluate, InterpretPanic, Callable, NebSyntax, lex, parse, MultiFunction
from .core import interpretQuote
from ..structs import *
@@ -17,7 +17,10 @@ def interpretHowTo(symbol, args, env, ns):
print("\n".join(des))
return List([])
-REPL.register("howto", Builtin("howto", interpretHowTo, [Arg("symbol", TypeEnum.ANY)], return_type=Type(":list")))
+howto_func = Builtin("howto", interpretHowTo, [Arg("symbol", TypeEnum.ANY)], return_type=Type(":list"))
+howto_multi = MultiFunction("howto")
+howto_multi.register(howto_func)
+REPL.register("howto", howto_multi)
def interpretSymbols(symbol, args, env, ns):
if len(args) == 1 and args[0].value:
@@ -26,16 +29,26 @@ def interpretSymbols(symbol, args, env, ns):
keys = [Symbol(k, -1, True) for k,v in sorted(env.get_all().items()) if not k.startswith(".")]
return List(keys)
-REPL.register("symbols", Builtin("symbols", interpretSymbols, [Arg("all?", TypeEnum.BOOL, optional=True)], return_type=Type(":list")))
+symbols_nonhidden_func = Builtin("symbols", interpretSymbols, [], return_type=Type(":list"))
+symbols_all_func = Builtin("symbols", interpretSymbols, [Arg("all?", TypeEnum.BOOL)], return_type=Type(":list"))
+symbols_multi = MultiFunction("symbols")
+symbols_multi.register(symbols_nonhidden_func)
+symbols_multi.register(symbols_all_func)
+REPL.register("symbols", symbols_multi)
def interpretFuncs(symbol, args, env, ns):
if len(args) == 1 and args[0].value:
- keys = [Symbol(k, -1, True) for k,v in sorted(env.get_all().items()) if isinstance(v, Function)]
+ keys = [Symbol(k, -1, True) for k,v in sorted(env.get_all().items()) if isinstance(v, MultiFunction)]
else:
- keys = [Symbol(k, -1, True) for k,v in sorted(env.get_all().items()) if isinstance(v, Function) and not k.startswith(".")]
+ keys = [Symbol(k, -1, True) for k,v in sorted(env.get_all().items()) if isinstance(v, MultiFunction) and not k.startswith(".")]
return List(keys)
-REPL.register("funcs", Builtin("funcs", interpretFuncs, [Arg("all?", TypeEnum.BOOL, optional=True)], return_type=Type(":list")))
+funcs_nonhidden_func = Builtin("funcs", interpretFuncs, [], return_type=Type(":list"))
+funcs_all_func = Builtin("funcs", interpretFuncs, [Arg("all?", TypeEnum.BOOL)], return_type=Type(":list"))
+funcs_multi = MultiFunction("funcs")
+funcs_multi.register(funcs_nonhidden_func)
+funcs_multi.register(funcs_all_func)
+REPL.register("funcs", funcs_multi)
def interpretUserSymbols(symbol, args, env, ns):
if len(args) == 1 and args[0].value:
@@ -44,7 +57,12 @@ def interpretUserSymbols(symbol, args, env, ns):
keys = [Symbol(k, -1, True) for k,v in env.get_all().items() if (isinstance(v, UserFunction) or isinstance(v, Literal)) and not k.startswith(".")]
return List(keys)
-REPL.register("user-symbols", Builtin("user-symbols", interpretUserSymbols, [Arg("all?", TypeEnum.BOOL, optional=True)], return_type=Type(":list")))
+usersymbols_nonhidden_func = Builtin("user-symbols", interpretUserSymbols, [], return_type=Type(":list"))
+usersymbols_all_func = Builtin("user-symbols", interpretUserSymbols, [Arg("all?", TypeEnum.BOOL)], return_type=Type(":list"))
+usersymbols_multi = MultiFunction("user-symbols")
+usersymbols_multi.register(usersymbols_nonhidden_func)
+usersymbols_multi.register(usersymbols_all_func)
+REPL.register("user-symbols", usersymbols_multi)
def interpretUserFuncs(symbol, args, env, ns):
if len(args) == 1 and args[0].value:
@@ -53,15 +71,33 @@ def interpretUserFuncs(symbol, args, env, ns):
keys = [Symbol(k, -1, True) for k,v in env.get_all().items() if isinstance(v, UserFunction) and not k.startswith(".")]
return List(keys)
-REPL.register("user-funcs", Builtin("user-funcs", interpretUserFuncs, [Arg("all?", TypeEnum.BOOL, optional=True)], return_type=Type(":list")))
+userfuncs_nonhidden_func = Builtin("user-funcs", interpretUserFuncs, [], return_type=Type(":list"))
+userfuncs_all_func = Builtin("user-funcs", interpretUserFuncs, [Arg("all?", TypeEnum.BOOL)], return_type=Type(":list"))
+userfuncs_multi = MultiFunction("user-funcs")
+userfuncs_multi.register(userfuncs_nonhidden_func)
+userfuncs_multi.register(userfuncs_all_func)
+REPL.register("user-funcs", userfuncs_multi)
def interpretSyntax(symbol, args, env, ns):
keys = [Symbol(k, -1, True) for k,v in sorted(env.get_all().items()) if isinstance(v, NebSyntax)]
return List(keys)
-REPL.register("syntax", Builtin("syntax", interpretSyntax, [], return_type=Type(":list")))
+syntax_func = Builtin("syntax", interpretSyntax, [], return_type=Type(":list"))
+syntax_multi = MultiFunction("syntax")
+syntax_multi.register(syntax_func)
+REPL.register("syntax", syntax_multi)
def interpretParseNeb(symbol, args, env, ns):
- return interpretQuote(None, [parse(lex(args[0].value))[0]], env, ns)
+ #out = []
+ #for item in parse(lex(args[0].value)):
+ # out.append(Expr([Symbol("quote", symbol.line), item]))
+ #return List(out)
-REPL.register("parse-neb", Builtin("parse-neb", interpretParseNeb, [Arg("string", TypeEnum.STRING)], return_type=Type(":any")))
+ #return interpretQuote(None, [parse(lex(args[0].value))[0]], env, ns)
+ return interpretQuote(None, [List(parse(lex(args[0].value)))], env, ns)
+ #return List(parse(lex(args[0].value)))
+
+parseneb_func = Builtin("parse-neb", interpretParseNeb, [Arg("string", TypeEnum.STRING)], return_type=Type(":any"))
+parseneb_multi = MultiFunction("parse-neb")
+parseneb_multi.register(parseneb_func)
+REPL.register("parse-neb", parseneb_multi)