From 697674954a4857409f27c599141373a416674a43 Mon Sep 17 00:00:00 2001 From: crc Date: Tue, 17 Oct 2017 00:52:07 +0000 Subject: [PATCH] improve "listener" FossilOrigin-Name: cd78d6406dd3d05ad64ccdebbe8881f300a7ab2479e779ee5911d0f05b89f73d --- bin/listener | 57 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/bin/listener b/bin/listener index f53f081..b1f507e 100755 --- a/bin/listener +++ b/bin/listener @@ -1,29 +1,46 @@ #/bin/sh -stty cbreak -cat >~/.listener.r12 << 'EOF' +# RETRO12: Interactive Listener +# --------------------------------------------------------------------- +# This is a bit of trickery using shell scripting and RRE to implement +# an interactive environment for Retro. +# --------------------------------------------------------------------- +# To work as expected, input should process as it's entered and not be +# line buffered. I use `stty` to set this mode. + + stty cbreak + +# --------------------------------------------------------------------- +# Next, copy the actual Retro source into a temporary file for RRE to +# process. + + cat >/tmp/_listener.forth << 'EOF' ~~~ {{ - :banner (-) - 'RETRO_12_(rx- puts @Version #100 /mod putn $. putc putn $) putc nl - EOM putn '_MAX,_TIB_@_1025,_Heap_@_ puts @Heap putn nl ; - :getc (-c) `1001 ; - :eol? (c-f) - [ ASCII:CR eq? ] [ ASCII:LF eq? ] [ ASCII:SPACE eq? ] tri or or ; - :gets (-a) - #1025 buffer:set - [ getc dup buffer:add eol? ] until buffer:start s:chop ; - :valid? (s-sf) - dup s:length n:-zero? ; + :version (-) @Version #100 /mod putn $. putc putn ; + :banner (-) 'RETRO_12_(rx- puts version $) putc nl + EOM putn '_MAX,_TIB_@_1025,_Heap_@_ puts here putn nl ; + :eol? (c-f) [ ASCII:CR eq? ] [ ASCII:LF eq? ] [ ASCII:SPACE eq? ] tri or or ; + :valid? (s-sf) dup s:length n:-zero? ; + :ok (-) compiling? [ nl 'Ok_ puts ] -if ; + :gets (-s) [ #1025 buffer:set + [ getc dup buffer:add eol? ] until + buffer:start s:chop ] buffer:preserve ; ---reveal--- - :bye (-) `26 ; - :listen (-) - banner - repeat gets valid? [ interpret ] [ drop ] choose again ; + :listen (-) banner ok repeat gets valid? [ interpret ok ] [ drop ] choose again ; }} listen ~~~ EOF -./bin/rre ~/.listener.r12 -rm -f ~/.listener.r12 -stty -cbreak + +# --------------------------------------------------------------------- +# Now use RRE (in the current directory) to run the program. + + ./rre /tmp/_listener.forth + +# --------------------------------------------------------------------- +# Finally, clean everything up and use `stty` to restore the normal +# input buffering mode. + + rm -f /tmp/_listener.forth + stty -cbreak