number->string 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 : build-fixnum-charlist ( num )
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     build-fixnum-charlist
94     rot if
95         [char] - character-type 2swap cons
96     then
97
98     drop string-type
99 ; make-primitive number->string
100
101 ( = Arithmetic = )
102
103 : add-prim ( args -- fixnum )
104     2dup nil objeq? if
105         2drop
106         0 fixnum-type
107     else
108         2dup car drop
109         -rot cdr recurse drop
110         + fixnum-type
111     then
112 ;
113 ' add-prim make-primitive +
114
115 :noname ( args -- fixnum )
116     2dup nil objeq? if
117         2drop
118         0 fixnum-type
119     else
120         2dup car drop
121         -rot cdr add-prim drop
122         - fixnum-type
123     then
124 ; make-primitive -
125
126 :noname ( args -- fixnum )
127     2dup nil objeq? if
128         2drop
129         1 fixnum-type
130     else
131         2dup car drop
132         -rot cdr recurse drop
133         * fixnum-type
134     then
135 ; make-primitive *
136