1 USING: alien strings kernel math tools.test io prettyprint
2 namespaces combinators words classes sequences accessors
3 math.functions arrays ;
6 [ 3 ] [ 1 2 [ + ] call( x y -- z ) ] unit-test
7 [ 1 2 [ + ] call( -- z ) ] must-fail
8 [ 1 2 [ + ] call( x y -- z a ) ] must-fail
9 [ 1 2 3 { 1 2 3 4 } ] [ 1 2 3 4 [ datastack nip ] call( x -- y ) ] unit-test
10 [ [ + ] call( x y -- z ) ] must-infer
12 [ 3 ] [ 1 2 \ + execute( x y -- z ) ] unit-test
13 [ 1 2 \ + execute( -- z ) ] must-fail
14 [ 1 2 \ + execute( x y -- z a ) ] must-fail
15 [ \ + execute( x y -- z ) ] must-infer
17 : compile-execute(-test-1 ( a b -- c ) \ + execute( a b -- c ) ;
19 [ t ] [ \ compile-execute(-test-1 optimized? ] unit-test
20 [ 4 ] [ 1 3 compile-execute(-test-1 ] unit-test
22 : compile-execute(-test-2 ( a b w -- c ) execute( a b -- c ) ;
24 [ t ] [ \ compile-execute(-test-2 optimized? ] unit-test
25 [ 4 ] [ 1 3 \ + compile-execute(-test-2 ] unit-test
26 [ 5 ] [ 1 4 \ + compile-execute(-test-2 ] unit-test
27 [ -3 ] [ 1 4 \ - compile-execute(-test-2 ] unit-test
28 [ 5 ] [ 1 4 \ + compile-execute(-test-2 ] unit-test
30 : compile-call(-test-1 ( a b q -- c ) call( a b -- c ) ;
32 [ t ] [ \ compile-call(-test-1 optimized? ] unit-test
33 [ 4 ] [ 1 3 [ + ] compile-call(-test-1 ] unit-test
34 [ 7 ] [ 1 3 2 [ * + ] curry compile-call(-test-1 ] unit-test
35 [ 7 ] [ 1 3 [ 2 * ] [ + ] compose compile-call(-test-1 ] unit-test
36 [ 4 ] [ 1 3 [ { + } [ ] like call ] compile-call(-test-1 ] unit-test
39 : cond-test-1 ( obj -- str )
41 { [ dup 2 mod 0 = ] [ drop "even" ] }
42 { [ dup 2 mod 1 = ] [ drop "odd" ] }
45 \ cond-test-1 def>> must-infer
47 [ "even" ] [ 2 cond-test-1 ] unit-test
48 [ "odd" ] [ 3 cond-test-1 ] unit-test
50 : cond-test-2 ( obj -- str )
52 { [ dup t = ] [ drop "true" ] }
53 { [ dup f = ] [ drop "false" ] }
54 [ drop "something else" ]
57 \ cond-test-2 def>> must-infer
59 [ "true" ] [ t cond-test-2 ] unit-test
60 [ "false" ] [ f cond-test-2 ] unit-test
61 [ "something else" ] [ "ohio" cond-test-2 ] unit-test
63 : cond-test-3 ( obj -- str )
65 [ drop "something else" ]
66 { [ dup t = ] [ drop "true" ] }
67 { [ dup f = ] [ drop "false" ] }
70 \ cond-test-3 def>> must-infer
72 [ "something else" ] [ t cond-test-3 ] unit-test
73 [ "something else" ] [ f cond-test-3 ] unit-test
74 [ "something else" ] [ "ohio" cond-test-3 ] unit-test
80 \ cond-test-4 def>> must-infer
82 [ cond-test-4 ] [ class \ no-cond = ] must-fail-with
87 { [ dup 2 mod 0 = ] [ drop "even" ] }
88 { [ dup 2 mod 1 = ] [ drop "odd" ] }
94 { [ dup 2 mod 0 = ] [ drop "even" ] }
95 { [ dup 2 mod 1 = ] [ drop "odd" ] }
101 { [ dup string? ] [ drop "string" ] }
102 { [ dup float? ] [ drop "float" ] }
103 { [ dup alien? ] [ drop "alien" ] }
110 { [ dup string? ] [ drop "string" ] }
111 { [ dup float? ] [ drop "float" ] }
112 { [ dup alien? ] [ drop "alien" ] }
119 { [ dup string? ] [ drop "string" ] }
120 { [ dup float? ] [ drop "float" ] }
121 { [ dup alien? ] [ drop "alien" ] }
128 { [ dup 2 mod 1 = ] [ drop "odd" ] }
130 { [ dup 2 mod 0 = ] [ drop "even" ] }
136 [ drop "really early" ]
137 { [ dup 2 mod 1 = ] [ drop "odd" ] }
138 { [ dup 2 mod 0 = ] [ drop "even" ] }
142 [ { } cond ] [ class \ no-cond = ] must-fail-with
146 { [ dup 2 mod 1 = ] [ drop "odd" ] }
148 { [ dup 2 mod 0 = ] [ drop "even" ] }
154 [ drop "really early" ]
155 { [ dup 2 mod 1 = ] [ drop "odd" ] }
156 { [ dup 2 mod 0 = ] [ drop "even" ] }
160 [ { } cond ] [ class \ no-cond = ] must-fail-with
163 : case-test-1 ( obj -- obj' )
171 \ case-test-1 def>> must-infer
173 [ "two" ] [ 2 case-test-1 ] unit-test
176 [ "two" ] [ 2 \ case-test-1 def>> call ] unit-test
178 [ "x" case-test-1 ] must-fail
180 : case-test-2 ( obj -- obj' )
189 \ case-test-2 def>> must-infer
191 [ 25 ] [ 5 case-test-2 ] unit-test
194 [ 25 ] [ 5 \ case-test-2 def>> call ] unit-test
196 : case-test-3 ( obj -- obj' )
202 { H{ } [ "a hashtable" ] }
203 { { 1 2 3 } [ "an array" ] }
207 \ case-test-3 def>> must-infer
209 [ "an array" ] [ { 1 2 3 } case-test-3 ] unit-test
211 CONSTANT: case-const-1 1
212 CONSTANT: case-const-2 2
215 : case-test-4 ( obj -- str )
217 { case-const-1 [ "uno" ] }
218 { case-const-2 [ "dos" ] }
225 \ case-test-4 def>> must-infer
227 [ "uno" ] [ 1 case-test-4 ] unit-test
228 [ "dos" ] [ 2 case-test-4 ] unit-test
229 [ "tres" ] [ 3 case-test-4 ] unit-test
230 [ "demasiado" ] [ 100 case-test-4 ] unit-test
232 : case-test-5 ( obj -- )
234 { case-const-1 [ "uno" print ] }
235 { case-const-2 [ "dos" print ] }
236 { 3 [ "tres" print ] }
237 { 4 [ "cuatro" print ] }
238 { 5 [ "cinco" print ] }
239 [ drop "demasiado" print ]
242 \ case-test-5 def>> must-infer
244 [ ] [ 1 case-test-5 ] unit-test
249 { case-const-1 [ "uno" ] }
250 { case-const-2 [ "dos" ] }
260 { case-const-1 [ "uno" ] }
261 { case-const-2 [ "dos" ] }
271 { case-const-1 [ "uno" ] }
272 { case-const-2 [ "dos" ] }
282 { case-const-1 [ "uno" ] }
283 { case-const-2 [ "dos" ] }
291 : do-not-call ( -- * ) "do not call" throw ;
293 : test-case-6 ( obj -- value )
295 { \ do-not-call [ "do-not-call" ] }
299 \ test-case-6 def>> must-infer
301 [ "three" ] [ 3 test-case-6 ] unit-test
302 [ "do-not-call" ] [ \ do-not-call test-case-6 ] unit-test
306 { \ do-not-call [ "do-not-call" ] }
312 [ do-not-call ] first {
313 { \ do-not-call [ "do-not-call" ] }
320 { \ do-not-call [ "do-not-call" ] }
326 [ "a hashtable" ] [ H{ } \ case-test-3 def>> call ] unit-test
328 [ t ] [ { 1 3 2 } contiguous-range? ] unit-test
329 [ f ] [ { 1 2 2 4 } contiguous-range? ] unit-test
330 [ f ] [ { + 3 2 } contiguous-range? ] unit-test
331 [ f ] [ { 1 0 7 } contiguous-range? ] unit-test
332 [ f ] [ { 1 1 3 7 } contiguous-range? ] unit-test
333 [ t ] [ { 7 6 4 8 5 } contiguous-range? ] unit-test
335 : test-case-7 ( obj -- str )
346 \ test-case-7 def>> must-infer
348 [ "plus" ] [ \ + test-case-7 ] unit-test
350 ! Some corner cases (no pun intended)
353 << \ corner-case-1 2 [ + ] curry 1array [ case ] curry (( a -- b )) define-declared >>
355 [ t ] [ \ corner-case-1 optimized? ] unit-test
356 [ 4 ] [ 2 corner-case-1 ] unit-test
358 [ 4 ] [ 2 2 [ + ] curry 1array case ] unit-test
360 : test-case-8 ( n -- string )
366 [ object>> 3 = ] must-fail-with
372 ] [ object>> 3 = ] must-fail-with