- worddef props\r
- prettyprint: detect circular structure\r
- vectors: ensure its ok with bignum indices\r
+- parsing words don't print readably\r
\r
+ httpd:\r
\r
"/library/math/float.factor"\r
"/library/math/complex.factor"\r
"/library/lists.factor"\r
+ "/library/dlists.factor"\r
"/library/vectors.factor"\r
"/library/strings.factor"\r
"/library/hashtables.factor"\r
"/library/math/float.factor" parse-resource append,
"/library/math/complex.factor" parse-resource append,
"/library/lists.factor" parse-resource append,
+ "/library/dlists.factor" parse-resource append,
"/library/vectors.factor" parse-resource append,
"/library/strings.factor" parse-resource append,
"/library/hashtables.factor" parse-resource append,
--- /dev/null
+! Copyright (C) 2005 Mackenzie Straight.
+! See http://factor.sf.net/license.txt for BSD license.
+IN: lists USING: generic kernel math ;
+
+! Double-linked lists.
+
+TUPLE: dlist first last ;
+TUPLE: dlist-node next prev data ;
+
+C: dlist ;
+C: dlist-node
+ [ set-dlist-node-next ] keep
+ [ set-dlist-node-prev ] keep
+ [ set-dlist-node-data ] keep ;
+
+: dlist-push-end ( data dlist -- )
+ [ dlist-last f <dlist-node> ] keep
+ [ dlist-last [ dupd set-dlist-node-next ] when* ] keep
+ 2dup set-dlist-last
+ dup dlist-first [ 2drop ] [ set-dlist-first ] ifte ;
+
+: dlist-empty? ( dlist -- ? )
+ dlist-first f = ;
+
+: (dlist-pop-front) ( dlist -- data )
+ [ dlist-first dlist-node-data ] keep
+ [ dup dlist-first dlist-node-next swap set-dlist-first ] keep
+ dup dlist-first [ drop ] [ f swap set-dlist-last ] ifte ;
+
+: dlist-pop-front ( dlist -- data )
+ dup dlist-empty? [ drop f ] [ (dlist-pop-front) ] ifte ;
#! Make a list of elements that occur in list2 but not
#! list1.
[ over contains? not ] subset nip ;
-
-TUPLE: dlist first last ;
-TUPLE: dlist-node next prev data ;
-
-C: dlist ;
-C: dlist-node
- [ set-dlist-node-next ] keep
- [ set-dlist-node-prev ] keep
- [ set-dlist-node-data ] keep ;
-
-: dlist-push-end ( data dlist -- )
- [ dlist-last f <dlist-node> ] keep
- [ dlist-last [ dupd set-dlist-node-next ] when* ] keep
- 2dup set-dlist-last
- dup dlist-first [ 2drop ] [ set-dlist-first ] ifte ;
-
-: dlist-empty? ( dlist -- ? )
- dlist-first f = ;
-
-: (dlist-pop-front) ( dlist -- data )
- [ dlist-first dlist-node-data ] keep
- [ dup dlist-first dlist-node-next swap set-dlist-first ] keep
- dup dlist-first [ drop ] [ f swap set-dlist-last ] ifte ;
-
-: dlist-pop-front ( dlist -- data )
- dup dlist-empty? [ drop f ] [ (dlist-pop-front) ] ifte ;
-
! Copyright (C) 2004, 2005 Slava Pestov.
+! Copyright (C) 2005 Mackenzie Straight.
! See http://factor.sf.net/license.txt for BSD license.
IN: threads
USING: io-internals kernel kernel-internals lists namespaces ;
#! eventually be restored by a future call to (yield) or
#! yield.
[ schedule-thread (yield) ] callcc0 ;
-
: <button> ( label quot -- button )
>r <label> bevel-border dup r> button-actions ;
+: <cross> ( w h -- cross )
+ 2dup >r >r 0 0 r> r> <line> <gadget>
+ >r tuck neg >r >r >r 0 r> r> r> <line> <gadget> r> 2list <stack> ;
+
: <check-box> ( label quot -- checkbox )
>r 0 0 0 0 <rectangle> <shelf>
[ >r <label> r> add-gadget ] keep
- [ >r f bevel-border r> add-gadget ] keep dup
+ [ >r 11 11 <cross> bevel-border r> add-gadget ] keep dup
r> button-actions ;
M: border layout* ( border -- )
dup size-border dup layout-border-x/y layout-border-w/h ;
+
+! A stack just lays out all its children on top of each other.
+TUPLE: stack delegate ;
+C: stack ( list -- stack )
+ 0 0 0 0 <rectangle> <gadget>
+ over set-stack-delegate
+ swap [ over add-gadget ] each ;
+
+M: stack layout* ( stack -- )
+ dup gadget-children dup max-width swap max-height
+ rot 3dup resize-gadget
+ gadget-children [
+ >r 2dup r> resize-gadget
+ ] each 2drop ;
[ >r <rectangle> r> set-hollow-rect-delegate ] keep ;
M: hollow-rect draw-shape ( rect -- )
- >r surface get r> shape>screen foreground get rgb
+ >r surface get r> rect>screen foreground get rgb
rectangleColor ;
TUPLE: plain-rect delegate ;
[ >r <rectangle> r> set-plain-rect-delegate ] keep ;
M: plain-rect draw-shape ( rect -- )
- >r surface get r> shape>screen background get rgb
+ >r surface get r> rect>screen background get rgb
boxColor ;
: x1/x2/y1 ( #{ x1 y1 }# #{ x2 y2 }# -- x1 x2 y1 )
] repeat 2drop ;
M: bevel-rect draw-shape ( rect -- )
- shape>screen >r >r rect> r> r> rect> 3 draw-bevel ;
+ rect>screen >r >r rect> r> r> rect> 3 draw-bevel ;
M: line draw-shape ( line -- )
>r surface get r>
- shape>screen
+ line>screen
foreground get rgb
lineColor ;
GENERIC: move-shape ( x y shape -- )
GENERIC: resize-shape ( w h shape -- )
-: shape>screen ( shape -- x1 y1 x2 y2 )
- [ shape-x x get + ] keep
- [ shape-y y get + ] keep
- [ shape-w pick + ] keep
- shape-h pick + ;
-
: with-translation ( shape quot -- )
#! All drawing done inside the quotation is translated
#! relative to the shape's origin.
M: rectangle shape-w rectangle-w ;
M: rectangle shape-h rectangle-h ;
+: rect>screen ( shape -- x1 y1 x2 y2 )
+ [ rectangle-x x get + ] keep
+ [ rectangle-y y get + ] keep
+ [ rectangle-w pick + ] keep
+ rectangle-h pick + ;
+
: fix-neg ( a b c -- a+c b -c )
dup 0 < [ neg tuck >r >r + r> r> ] when ;
M: line resize-shape ( w h line -- )
tuck resize-line-h resize-line-w ;
+: line>screen ( shape -- x1 y1 x2 y2 )
+ [ line-x x get + ] keep
+ [ line-y y get + ] keep
+ [ dup line-w swap line-x + pick + ] keep
+ dup line-h swap line-y + pick + ;
+
: line-inside? ( p d -- ? )
- tuck proj - absq 2 < ;
+ dupd proj - absq 2 < ;
M: line inside? ( point line -- ? )
2dup inside-rect? [