Make S" work inside compiled words
[rrq/jonasforth.git] / sys.f
diff --git a/sys.f b/sys.f
index 38708d1e1a88f479264951bf154c85509583826d..6e7c8539bcdd67ea720b7faf5c2f15c8781b0880 100644 (file)
--- a/sys.f
+++ b/sys.f
@@ -75,6 +75,21 @@ EXIT [
     KEY
   10 = UNTIL ;
 
+\ So far, S" has only worked in immediate mode, which is backwards -- actually,
+\ the main use-case of this is as a compile-time word. Let's fix that.
+: S" IMMEDIATE
+  ' LITSTRING ,
+  HERE @ 0 C, \ We will put the length here
+  0
+  BEGIN
+    1 +
+    KEY DUP C,
+  34 = UNTIL
+  \ Remove final "
+    HERE @ 1 - HERE !
+    1 -
+  SWAP C! ;
+
 ( Compile the given string into the current word directly. )
 : STORE-STRING ( str len -- )
   BEGIN
@@ -89,7 +104,6 @@ EXIT [
 ( Read a number from standard input. )
 : READ-NUMBER READ-WORD PARSE-NUMBER ;
 
-S" Ready." TELL NEWLINE
+: RESTART S" Ready." TELL NEWLINE ;
+RESTART
 
-( vim: syntax=forth
-)