aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/common/lib/execute-parsing.frt
diff options
context:
space:
mode:
Diffstat (limited to 'amforth-6.5/common/lib/execute-parsing.frt')
-rw-r--r--amforth-6.5/common/lib/execute-parsing.frt25
1 files changed, 25 insertions, 0 deletions
diff --git a/amforth-6.5/common/lib/execute-parsing.frt b/amforth-6.5/common/lib/execute-parsing.frt
new file mode 100644
index 0000000..a5dc9bc
--- /dev/null
+++ b/amforth-6.5/common/lib/execute-parsing.frt
@@ -0,0 +1,25 @@
+
+\ execute-parsing
+\ ( addr len XT -- )
+\ execute XT with addr/len as SOURCE
+\
+
+variable xp-addr
+variable xp-len
+
+: xp-source xp-addr @ xp-len @ ;
+
+: execute-parsing ( addr len XT -- )
+ xp-addr @ xp-len @ 2>r \ make it nestable
+ >r \ save XT temporarily
+ xp-len ! xp-addr ! \ prepare new source
+ r> \ get back the XT
+ ['] source defer@ >in @ 2>r \ save and switch source
+ ['] xp-source is SOURCE
+ 0 >IN !
+ catch \ DO IT
+ 2r> >in ! is source \ restore old source
+ 2r> xp-len ! xp-addr ! \ restore nested information
+ throw \ re-throw exception, if any
+;
+