X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=src%2Flib.4th;h=301f9ac20ed175427874724e7d504805cf16dbc1;hb=f998451ad1e6486ab7f9db3204bf830e82cb0f94;hp=4e732068323e3ab7c710e42c69b722be08101072;hpb=366db53c2e77d243c744c11f68b8bdeb575c86e6;p=forth.jl.git diff --git a/src/lib.4th b/src/lib.4th index 4e73206..301f9ac 100644 --- a/src/lib.4th +++ b/src/lib.4th @@ -149,15 +149,11 @@ : +LOOP IMMEDIATE - trace - ['] DUP , \ Store copy of increment ['] R> , ['] SWAP , ['] R> , ['] SWAP , ['] R> , ['] SWAP , ['] + , ['] 2DUP , ['] - , ['] SWAP , ['] >R , ['] SWAP , ['] >R , ['] SWAP , ['] >R , - trace - \ Condition differently depending on sign of increment ['] SWAP , ['] 0>= , [COMPILE] IF ['] 0<= , @@ -165,16 +161,12 @@ ['] 0> , [COMPILE] THEN - trace - \ Branch back to begining of loop kernel ['] 0BRANCH , HERE @ - , \ Clean up ['] RDROP , ['] RDROP , ['] RDROP , - trace - \ Record address of loop end for any LEAVEs to use HERE @ SWAP ! @@ -217,7 +209,6 @@ REPEAT ; -xx \ COMMENTS ---------------------------------------------------------------------- @@ -436,9 +427,14 @@ xx ['] LITSTRING , ( compile LITSTRING ) HERE @ ( save the address of the length word on the stack ) 0 , ( dummy length - we don't know what it is yet ) - KEY DROP + BEGIN - KEY ( get next character of the string ) + >IN @ #TIB @ >= IF \ End of TIB? + QUERY \ Get next line + THEN + + TIB >IN @ + @ 1 >IN +! \ Get char from TIB + DUP [CHAR] " <> WHILE C, ( copy character ) @@ -450,9 +446,14 @@ xx SWAP ! ( and back-fill the length location ) ELSE ( immediate mode ) HERE @ ( get the start address of the temporary space ) - KEY DROP + BEGIN - KEY + >IN @ #TIB @ >= IF \ End of TIB? + QUERY \ Get next line + THEN + + TIB >IN @ + @ 1 >IN +! \ Get char from TIB + DUP [CHAR] " <> WHILE OVER C! ( save next character ) @@ -471,9 +472,13 @@ xx ; : .( - KEY DROP BEGIN - KEY + >IN @ #TIB @ >= IF \ End of TIB? + QUERY \ Get next line + THEN + + TIB >IN @ + @ 1 >IN +! \ Get char from TIB + DUP [CHAR] ) = IF DROP ( drop the double quote character ) EXIT ( return from this function ) @@ -503,11 +508,11 @@ xx ; : VARIABLE - CREATE + BL WORD HEADER + DOVAR , 1 CELLS ALLOT ( allocate 1 cell of memory, push the pointer to this memory ) ; - : VALUE ( n -- ) BL WORD HEADER ( make the dictionary entry (the name follows VALUE) ) DOCOL , ( append DOCOL ) @@ -639,14 +644,14 @@ xx ; : SEE - BL WORD 2DUP FIND ( find the dictionary entry to decompile ) + BL WORD DUP FIND ( find the dictionary entry to decompile ) ?DUP 0= IF - ." Word '" TYPE ." ' not found in dictionary." + ." Word '" COUNT TYPE ." ' not found in dictionary." EXIT THEN - -ROT 2DROP + SWAP DROP ( Now we search again, looking for the next word in the dictionary. This gives us the length of the word that we will be decompiling. (Well, mostly it does). )