The Lambda Lab
/
projects
/
scheme.forth.jl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
eatspaces now eats comments
[scheme.forth.jl.git]
/
scheme.4th
diff --git
a/scheme.4th
b/scheme.4th
index
fa53d67
..
72897be
100644
(file)
--- a/
scheme.4th
+++ b/
scheme.4th
@@
-6,7
+6,7
@@
include defer-is.4th
\ ------ Types ------
\ ------ Types ------
-0 constant
number
-type
+0 constant
fixnum
-type
1 constant boolean-type
2 constant character-type
3 constant string-type
1 constant boolean-type
2 constant character-type
3 constant string-type
@@
-277,17
+277,37
@@
global-env setobj
global-env fetchobj define-var
;
global-env fetchobj define-var
;
-: add-prim ( args -- )
- nil objeq? if
- 0 number-type
+: arg-count-error
+ bold fg red ." Incorrect argument count." reset-term cr
+ abort
+;
+
+: ensure-arg-count ( args n -- )
+ dup 0= if
+ drop nil objeq? false = if
+ arg-count-error
+ then
else
else
- 2dup cdr recurse drop
- -rot car drop
- + number-type
+ -rot 2dup nil objeq? if
+ arg-count-error
+ then
+
+ cdr rot 1- recurse
+ then
+;
+
+: arg-type-error
+ bold fg red ." Incorrect argument type." reset-term cr
+ abort
+;
+
+: ensure-arg-type ( arg type -- arg )
+ istype? false = if
+ arg-type-error
then
;
then
;
-' add-prim make-primitive +
+include scheme-primitives.4th
\ }}}
\ }}}
@@
-357,12
+377,27
@@
parse-idx-stack parse-idx-sp !
nextchar [char] ) = or
;
nextchar [char] ) = or
;
+: commentstart? ( -- bool )
+ nextchar [char] ; = ;
+
: eatspaces
: eatspaces
+
+ false \ Indicates whether or not we're eating a comment
+
begin
begin
- whitespace?
+ dup whitespace? or commentstart? or
while
while
+ dup nextchar '\n' = and if
+ invert \ Stop eating comment
+ else
+ dup false = commentstart? and if
+ invert \ Begin eating comment
+ then
+ then
+
inc-parse-idx
repeat
inc-parse-idx
repeat
+ drop
;
: digit? ( -- bool )
;
: digit? ( -- bool )
@@
-373,10
+408,23
@@
parse-idx-stack parse-idx-sp !
: minus? ( -- bool )
nextchar [char] - = ;
: minus? ( -- bool )
nextchar [char] - = ;
-: number? ( -- bool )
- digit? minus? or false = if
- false
- exit
+: plus? ( -- bool )
+ nextchar [char] + = ;
+
+: fixnum? ( -- bool )
+ minus? plus? or if
+ inc-parse-idx
+
+ delim? if
+ dec-parse-idx
+ false exit
+ else
+ dec-parse-idx
+ then
+ else
+ digit? false = if
+ false exit
+ then
then
push-parse-idx
then
push-parse-idx
@@
-463,8
+511,11
@@
parse-idx-stack parse-idx-sp !
nextchar [char] " = ;
: readnum ( -- num-atom )
nextchar [char] " = ;
: readnum ( -- num-atom )
- minus? dup if
+ plus? minus? or if
+ minus?
inc-parse-idx
inc-parse-idx
+ else
+ false
then
0
then
0
@@
-476,7
+527,7
@@
parse-idx-stack parse-idx-sp !
swap if negate then
swap if negate then
-
number
-type
+
fixnum
-type
;
: readbool ( -- bool-atom )
;
: readbool ( -- bool-atom )
@@
-649,7
+700,7
@@
parse-idx-stack parse-idx-sp !
eatspaces
eatspaces
-
number
? if
+
fixnum
? if
readnum
exit
then
readnum
exit
then
@@
-722,7
+773,7
@@
defer eval
: self-evaluating? ( obj -- obj bool )
boolean-type istype? if true exit then
: self-evaluating? ( obj -- obj bool )
boolean-type istype? if true exit then
-
number
-type istype? if true exit then
+
fixnum
-type istype? if true exit then
character-type istype? if true exit then
string-type istype? if true exit then
nil-type istype? if true exit then
character-type istype? if true exit then
string-type istype? if true exit then
nil-type istype? if true exit then
@@
-821,7
+872,7
@@
defer eval
: true? ( boolobj -- bool )
false? invert ;
: true? ( boolobj -- bool )
false? invert ;
-: applicaion? ( obj -- obj bool)
+: applica
t
ion? ( obj -- obj bool)
pair-type istype? ;
: operator ( obj -- operator )
pair-type istype? ;
: operator ( obj -- operator )
@@
-982,7
+1033,7
@@
defer print
2drop ." <primitive procedure>" ;
:noname ( obj -- )
2drop ." <primitive procedure>" ;
:noname ( obj -- )
-
number
-type istype? if printnum exit then
+
fixnum
-type istype? if printnum exit then
boolean-type istype? if printbool exit then
character-type istype? if printchar exit then
string-type istype? if printstring exit then
boolean-type istype? if printbool exit then
character-type istype? if printchar exit then
string-type istype? if printstring exit then