;; ( "word" -- cfa )
;; Find the following word and push its cfa, or 0
pushr rsi
- DOFORTH p_stdin, p_read_word, p_find
+ DOFORTH p_input, p_get, p_read_word, p_find
cmp qword[rsp],0
jne p_quote_tfa
add rsp,16
popr rsi
next
+ WORD p_input,'INPUT',dovariable
+ ;; The current input stream for evaluate-stream
+ dq 0
+
WORD p_this_word,'THIS-WORD',dovariable
dq 0,0 ; ( n chars* )
;; ( stream* -- *?* flag )
;; Execute the words from the given stream
;; returns 1 if stream ends and 0 if an unknown word is found
- dq p_gtR ; Keep the stream on the return stack.
+ dq p_input, p_get, p_gtR ; save old stream on R-stack
+ dq p_input, p_put
p_evaluate_stream_PROMPT:
- dq p_verboseQ
- dq p_get
+ dq p_verboseQ, p_get
BRANCH 0,p_evaluate_stream_LOOP
- dq p_depth
- dq p_dot
+ dq p_depth, p_dot
dq p_literal_string
STRING '> '
dq p_tell
- dq p_Rget
+ dq p_input, p_get
dq p_clear_stream
p_evaluate_stream_LOOP:
- dq p_Rget
+ dq p_input, p_get
dq p_read_word
dq p_dup
BRANCH 0,p_evaluate_stream_END ; branch if 0 on TOP
- dq p_2dup
- dq p_this_word
- dq p_2put
+ dq p_2dup, p_this_word, p_2put
dq p_find
dq p_dup
BRANCH 0,p_evaluate_stream_NOTWORD ; branch if 0 on TOP
dq p_dup
BRANCH 0,p_evaluate_stream_BAD ; branch if 0
dq p_drop
- dq p_state
- dq p_get
+ dq p_state, p_get
BRANCH 0,p_evaluate_stream_AFTER ; branch if 0
dq p_literal, p_literal
dq p_comma, p_comma
p_evaluate_stream_AFTER:
- dq p_Rget
+ dq p_input, p_get
dq p_stream_nchars
BRANCH 0,p_evaluate_stream_PROMPT
BRANCH ,p_evaluate_stream_LOOP
dq p_2drop
dq p_literal, 1
p_evaluate_stream_BAD:
- dq p_Rgt
- dq p_drop
+ dq p_Rgt, p_input, p_put ; restore previous stream
dq p_exit
WORD p_colon,':'
;; Read next word as a new word into current wordlist, set it
;; to be a doforth word, and set compiling mode.
dq p_literal, doforth
- dq p_stdin
+ dq p_input, p_get
dq p_read_word
dq p_create
dq p_tfa2cfa
WORD p_lparen,'(',fasm,IMMEDIATE
pushr rsi
p_lparen_loop:
- DOFORTH p_stdin, p_read_word
+ DOFORTH p_input, p_get, p_read_word
pop rax
pop rbx
cmp rax,0 ; end of stream
last_forth_word:
WORD p_quit,'QUIT',fasm
;; QUIT is the program entry point ********************
-
mov rsp,DS_TOP
mov rbp,RS_TOP
cmp qword [p_stdin_DFA],0
pop qword [p_stdin_DFA] ; Assign STDIN
p_quit_INITIALIZED:
- ;; Initial blurb
+ ;; Setup INPUT from STDIN
FORTH
dq p_verboseQ
dq p_get
dq p_program_version
dq p_tell
p_quit_EVAL:
- dq p_stdin
- dq p_evaluate_stream
+ dq p_stdin, p_evaluate_stream
BRANCH 0,p_quit_ERROR
dq p_false
dq sys_exit