Add a "quiet" mode.

This brings the Python Joy interpreter into better congruence with the
Nim interpreter for ease of automated testing.
This commit is contained in:
Simon Forman 2021-04-06 11:28:30 -07:00
parent 1cf82b8bcb
commit c00c6a4e32
3 changed files with 37 additions and 3 deletions

6
README
View File

@ -64,6 +64,12 @@ To start a crude REPL:
python -m joy python -m joy
There is a "quiet" mode for e.g. using joy from a shell script:
python -m joy -q
This supresses the initial banner output and the prompt text.
§.3 Documentation §.3 Documentation

View File

@ -17,13 +17,19 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with Thun. If not see <http://www.gnu.org/licenses/>. # along with Thun. If not see <http://www.gnu.org/licenses/>.
# #
import sys
from .library import initialize, inscribe from .library import initialize, inscribe
from .joy import repl from .joy import repl, interp
from .utils.pretty_print import trace from .utils.pretty_print import trace
inscribe(trace) inscribe(trace)
print('''\
if '-q' in sys.argv:
j = interp
else:
j = repl
print('''\
Thun - Copyright © 2017 Simon Forman Thun - Copyright © 2017 Simon Forman
This program comes with ABSOLUTELY NO WARRANTY; for details type "warranty". This program comes with ABSOLUTELY NO WARRANTY; for details type "warranty".
This is free software, and you are welcome to redistribute it This is free software, and you are welcome to redistribute it
@ -31,4 +37,4 @@ under certain conditions; type "sharing" for details.
Type "words" to see a list of all words, and "[<name>] help" to print the Type "words" to see a list of all words, and "[<name>] help" to print the
docs for a word. docs for a word.
''') ''')
stack = repl(dictionary=initialize()) stack = j(dictionary=initialize())

View File

@ -107,3 +107,25 @@ def repl(stack=(), dictionary=None):
print_exc() print_exc()
print() print()
return stack return stack
def interp(stack=(), dictionary=None):
'''
Simple REPL with no extra output, suitable for use in scripts.
'''
if dictionary is None:
dictionary = {}
try:
while True:
try:
text = input()
except (EOFError, KeyboardInterrupt):
break
try:
stack, _, dictionary = run(text, stack, dictionary)
except:
print_exc()
print(stack_to_string(stack))
except:
print_exc()
return stack