From ddba135e7d9b596f0c9856e1f409e9f8e07001f1 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Thu, 26 Oct 2023 20:05:40 -0400 Subject: [PATCH] add [COMPILE], fix :NONAME --- README.md | 2 +- forth/core-ext.fth | 47 +++++++++++++++++++++++----------------------- forth/core.fth | 2 +- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 8680a18..aaae13b 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Alee Forth uses the [Forth 2012 test suite](https://github.com/gerryjackson/fort **Missing** core extension words: ``` -PARSE PARSE-NAME REFILL RESTORE-INPUT S\" SAVE-INPUT SOURCE-ID [COMPILE] +PARSE PARSE-NAME REFILL RESTORE-INPUT S\" SAVE-INPUT SOURCE-ID ``` ## Building diff --git a/forth/core-ext.fth b/forth/core-ext.fth index 620dd64..7e4da06 100644 --- a/forth/core-ext.fth +++ b/forth/core-ext.fth @@ -16,29 +16,30 @@ : 2r@ ['] r> , ['] r> , ['] 2dup , ['] >r , ['] >r , ['] swap , ; imm -: compile, postpone literal postpone execute ; -: \ _source @ >in @ + - begin dup c@ while 0 over c! char+ repeat drop ; imm -: again postpone repeat ; imm -: ?do ['] 2dup , ['] _lit , here 0 , ['] >r , ['] = , postpone if - ['] 2drop , postpone 2r> ['] drop , ['] >r , ['] leave , - postpone then postpone 2>r here ; imm - -: .( [char] ) word count type ; imm -: c" state @ if ['] _jmp , here 0 , then - [char] " word - state @ 0= if exit then - dup count nip allot - here rot ! - postpone literal ; imm - -: buffer: create allot ; -: value constant ; -: to ' 4 cells + state @ if postpone literal ['] ! , else ! then ; imm -: defer create does> @ execute ; -: defer@ >body @ ; -: defer! >body ! ; -: is state @ if postpone ['] postpone defer! else ' defer! then ; imm +: compile, postpone literal postpone execute ; +: [compile] bl word find -1 = if , else compile, then ; imm +: \ _source @ >in @ + + begin dup c@ while 0 over c! char+ repeat drop ; imm +: again postpone repeat ; imm +: ?do ['] 2dup , ['] _lit , here 0 , ['] >r , ['] = , postpone if + ['] 2drop , postpone 2r> ['] drop , ['] >r , ['] leave , + postpone then postpone 2>r here ; imm + +: .( [char] ) word count type ; imm +: c" state @ if ['] _jmp , here 0 , then + [char] " word + state @ 0= if exit then + dup count nip allot + here rot ! + postpone literal ; imm + +: buffer: create allot ; +: value constant ; +: to ' 4 cells + state @ if postpone literal ['] ! , else ! then ; imm +: defer create does> @ execute ; +: defer@ >body @ ; +: defer! >body ! ; +: is state @ if postpone ['] postpone defer! else ' defer! then ; imm : action-of state @ if postpone ['] postpone defer@ else ' defer@ then ; imm : erase 0 fill ; diff --git a/forth/core.fth b/forth/core.fth index a4bac26..90a8577 100644 --- a/forth/core.fth +++ b/forth/core.fth @@ -198,7 +198,7 @@ else dup emit rot 2dup c! char+ swap drop swap 1- then repeat drop r> - 1 chars / ; -: :noname 0 , here ] ; +: :noname here 0 , here swap ] ; : evaluate _source @ >r _sourceu @ >r >in @ >r 0 >in ! _sourceu ! _source ! _ev