- closing ui does not stop timers\r
- adding/removing timers automatically for animated gadgets\r
- theme abstraction in ui\r
-- menu dragging\r
- find out why so many small bignums get consed\r
- use incremental strategy for all pack layouts where possible\r
- multiline editing in listener\r
\end{verbatim}
\wordtable{
\vocabulary{sequences}
-\ordinaryword{2unseq}{2unseq ( seq -- first second )}
-\ordinaryword{3unseq}{3unseq ( seq -- first second third )}
+\ordinaryword{first2}{first2 ( seq -- first second )}
+\ordinaryword{first3}{first3 ( seq -- first second third )}
}
Outputs the first two, or the first three elements of the sequence, respectively.
: unpair ( seq -- odds evens )
2 swap group flip dup empty?
- [ drop { } { } ] [ 2unseq ] ifte ;
+ [ drop { } { } ] [ first2 ] ifte ;
: parse-arglist ( lst -- types stack effect )
unpair [
vocabularies get [ "syntax" set [ reveal ] each ] bind
: make-primitive ( { vocab word } n -- )
- >r 2unseq create r> f define ;
+ >r first2 create r> f define ;
{
{ "execute" "words" }
} dup length 3 swap [ + ] map-with [ make-primitive ] 2each
: set-stack-effect ( { vocab word effect } -- )
- 3unseq >r lookup r> "stack-effect" set-word-prop ;
+ first3 >r lookup r> "stack-effect" set-word-prop ;
{
{ "drop" "kernel" " x -- " }
: 2nth ( s s n -- x x ) tuck swap nth >r swap nth r> ; inline
-: 2unseq ( { x y } -- x y )
+: first2 ( { x y } -- x y )
dup first swap second ; inline
-: 3unseq ( { x y z } -- x y z )
+: first3 ( { x y z } -- x y z )
dup first over second rot third ; inline
TUPLE: bounds-error index seq ;
: values>vregs ( in -- in )
value/vreg-list
- dup [ 3unseq load-value ] each
+ dup [ first3 load-value ] each
[ first <vreg> ] map ;
: load-inputs ( node -- in )
[ length swap node-out-d length - %dec-d , ] keep ;
: binary-op-reg ( node op -- )
- >r load-inputs 2unseq swap dup r> execute ,
+ >r load-inputs first2 swap dup r> execute ,
0 0 %replace-d , ; inline
: literal-immediate? ( value -- ? )
in-1 1 %dec-d , 0 %jump-t , ;
M: #ifte linearize-node* ( node -- )
- node-children 2unseq
+ node-children first2
<label> dup ifte-head
swap linearize-node ( false branch )
%label , ( branch target of BRANCH-T )
( Displaced indirect register operands -- eg, [ EAX 4 ] )
PREDICATE: cons displaced
dup length 2 =
- [ 2unseq integer? swap register? and ] [ drop f ] ifte ;
+ [ first2 integer? swap register? and ] [ drop f ] ifte ;
M: displaced modifier second byte? BIN: 01 BIN: 10 ? ;
M: displaced register car register ;
>r >r 2dup r> define-reader r> define-writer ;
: ?create ( { name vocab }/f -- word )
- dup [ 2unseq create ] when ;
+ dup [ first2 create ] when ;
: intern-slots ( spec -- spec )
- [ 3unseq swap ?create swap ?create 3vector ] map ;
+ [ first3 swap ?create swap ?create 3vector ] map ;
: define-slots ( class spec -- )
#! Define a collection of slot readers and writers for the
#! given class. The spec is a list of lists of length 3 of
#! the form [ slot reader writer ]. slot is an integer,
#! reader and writer are either words, strings or f.
- [ 3unseq define-slot ] each-with ;
+ [ first3 define-slot ] each-with ;
: reader-word ( class name -- word )
>r word-name "-" r> append3 "in" get 2vector ;
[ [ required-inputs ] keep append ] map-with ;
: unify-length ( seq seq -- seq )
- 2vector unify-lengths 2unseq ;
+ 2vector unify-lengths first2 ;
: unify-values ( seq -- value )
#! If all values in list are equal, return the value.
] catch ;
: flip-branches ( #ifte -- )
- dup node-children 2unseq swap 2vector swap set-node-children ;
+ dup node-children first2 swap 2vector swap set-node-children ;
\ not {
{ [ dup node-successor #ifte? ] [ node-successor dup flip-branches ] }
: disjoint-eq? ( node -- ? )
dup node-classes swap node-in-d
[ swap hash ] map-with
- 2unseq 2dup and [ classes-intersect? not ] [ 2drop f ] ifte ;
+ first2 2dup and [ classes-intersect? not ] [ 2drop f ] ifte ;
\ eq? {
{ [ dup disjoint-eq? ] [ [ f ] inline-literals ] }
\ cond [ [ object ] [ ] ] "infer-effect" set-word-prop
\ cond [
- pop-literal [ 2unseq cons ] map
+ pop-literal [ first2 cons ] map
[ no-cond ] swap alist>quot infer-quot-value
] "infer" set-word-prop
#! produces a number of values.
swap #call [
over [
- 2unseq swap consume-d produce-d
+ first2 swap consume-d produce-d
] hairy-node
] keep node, ;
dup 1 = [ drop 0 ] [ 2 /i log2 1 + ] ifte
] ifte ; foldable
-GENERIC: string>number ( str -- num ) foldable
GENERIC: number>string ( str -- num ) foldable
#! conversion fails.
swap "-" ?head >r (base>) r> [ neg ] when ;
-M: string string>number 10 base> ;
-
-PREDICATE: string potential-ratio CHAR: / swap member? ;
-M: potential-ratio string>number ( str -- num )
+: string>ratio ( "a/b" -- a/b )
"/" split1 >r 10 base> r> 10 base> / ;
-PREDICATE: string potential-float CHAR: . swap member? ;
-M: potential-float string>number ( str -- num ) string>float ;
+: string>number ( string -- n )
+ {
+ { [ CHAR: / over member? ] [ string>ratio ] }
+ { [ CHAR: . over member? ] [ string>float ] }
+ { [ t ] [ 10 base> ] }
+ } cond ;
: bin> 2 base> ;
: oct> 8 base> ;
[ >r init-screen r> call SDL_Quit ] with-scope ; inline
: rgb ( [ r g b ] -- n )
- 3unseq
+ first3
255
swap >fixnum 8 shift bitor
swap >fixnum 16 shift bitor
! Conses (whose cdr might not be a list)
: [[ f ; parsing
-: ]] 2unseq swons swons ; parsing
+: ]] first2 swons swons ; parsing
! Vectors
: { f ; parsing
{ POSTPONE: {{ POSTPONE: }} }
{ POSTPONE: [[ POSTPONE: ]] }
{ POSTPONE: [[ POSTPONE: ]] }
-} [ 2unseq define-close define-open ] each
+} [ first2 define-close define-open ] each
USING: generic inference kernel lists math math-internals
namespaces parser sequences test vectors ;
-: simple-effect 2unseq >r length r> length 2vector ;
+: simple-effect first2 >r length r> length 2vector ;
[ { 0 2 } ] [ [ 2 "Hello" ] infer simple-effect ] unit-test
[ { 1 2 } ] [ [ dup ] infer simple-effect ] unit-test
[ { 3 4 } ] [ 0 2 2 4 1 10 <range> <slice> subseq >vector ] unit-test
[ "cba" ] [ 3 "abcdef" head-slice reverse ] unit-test
-[ 1 2 3 ] [ 1 2 3 3vector 3unseq ] unit-test
+[ 1 2 3 ] [ 1 2 3 3vector first3 ] unit-test
[ 5040 ] [ [ 1 2 3 4 5 6 7 ] 1 [ * ] reduce ] unit-test
{ "<" [ find-book prev-page ] }
{ ">" [ find-book next-page ] }
{ ">|" [ find-book last-page ] }
- ] [ 2unseq >r <label> r> <button> ] map
+ ] [ first2 >r <label> r> <button> ] map
<shelf> [ add-gadgets ] keep ;
C: book-browser ( book -- gadget )
[ resource-path % "/fonts/" % % ".ttf" % ] "" make ;
: open-font ( [ font style ptsize ] -- alien )
- 3unseq >r ttf-name ttf-path r> TTF_OpenFont ;
+ first3 >r ttf-name ttf-path r> TTF_OpenFont ;
SYMBOL: open-fonts
SYMBOL: clip
: >sdl-rect ( rectangle -- sdlrect )
- [ rect-loc 2unseq ] keep rect-dim 2unseq make-rect ;
+ [ rect-loc first2 ] keep rect-dim first2 make-rect ;
: set-clip ( rect -- )
#! The top/left corner of the clip rectangle is the location
: rect>screen ( shape -- x1 y1 x2 y2 )
>r origin get dup r> rect-dim v+
- >r 2unseq r> 2unseq >r 1 - r> 1 - ;
+ >r first2 r> first2 >r 1 - r> 1 - ;
! Solid pen
M: solid draw-interior
! Bevel pen
TUPLE: bevel width ;
-: x1/x2/y1 surface get pick pick >r 2unseq r> first swap ;
-: x1/x2/y2 surface get pick pick >r first r> 2unseq ;
-: x1/y1/y2 surface get pick pick >r 2unseq r> second ;
-: x2/y1/y2 surface get pick pick >r second r> 2unseq swapd ;
+: x1/x2/y1 surface get pick pick >r first2 r> first swap ;
+: x1/x2/y2 surface get pick pick >r first r> first2 ;
+: x1/y1/y2 surface get pick pick >r first2 r> second ;
+: x2/y1/y2 surface get pick pick >r second r> first2 swapd ;
SYMBOL: bevel-1
SYMBOL: bevel-2
<plain-gadget> dup << bevel f 2 >> boundary set-paint-prop ;
: draw-line ( from to color -- )
- >r >r >r surface get r> 2unseq r> 2unseq r> rgb lineColor ;
+ >r >r >r surface get r> first2 r> first2 r> rgb lineColor ;
: draw-fanout ( from tos color -- )
-rot [ >r 2dup r> rot draw-line ] each 2drop ;
M: viewport pref-dim gadget-child pref-dim ;
-M: viewport layout* ( viewport -- )
- dup find-scroller scroller-origin vneg
- swap gadget-child dup prefer
- set-rect-loc ;
-
-M: viewport focusable-child* ( viewport -- gadget )
- gadget-child ;
-
: set-slider ( page max value slider -- )
#! page/max/value are 3-vectors.
[ [ slider-vector v. ] keep set-slider-value ] keep
r> r> set-slider ;
: scroll ( scroller value -- )
- 2dup
- over scroller-x update-slider
+ 2dup over scroller-x update-slider
over scroller-y update-slider ;
+: update-scroller ( scroller -- ) dup scroller-origin scroll ;
+
+: update-viewport ( viewport scroller -- )
+ scroller-origin vneg
+ swap gadget-child dup prefer set-rect-loc ;
+
+M: viewport layout* ( viewport -- )
+ dup find-scroller dup update-scroller update-viewport ;
+
+M: viewport focusable-child* ( viewport -- gadget )
+ gadget-child ;
+
: add-viewport 2dup set-scroller-viewport add-center ;
: add-x-slider 2dup set-scroller-x add-bottom ;
: <up-button>
<gadget> [ -1 swap slide-by-line ] <repeat-button> ;
-: add-up { 1 1 1 } over slider-vector v- 2unseq set-frame-child ;
+: add-up { 1 1 1 } over slider-vector v- first2 set-frame-child ;
: <down-button>
<gadget> [ 1 swap slide-by-line ] <repeat-button> ;
-: add-down { 1 1 1 } over slider-vector v+ 2unseq set-frame-child ;
+: add-down { 1 1 1 } over slider-vector v+ first2 set-frame-child ;
: add-elevator 2dup set-slider-elevator add-center ;
2drop
] [
>r [ gadget-font ] keep r> swap
- fg 3unseq make-color
+ fg first3 make-color
TTF_RenderUNICODE_Blended
- [ >r origin get 2unseq r> draw-surface ] keep
+ [ >r origin get first2 r> draw-surface ] keep
SDL_FreeSurface
] ifte ;
#! dimensions.
ttf-init
?init-world
- world get rect-dim 2unseq 0 SDL_RESIZABLE [
+ world get rect-dim first2 0 SDL_RESIZABLE [
[
ui-title dup SDL_WM_SetCaption
start-world