1 ! Copyright (C) 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel present io math sequences assocs ranges
4 math.order fry tools.time locals smalltalk.selectors
5 smalltalk.ast smalltalk.classes ;
11 M: object selector-print dup present print ;
12 M: object selector-asString present ;
19 M: object selector-print: [ present ] dip stream-print nil ;
20 M: object selector-nextPutAll: selector-print: ;
21 M: object selector-tab " " swap selector-print: ;
22 M: object selector-nl stream-nl nil ;
34 M: object selector-+ swap + ;
35 M: object selector-- swap - ;
36 M: object selector-* swap * ;
37 M: object selector-/ swap / ;
38 M: object selector-< swap < ;
39 M: object selector-> swap > ;
40 M: object selector-<= swap <= ;
41 M: object selector->= swap >= ;
42 M: object selector-= swap = ;
47 M: object selector-min: min ;
48 M: object selector-max: max ;
52 SELECTOR: ifTrue:ifFalse:
54 M: object selector-ifTrue: [ call( -- result ) ] [ drop nil ] if ;
55 M: object selector-ifFalse: [ drop nil ] [ call( -- result ) ] if ;
56 M: object selector-ifTrue:ifFalse: [ drop call( -- result ) ] [ nip call( -- result ) ] if ;
60 M: object selector-isNil nil eq? ;
65 M: sequence selector-at: nth ;
66 M: sequence selector-at:put: ( key value receiver -- receiver ) [ swapd set-nth ] keep ;
68 M: assoc selector-at: at ;
69 M: assoc selector-at:put: ( key value receiver -- receiver ) [ swapd set-at ] keep ;
73 M:: object selector-do: ( quot receiver -- nil )
74 receiver [ quot call( elt -- result ) drop ] each nil ;
79 M: object selector-to: swap [a..b] ;
80 M:: object selector-to:do: ( to quot from -- nil )
81 from to [a..b] [ quot call( i -- result ) drop ] each nil ;
85 SELECTOR: value:value:
86 SELECTOR: value:value:value:
87 SELECTOR: value:value:value:value:
89 M: object selector-value call( -- result ) ;
90 M: object selector-value: call( input -- result ) ;
91 M: object selector-value:value: call( input input -- result ) ;
92 M: object selector-value:value:value: call( input input input -- result ) ;
93 M: object selector-value:value:value:value: call( input input input input -- result ) ;
97 M: object selector-new new ;
101 M: object selector-time '[ _ call( -- result ) ] time ;