Adding pair/list primitives.
[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 :noname ( args -- string )
134     2dup 1 ensure-arg-count
135     car symbol-type ensure-arg-type
136
137     drop pair-type
138     duplicate-charlist
139     drop string-type
140 ; make-primitive symbol->string
141
142 :noname ( args -- symbol )
143     2dup 1 ensure-arg-count
144     car string-type ensure-arg-type
145
146     drop pair-type
147     duplicate-charlist
148     charlist>symbol
149 ; make-primitive string->symbol
150
151 ( = Arithmetic = )
152
153 : add-prim ( args -- fixnum )
154     2dup nil objeq? if
155         2drop
156         0 fixnum-type
157     else
158         2dup car drop
159         -rot cdr recurse drop
160         + fixnum-type
161     then
162 ;
163 ' add-prim make-primitive +
164
165 :noname ( args -- fixnum )
166     2dup nil objeq? if
167         2drop
168         0 fixnum-type
169     else
170         2dup car drop
171         -rot cdr
172         2dup nil objeq? if
173             2drop negate
174         else
175             add-prim drop
176             -
177         then
178         fixnum-type
179     then
180 ; make-primitive -
181
182 :noname ( args -- fixnum )
183     2dup nil objeq? if
184         2drop
185         1 fixnum-type
186     else
187         2dup car drop
188         -rot cdr recurse drop
189         * fixnum-type
190     then
191 ; make-primitive *
192
193 :noname ( args -- fixnum )
194     2dup 2 ensure-arg-count
195
196     2dup car fixnum-type ensure-arg-type
197     2swap cdr car fixnum-type ensure-arg-type
198
199     drop swap drop
200
201     / fixnum-type
202 ; make-primitive quotient
203
204 :noname ( args -- fixnum )
205     2dup 2 ensure-arg-count
206
207     2dup car fixnum-type ensure-arg-type
208     2swap cdr car fixnum-type ensure-arg-type
209
210     drop swap drop
211
212     mod fixnum-type
213 ; make-primitive remainder
214
215 ( = Pairs and Lists = )
216
217 :noname ( args -- pair )
218     2dup 2 ensure-arg-count
219
220     2dup car 2swap cdr car
221     cons
222 ; make-primitive cons
223
224 :noname ( args -- pair )
225     2dup 1 ensure-arg-count
226     
227
228     2dup car 2swap cdr car
229     cons
230 ; make-primitive cons
231
232 :noname ( args -- pair )
233     2dup 1 ensure-arg-count
234     car pair-type ensure-arg-type
235
236     car
237 ; make-primitive car
238
239 :noname ( args -- pair )
240     2dup 1 ensure-arg-count
241     car pair-type ensure-arg-type
242
243     cdr
244 ; make-primitive cdr
245
246 :noname ( args -- pair )
247     2dup 2 ensure-arg-count
248     2dup car pair-type ensure-arg-type
249     swap cdr car
250
251     2swap set-car!
252
253     ok-symbol
254 ; make-primitive set-car!
255
256 :noname ( args -- pair )
257     2dup 2 ensure-arg-count
258     2dup car pair-type ensure-arg-type
259     swap cdr car
260
261     2swap set-cdr!
262
263     ok-symbol
264 ; make-primitive set-cdr!