X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=src%2Flib.4th;h=301f9ac20ed175427874724e7d504805cf16dbc1;hb=f998451ad1e6486ab7f9db3204bf830e82cb0f94;hp=68bb77b429a30192a50aca5d95913f5402738a2e;hpb=d0d02a9174dd0a8e4e0c37dc2d990d692ee9a73d;p=forth.jl.git diff --git a/src/lib.4th b/src/lib.4th index 68bb77b..301f9ac 100644 --- a/src/lib.4th +++ b/src/lib.4th @@ -32,8 +32,9 @@ : LITERAL IMMEDIATE ['] LIT , , ; -: CHAR BL WORD 1+ @ ; +: ' BL WORD FIND >CFA ; +: CHAR BL WORD 1+ @ ; : [CHAR] IMMEDIATE CHAR ['] LIT , , @@ -147,6 +148,7 @@ ; : +LOOP IMMEDIATE + ['] DUP , \ Store copy of increment ['] R> , ['] SWAP , ['] R> , ['] SWAP , ['] R> , ['] SWAP , ['] + , ['] 2DUP , ['] - , @@ -425,9 +427,14 @@ ['] 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 ) @@ -439,9 +446,14 @@ 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 ) @@ -460,9 +472,13 @@ ; : .( - 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 ) @@ -492,11 +508,11 @@ ; : 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 ) @@ -628,14 +644,14 @@ ; : 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). )