-\ Scheme interpreter
-
vocabulary scheme
scheme definitions
0 constant number-type
1 constant boolean-type
2 constant character-type
+3 constant nil-type
: istype? ( obj -- obj b )
over = ;
inc-parse-idx
- S" newline" str-equiv? if true exit then
- S" space" str-equiv? if true exit then
- S" tab" str-equiv? if true exit then
+ S" newline" str-equiv? if pop-parse-idx true exit then
+ S" space" str-equiv? if pop-parse-idx true exit then
+ S" tab" str-equiv? if pop-parse-idx true exit then
charavailable? false = if pop-parse-idx false exit then
pop-parse-idx true
;
+: empty-list? ( -- bool )
+ nextchar [char] ( <> if false exit then
+ push-parse-idx
+ inc-parse-idx
+ eatspaces
+ nextchar [char] ) <> if pop-parse-idx false exit then
+ pop-parse-idx true ;
+
+
: readnum ( -- num-atom )
minus? dup if
inc-parse-idx
inc-parse-idx
inc-parse-idx
- S" newline" str-equiv? if '\n' character-type exit then
- S" space" str-equiv? if bl character-type exit then
- S" tab" str-equiv? if 9 character-type exit then
+ S" newline" str-equiv? if 7 parse-idx +! '\n' character-type exit then
+ S" space" str-equiv? if 5 parse-idx +! bl character-type exit then
+ S" tab" str-equiv? if 3 parse-idx +! 9 character-type exit then
nextchar character-type
inc-parse-idx
;
+: readnil ( -- nil-atom )
+ inc-parse-idx
+ eatspaces
+ inc-parse-idx
+
+ nil-type
+;
+
\ Parse a scheme expression
: read ( -- obj )
exit
then
+ empty-list? if
+ readnil
+ exit
+ then
+
eof? if
bold fg blue ." Moriturus te saluto." reset-term ." ok" cr
quit
number-type istype? if true exit then
boolean-type istype? if true exit then
character-type istype? if true exit then
+ nil-type istype? if true exit then
false ;
: eval
bl of ." #\space" endof
'\n' of ." #\newline" endof
- ." #\" emit
+ dup ." #\" emit
endcase
-
- trace
;
+: printnil ( nilobj -- )
+ drop ." ()" ;
+
: print ( obj -- )
." ; "
number-type istype? if printnum exit then
boolean-type istype? if printbool exit then
character-type istype? if printchar exit then
+ nil-type istype? if printnil exit then
;
\ ---- REPL ----