string->number works.
[scheme.forth.jl.git] / scheme-primitives.4th
1 ( = Type predicates = )
2
3 :noname ( args -- boolobj )
4     2dup 1 ensure-arg-count
5
6     car nil objeq? boolean-type
7 ; make-primitive null?
8
9 :noname ( args -- boolobj )
10     2dup 1 ensure-arg-count
11
12     car boolean-type istype? -rot 2drop boolean-type
13 ; make-primitive boolean?
14
15 :noname ( args -- boolobj )
16     2dup 1 ensure-arg-count
17
18     car symbol-type istype? -rot 2drop boolean-type
19 ; make-primitive symbol?
20
21 :noname ( args -- boolobj )
22     2dup 1 ensure-arg-count
23
24     car fixnum-type istype? -rot 2drop boolean-type
25 ; make-primitive integer?
26
27 :noname ( args -- boolobj )
28     2dup 1 ensure-arg-count
29
30     car character-type istype? -rot 2drop boolean-type
31 ; make-primitive char?
32
33 :noname ( args -- boolobj )
34     2dup 1 ensure-arg-count
35
36     car string-type istype? -rot 2drop boolean-type
37 ; make-primitive string?
38
39 :noname ( args -- boolobj )
40     2dup 1 ensure-arg-count
41
42     car pair-type istype? -rot 2drop boolean-type
43 ; make-primitive pair?
44
45 :noname ( args -- boolobj )
46     2dup 1 ensure-arg-count
47
48     car primitive-type istype? -rot 2drop boolean-type
49 ; make-primitive procedure?
50
51 ( = Type conversions = )
52
53 :noname ( args -- fixnum )
54     2dup 1 ensure-arg-count
55     car character-type ensure-arg-type
56
57     drop fixnum-type
58 ; make-primitive char->integer
59
60 :noname ( args -- char )
61     2dup 1 ensure-arg-count
62     car fixnum-type ensure-arg-type
63
64     drop character-type
65 ; make-primitive integer->char
66
67 : num-to-charlist ( num -- charlist )
68     ?dup 0= if
69         [char] 0 character-type nil cons
70         exit
71     then
72
73     nil rot
74
75     begin
76         ?dup 0>
77     while
78         dup 10 mod swap 10 / swap
79         2swap rot
80         [char] 0 + character-type 2swap
81         cons
82         rot
83     repeat
84 ;
85
86 :noname ( args -- string )
87     2dup 1 ensure-arg-count
88     car fixnum-type ensure-arg-type
89
90     drop
91
92     dup 0< swap abs ( bool num )
93     num-to-charlist
94     rot if
95         [char] - character-type 2swap cons
96     then
97
98     drop string-type
99 ; make-primitive number->string
100
101 :noname ( args -- symbol )
102     2dup 1 ensure-arg-count
103     car string-type ensure-arg-type
104
105     drop pair-type
106
107     2dup car [char] - character-type objeq? if
108         cdr
109         true -rot
110     else
111         2dup car [char] + character-type objeq? if
112             cdr
113         then
114         false -rot
115     then
116
117     0 -rot
118     begin
119         2dup nil objeq? false =
120     while
121         2dup car drop [char] 0 - -rot
122         2swap swap 10 * + -rot
123         cdr
124     repeat
125
126     2drop
127
128     swap if -1 * then
129
130     fixnum-type
131 ; make-primitive string->number
132
133 ( = Arithmetic = )
134
135 : add-prim ( args -- fixnum )
136     2dup nil objeq? if
137         2drop
138         0 fixnum-type
139     else
140         2dup car drop
141         -rot cdr recurse drop
142         + fixnum-type
143     then
144 ;
145 ' add-prim make-primitive +
146
147 :noname ( args -- fixnum )
148     2dup nil objeq? if
149         2drop
150         0 fixnum-type
151     else
152         2dup car drop
153         -rot cdr add-prim drop
154         - fixnum-type
155     then
156 ; make-primitive -
157
158 :noname ( args -- fixnum )
159     2dup nil objeq? if
160         2drop
161         1 fixnum-type
162     else
163         2dup car drop
164         -rot cdr recurse drop
165         * fixnum-type
166     then
167 ; make-primitive *
168