diff --git a/requirements.txt b/requirements.txt index 69dc6f0..ad24e08 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ lark == 1.1.2 +prompt_toolkit == 3.0.30 pycodestyle == 2.5.0 pytest versioneer == 0.22 diff --git a/setup.py b/setup.py index bd0e7ec..3d2ed43 100644 --- a/setup.py +++ b/setup.py @@ -28,7 +28,8 @@ ], }, install_requires=[ - 'lark == 1.1.2' + 'lark == 1.1.2', + 'prompt_toolkit == 3.0.30', ], classifiers=[ "Development Status :: 3 - Alpha", diff --git a/smallscheme/main.py b/smallscheme/main.py index 5749aa9..1e88e18 100755 --- a/smallscheme/main.py +++ b/smallscheme/main.py @@ -2,7 +2,8 @@ import argparse from smallscheme.env import Env -from smallscheme.scheme import evalu, repl, parse_str +from smallscheme.scheme import evalu, parse_str +from smallscheme.repl import repl def run_file(filename): env = Env() diff --git a/smallscheme/repl.py b/smallscheme/repl.py new file mode 100644 index 0000000..828a62f --- /dev/null +++ b/smallscheme/repl.py @@ -0,0 +1,30 @@ +# prompt_toolkit setup example taken from +# https://stackoverflow.com/questions/59627995: +from prompt_toolkit import prompt +from prompt_toolkit import PromptSession +from prompt_toolkit.history import FileHistory +from os.path import expanduser + +from smallscheme.env import Env +from smallscheme.scheme import parse_str, evalu, printable_value + + +def repl(): + session = PromptSession(history=FileHistory( + expanduser('~/.smallscheme_history'))) + + env = Env() + while True: + try: + x = session.prompt("scheme> ").strip() + except EOFError: + print() + break + if x: + try: + for parsed in parse_str(x): + pv = printable_value(evalu(parsed, env)) + if pv: + print(pv) + except Exception as e: + print(e) diff --git a/smallscheme/scheme.py b/smallscheme/scheme.py index 77812fe..d872228 100755 --- a/smallscheme/scheme.py +++ b/smallscheme/scheme.py @@ -131,26 +131,3 @@ def evalu(expr, env): if typeof(expr) == 'list': return eval_list(expr, env) raise Exception('evaluation error: "%s"' % str(expr)) - -def inp(): - if sys.version_info > (2, 9): - return input("scheme> ") - else: - return raw_input("scheme> ") - -def repl(): - env = Env() - while True: - try: - x = inp().strip() - except EOFError: - print() - break - if x: - try: - for parsed in parse_str(x): - pv = printable_value(evalu(parsed, env)) - if pv: - print(pv) - except Exception as e: - print(e)