diff --git a/basis/farkup/farkup-tests.factor b/basis/farkup/farkup-tests.factor index 693c559ac5..64699817ac 100644 --- a/basis/farkup/farkup-tests.factor +++ b/basis/farkup/farkup-tests.factor @@ -150,3 +150,6 @@ link-no-follow? off [ "<p>paragraph\n a ___ b</p>" ] [ "paragraph\n a ___ b" convert-farkup ] unit-test + +[ "<p>\n<ul><li> a</li>\n</ul><hr/></p>" ] +[ "\n- a\n___" convert-farkup ] unit-test diff --git a/basis/http/server/static/static-docs.factor b/basis/http/server/static/static-docs.factor index 7ef97ee371..866d2a3409 100644 --- a/basis/http/server/static/static-docs.factor +++ b/basis/http/server/static/static-docs.factor @@ -32,6 +32,6 @@ $nl $nl "It is also possible to override the hook used when serving static files to the client:" { $subsection <file-responder> } -"The default just sends the file's contents with the request; " { $vocab-link "xmode.responder" } " provides an alternate hook which sends a syntax-highlighted version of the file." ; +"The default just sends the file's contents with the request; " { $vocab-link "xmode.code2html.responder" } " provides an alternate hook which sends a syntax-highlighted version of the file." ; ABOUT: "http.server.static" diff --git a/basis/io/encodings/iana/iana.factor b/basis/io/encodings/iana/iana.factor index dcd806d9a0..19b887cd75 100755 --- a/basis/io/encodings/iana/iana.factor +++ b/basis/io/encodings/iana/iana.factor @@ -59,4 +59,4 @@ PRIVATE> PRIVATE> "resource:basis/io/encodings/iana/character-sets" -ascii <file-reader> make-n>e \ n>e-table set-value +ascii <file-reader> make-n>e to: n>e-table diff --git a/basis/models/range/range-tests.factor b/basis/models/range/range-tests.factor index c8a2d1acc6..50c0365728 100755 --- a/basis/models/range/range-tests.factor +++ b/basis/models/range/range-tests.factor @@ -31,6 +31,6 @@ tools.test models.range ; ! should be able to move by a page of 10 [ 10 ] [ - setup-range 10 over set-range-page-value - 1 over move-by-page range-value + setup-range 10 over set-range-page-value + 1 over move-by-page range-value ] unit-test diff --git a/basis/prettyprint/prettyprint.factor b/basis/prettyprint/prettyprint.factor index 149ecde447..d41a68f0c4 100755 --- a/basis/prettyprint/prettyprint.factor +++ b/basis/prettyprint/prettyprint.factor @@ -123,7 +123,11 @@ PRIVATE> : callstack. ( callstack -- ) callstack>array 2 <groups> [ remove-breakpoints - 3 nesting-limit [ . ] with-variable + [ + 3 nesting-limit set + 100 length-limit set + . + ] with-scope ] assoc-each ; : .c ( -- ) callstack callstack. ; diff --git a/basis/syndication/readme.txt b/basis/syndication/readme.txt deleted file mode 100644 index 2e64b0d52a..0000000000 --- a/basis/syndication/readme.txt +++ /dev/null @@ -1,32 +0,0 @@ -This library is a simple RSS2 parser and RSS reader web -application. To run the web application you'll need to make sure you -have the sqlite library working. This can be tested with - - "contrib/sqlite" require - "contrib/sqlite" test-module - -Remember that to use "sqlite" you need to have done the following -somewhere: - - USE: alien - "sqlite" "/usr/lib/libsqlite3.so" "cdecl" add-library - -Replacing "libsqlite3.so" with the path to the sqlite shared library -or DLL. I put this in my ~/.factor-rc. - -The RSS reader web application creates a database file called -'rss-reader.db' in the same directory as the Factor executable when -first started. This database contains all the feed information. - -To load the web application use: - - "contrib/rss" require - -Fire up the web server and navigate to the URL: - - http://localhost:8888/responder/maintain-feeds - -Add any RSS2 compatible feed. Use 'Update Feeds' to retrieve them and -update the sqlite database with the feed contains. Use 'Database' to -view the entries from the database for that feed. - diff --git a/basis/syndication/syndication-docs.factor b/basis/syndication/syndication-docs.factor new file mode 100644 index 0000000000..5604a94dbd --- /dev/null +++ b/basis/syndication/syndication-docs.factor @@ -0,0 +1,68 @@ +USING: help.markup help.syntax io.streams.string strings urls +calendar xml.data xml.writer present ; +IN: syndication + +HELP: entry +{ $description "An Atom or RSS feed entry. Has the following slots:" + { $table + { "Name" "Class" } + { "title" { $link string } } + { "url" { "any class supported by " { $link present } } } + { "description" { $link string } } + { "date" { $link timestamp } } + } +} ; + +HELP: <entry> +{ $values { "entry" entry } } +{ $description "Creates a new entry." } ; + +HELP: feed +{ $description "An Atom or RSS feed. Has the following slots:" + { $table + { "Name" "Class" } + { "title" { $link string } } + { "url" { "any class supported by " { $link present } } } + { "entries" { "a sequence of " { $link entry } " instances" } } + } +} ; + +HELP: <feed> +{ $values { "feed" feed } } +{ $description "Creates a new feed." } ; + +HELP: download-feed +{ $values { "url" url } { "feed" feed } } +{ $description "Downloads a feed from a URL using the " { $link "http.client" } "." } ; + +HELP: string>feed +{ $values { "string" string } { "feed" feed } } +{ $description "Parses a feed in string form." } ; + +HELP: xml>feed +{ $values { "xml" xml } { "feed" feed } } +{ $description "Parses a feed in XML form." } ; + +HELP: feed>xml +{ $values { "feed" feed } { "xml" xml } } +{ $description "Converts a feed to Atom XML form." } +{ $notes "The result of this word can then be passed to " { $link write-xml } ", or stored in an HTTP response object." } ; + +ARTICLE: "syndication" "Atom and RSS feed syndication" +"The " { $vocab-link "syndication" } " vocabulary implements support for reading Atom and RSS feeds, and writing Atom feeds." +$nl +"Data types:" +{ $subsection feed } +{ $subsection <feed> } +{ $subsection entry } +{ $subsection <entry> } +"Reading feeds:" +{ $subsection download-feed } +{ $subsection string>feed } +{ $subsection xml>feed } +"Writing feeds:" +{ $subsection feed>xml } +"The " { $vocab-link "furnace.syndication" } " vocabulary builds on top of this vocabulary to enable easy generation of Atom feeds from web applications. The " { $vocab-link "webapps.planet" } " vocabulary is a complete example of a web application which reads and exports feeds." +{ $see-also "urls" } ; + +ABOUT: "syndication" diff --git a/basis/syndication/syndication.factor b/basis/syndication/syndication.factor index a432d8c31c..ca7511f1af 100644 --- a/basis/syndication/syndication.factor +++ b/basis/syndication/syndication.factor @@ -102,12 +102,12 @@ TUPLE: entry title url description date ; { "feed" [ atom1.0 ] } } case ; -: read-feed ( string -- feed ) +: string>feed ( string -- feed ) [ string>xml xml>feed ] with-html-entities ; : download-feed ( url -- feed ) #! Retrieve an news syndication file, return as a feed tuple. - http-get nip read-feed ; + http-get nip string>feed ; ! Atom generation : simple-tag, ( content name -- ) diff --git a/basis/tools/deploy/deploy-tests.factor b/basis/tools/deploy/deploy-tests.factor index acee098b8f..1d5b59bf0c 100755 --- a/basis/tools/deploy/deploy-tests.factor +++ b/basis/tools/deploy/deploy-tests.factor @@ -43,6 +43,11 @@ namespaces continuations layouts accessors ; [ t ] [ 2500000 small-enough? ] unit-test +: run-temp-image ( -- ) + vm + "-i=" "test.image" temp-file append + 2array try-process ; + { "tools.deploy.test.1" "tools.deploy.test.2" @@ -51,9 +56,7 @@ namespaces continuations layouts accessors ; } [ [ ] swap [ shake-and-bake - vm - "-i=" "test.image" temp-file append - 2array try-process + run-temp-image ] curry unit-test ] each @@ -88,9 +91,12 @@ M: quit-responder call-responder* [ ] [ "tools.deploy.test.5" shake-and-bake - vm - "-i=" "test.image" temp-file append - 2array try-process + run-temp-image ] unit-test [ ] [ "http://localhost:1237/quit" http-get 2drop ] unit-test + +[ ] [ + "tools.deploy.test.6" shake-and-bake + run-temp-image +] unit-test diff --git a/basis/tools/deploy/test/6/6.factor b/basis/tools/deploy/test/6/6.factor new file mode 100644 index 0000000000..da64bb646c --- /dev/null +++ b/basis/tools/deploy/test/6/6.factor @@ -0,0 +1,13 @@ +IN: tools.deploy.test.6 +USING: values math kernel ; + +VALUE: x + +VALUE: y + +: deploy-test-6 ( -- ) + 1 to: x + 2 to: y + x y + 3 assert= ; + +MAIN: deploy-test-6 diff --git a/basis/tools/deploy/test/6/deploy.factor b/basis/tools/deploy/test/6/deploy.factor new file mode 100644 index 0000000000..410bb770be --- /dev/null +++ b/basis/tools/deploy/test/6/deploy.factor @@ -0,0 +1,15 @@ +USING: tools.deploy.config ; +H{ + { deploy-threads? f } + { deploy-ui? f } + { deploy-io 1 } + { deploy-c-types? f } + { deploy-name "tools.deploy.test.6" } + { deploy-compiler? t } + { deploy-reflection 1 } + { deploy-word-props? f } + { deploy-word-defs? f } + { "stop-after-last-window?" t } + { deploy-random? f } + { deploy-math? f } +} diff --git a/basis/ui/gadgets/books/books.factor b/basis/ui/gadgets/books/books.factor index 161677b56a..da0ff35728 100755 --- a/basis/ui/gadgets/books/books.factor +++ b/basis/ui/gadgets/books/books.factor @@ -16,15 +16,15 @@ M: book model-changed ( model book -- ) relayout ; : new-book ( pages model class -- book ) - new-gadget - swap >>model - swap add-gadgets ; inline + new-gadget + swap >>model + swap add-gadgets ; inline : <book> ( pages model -- book ) book new-book ; M: book pref-dim* ( book -- dim ) children>> pref-dims max-dim ; M: book layout* ( book -- ) - [ dim>> ] [ children>> ] bi [ (>>dim) ] with each ; + [ children>> ] [ dim>> ] bi [ >>dim drop ] curry each ; M: book focusable-child* ( book -- child/t ) current-page ; diff --git a/basis/ui/gadgets/borders/borders.factor b/basis/ui/gadgets/borders/borders.factor index 4609562af4..94816788e1 100644 --- a/basis/ui/gadgets/borders/borders.factor +++ b/basis/ui/gadgets/borders/borders.factor @@ -10,7 +10,7 @@ TUPLE: border < gadget { align initial: { 1/2 1/2 } } ; : new-border ( child class -- border ) - new-gadget [ swap add-gadget drop ] keep ; inline + new-gadget swap add-gadget ; inline : <border> ( child gap -- border ) swap border new-border @@ -42,7 +42,8 @@ M: border pref-dim* M: border layout* dup border-child-rect swap gadget-child over loc>> >>loc - swap dim>> swap (>>dim) ; + swap dim>> >>dim + drop ; M: border focusable-child* gadget-child ; diff --git a/basis/ui/gadgets/buttons/buttons.factor b/basis/ui/gadgets/buttons/buttons.factor index e04e385a23..4ad9e14874 100755 --- a/basis/ui/gadgets/buttons/buttons.factor +++ b/basis/ui/gadgets/buttons/buttons.factor @@ -25,7 +25,7 @@ TUPLE: button < border pressed? selected? quot ; dup mouse-clicked? over button-rollover? and buttons-down? and - over (>>pressed?) + >>pressed? relayout-1 ; : if-clicked ( button quot -- ) @@ -115,20 +115,18 @@ M: checkmark-paint draw-interior dup { 0 1 } v* swap { 1 0 } v* gl-line ] with-translation ; -: checkmark-theme ( gadget -- ) +: checkmark-theme ( gadget -- gadget ) f f black <solid> black <checkmark-paint> - <button-paint> - over (>>interior) - black <solid> - swap (>>boundary) ; + <button-paint> >>interior + black <solid> >>boundary ; : <checkmark> ( -- gadget ) <gadget> - dup checkmark-theme - { 14 14 } over (>>dim) ; + checkmark-theme + { 14 14 } >>dim ; : toggle-model ( model -- ) [ not ] change-model ; @@ -148,7 +146,7 @@ TUPLE: checkbox < button ; align-left ; M: checkbox model-changed - swap value>> over (>>selected?) relayout-1 ; + swap value>> >>selected? relayout-1 ; TUPLE: radio-paint color ; @@ -162,20 +160,18 @@ M: radio-paint draw-boundary color>> set-color origin get { 1 1 } v+ swap rect-dim { 2 2 } v- 12 gl-circle ; -: radio-knob-theme ( gadget -- ) +: radio-knob-theme ( gadget -- gadget ) f f black <radio-paint> black <radio-paint> - <button-paint> - over (>>interior) - black <radio-paint> - swap (>>boundary) ; + <button-paint> >>interior + black <radio-paint> >>boundary ; : <radio-knob> ( -- gadget ) <gadget> - dup radio-knob-theme - { 16 16 } over (>>dim) ; + radio-knob-theme + { 16 16 } >>dim ; TUPLE: radio-control < button value ; @@ -188,13 +184,12 @@ TUPLE: radio-control < button value ; M: radio-control model-changed swap value>> - over value>> = - over (>>selected?) + over value>> = >>selected? relayout-1 ; : <radio-controls> ( parent model assoc quot -- parent ) - #! quot has stack effect ( value model label -- ) - swapd [ swapd call add-gadget ] 2curry assoc-each ; inline + #! quot has stack effect ( value model label -- ) + swapd [ swapd call add-gadget ] 2curry assoc-each ; inline : radio-button-theme ( gadget -- gadget ) { 5 5 } >>gap @@ -204,18 +199,18 @@ M: radio-control model-changed <radio-knob> label-on-right radio-button-theme <radio-control> ; : <radio-buttons> ( model assoc -- gadget ) - <filled-pile> - -rot - [ <radio-button> ] <radio-controls> - { 5 5 } >>gap ; + <filled-pile> + -rot + [ <radio-button> ] <radio-controls> + { 5 5 } >>gap ; : <toggle-button> ( value model label -- gadget ) <radio-control> bevel-button-theme ; : <toggle-buttons> ( model assoc -- gadget ) - <shelf> - -rot - [ <toggle-button> ] <radio-controls> ; + <shelf> + -rot + [ <toggle-button> ] <radio-controls> ; : command-button-quot ( target command -- quot ) [ invoke-command drop ] 2curry ; @@ -227,7 +222,7 @@ M: radio-control model-changed <bevel-button> ; : <toolbar> ( target -- toolbar ) - <shelf> - swap - "toolbar" over class command-map commands>> swap - [ -rot <command-button> add-gadget ] curry assoc-each ; + <shelf> + swap + "toolbar" over class command-map commands>> swap + [ -rot <command-button> add-gadget ] curry assoc-each ; diff --git a/basis/ui/gadgets/editors/editors.factor b/basis/ui/gadgets/editors/editors.factor index 888716b364..a1026ef35a 100755 --- a/basis/ui/gadgets/editors/editors.factor +++ b/basis/ui/gadgets/editors/editors.factor @@ -96,9 +96,9 @@ M: editor ungraft* : click-loc ( editor model -- ) >r clicked-loc r> set-model ; -: focus-editor ( editor -- ) t over (>>focused?) relayout-1 ; +: focus-editor ( editor -- ) t >>focused? relayout-1 ; -: unfocus-editor ( editor -- ) f over (>>focused?) relayout-1 ; +: unfocus-editor ( editor -- ) f >>focused? relayout-1 ; : (offset>x) ( font col# str -- x ) swap head-slice string-width ; diff --git a/basis/ui/gadgets/gadgets-tests.factor b/basis/ui/gadgets/gadgets-tests.factor index a1602effe9..877d4ad145 100755 --- a/basis/ui/gadgets/gadgets-tests.factor +++ b/basis/ui/gadgets/gadgets-tests.factor @@ -9,9 +9,9 @@ IN: ui.gadgets.tests ! c contains b contains a <gadget> "a" set <gadget> "b" set - "a" get "b" get swap add-gadget drop + "b" get "a" get add-gadget drop <gadget> "c" set - "b" get "c" get swap add-gadget drop + "c" get "b" get add-gadget drop ! position a and b "a" get { 100 200 } >>loc drop @@ -33,8 +33,8 @@ IN: ui.gadgets.tests <gadget> "g3" set "g3" get { 100 200 } >>dim drop -"g1" get "g2" get swap add-gadget drop -"g2" get "g3" get swap add-gadget drop +"g2" get "g1" get add-gadget drop +"g3" get "g2" get add-gadget drop [ { 30 30 } ] [ "g1" get screen-loc ] unit-test [ { 30 30 } ] [ "g1" get screen-rect rect-loc ] unit-test @@ -49,11 +49,11 @@ IN: ui.gadgets.tests <gadget> "g1" set "g1" get { 300 300 } >>dim drop <gadget> "g2" set -"g2" get "g1" get swap add-gadget drop +"g1" get "g2" get add-gadget drop "g2" get { 20 20 } >>loc { 20 20 } >>dim drop <gadget> "g3" set -"g3" get "g1" get swap add-gadget drop +"g1" get "g3" get add-gadget drop "g3" get { 100 100 } >>loc { 20 20 } >>dim drop @@ -66,7 +66,7 @@ IN: ui.gadgets.tests [ t ] [ { 110 110 } "g1" get pick-up "g3" get eq? ] unit-test <gadget> "g4" set -"g4" get "g2" get swap add-gadget drop +"g2" get "g4" get add-gadget drop "g4" get { 5 5 } >>loc { 1 1 } >>dim drop @@ -121,7 +121,7 @@ M: mock-gadget ungraft* : add-some-children 3 [ <mock-gadget> over <model> >>model - dup "g" get swap add-gadget drop + "g" get over add-gadget drop swap 1+ number>string set ] each ; diff --git a/basis/ui/gadgets/gadgets.factor b/basis/ui/gadgets/gadgets.factor index 05764d5b84..a18571d472 100755 --- a/basis/ui/gadgets/gadgets.factor +++ b/basis/ui/gadgets/gadgets.factor @@ -27,10 +27,10 @@ M: gadget model-changed 2drop ; : nth-gadget ( n gadget -- child ) children>> nth ; : init-gadget ( gadget -- gadget ) - init-rect - { 0 1 } >>orientation - t >>visible? - { f f } >>graft-state ; inline + init-rect + { 0 1 } >>orientation + t >>visible? + { f f } >>graft-state ; inline : new-gadget ( class -- gadget ) new init-gadget ; inline @@ -132,9 +132,9 @@ M: array gadget-text* : gadget-text ( gadget -- string ) [ gadget-text* ] "" make ; : invalidate ( gadget -- ) - \ invalidate swap (>>layout-state) ; + \ invalidate >>layout-state drop ; -: forget-pref-dim ( gadget -- ) f swap (>>pref-dim) ; +: forget-pref-dim ( gadget -- ) f >>pref-dim drop ; : layout-queue ( -- queue ) \ layout-queue get ; @@ -147,7 +147,7 @@ M: array gadget-text* DEFER: relayout : invalidate* ( gadget -- ) - \ invalidate* over (>>layout-state) + \ invalidate* >>layout-state dup forget-pref-dim dup root?>> [ layout-later ] [ parent>> [ relayout ] when* ] if ; @@ -160,20 +160,19 @@ DEFER: relayout dup layout-state>> [ drop ] [ dup invalidate layout-later ] if ; -: show-gadget ( gadget -- ) t swap (>>visible?) ; - -: hide-gadget ( gadget -- ) f swap (>>visible?) ; +: show-gadget ( gadget -- ) t >>visible? drop ; + +: hide-gadget ( gadget -- ) f >>visible? drop ; DEFER: in-layout? -: do-invalidate ( gadget -- gadget ) - in-layout? get [ dup invalidate ] [ dup invalidate* ] if ; +GENERIC: dim-changed ( gadget -- ) + +M: gadget dim-changed + in-layout? get [ invalidate ] [ invalidate* ] if ; M: gadget (>>dim) ( dim gadget -- ) - 2dup dim>> = - [ 2drop ] - [ tuck call-next-method do-invalidate drop ] - if ; + 2dup dim>> = [ 2drop ] [ tuck call-next-method dim-changed ] if ; GENERIC: pref-dim* ( gadget -- dim ) @@ -194,9 +193,9 @@ GENERIC: layout* ( gadget -- ) M: gadget layout* drop ; -: prefer ( gadget -- ) dup pref-dim swap (>>dim) ; +: prefer ( gadget -- ) dup pref-dim >>dim drop ; -: validate ( gadget -- ) f swap (>>layout-state) ; +: validate ( gadget -- ) f >>layout-state drop ; : layout ( gadget -- ) dup layout-state>> [ @@ -255,11 +254,10 @@ M: gadget ungraft* drop ; : (unparent) ( gadget -- ) dup ungraft dup forget-pref-dim - f swap (>>parent) ; + f >>parent drop ; : unfocus-gadget ( child gadget -- ) - tuck focus>> eq? - [ f swap (>>focus) ] [ drop ] if ; + tuck focus>> eq? [ f >>focus ] when drop ; SYMBOL: in-layout? @@ -282,8 +280,7 @@ SYMBOL: in-layout? : (clear-gadget) ( gadget -- ) dup [ (unparent) ] each-child - f over (>>focus) - f swap (>>children) ; + f >>focus f >>children drop ; : clear-gadget ( gadget -- ) not-in-layout @@ -305,7 +302,7 @@ SYMBOL: in-layout? not-in-layout (add-gadget) dup relayout ; - + : add-gadgets ( parent children -- parent ) not-in-layout [ (add-gadget) ] each diff --git a/basis/ui/gadgets/grids/grids.factor b/basis/ui/gadgets/grids/grids.factor index f14ccf1cca..3e91e0ceb6 100644 --- a/basis/ui/gadgets/grids/grids.factor +++ b/basis/ui/gadgets/grids/grids.factor @@ -2,7 +2,7 @@ ! See http://factorcode.org/license.txt for BSD license. USING: arrays kernel math namespaces make sequences words io io.streams.string math.vectors ui.gadgets columns accessors -math.geometry.rect ; +math.geometry.rect locals ; IN: ui.gadgets.grids TUPLE: grid < gadget @@ -12,18 +12,18 @@ grid : new-grid ( children class -- grid ) new-gadget - [ (>>grid) ] [ >r concat r> swap add-gadgets drop ] [ nip ] 2tri ; - inline + swap >>grid + dup grid>> concat add-gadgets ; inline : <grid> ( children -- grid ) grid new-grid ; : grid-child ( grid i j -- gadget ) rot grid>> nth nth ; -: grid-add ( grid child i j -- grid ) - >r >r dupd swap r> r> - >r >r 2dup swap add-gadget drop r> r> - 3dup grid-child unparent rot grid>> nth set-nth ; +:: grid-add ( grid child i j -- grid ) + grid i j grid-child unparent + grid child add-gadget + child i j grid grid>> nth set-nth ; : grid-remove ( grid i j -- grid ) <gadget> -rot grid-add ; @@ -33,10 +33,10 @@ grid : (compute-grid) ( grid -- seq ) [ max-dim ] map ; : compute-grid ( grid -- horiz vert ) - pref-dim-grid dup flip (compute-grid) swap (compute-grid) ; + pref-dim-grid [ flip (compute-grid) ] [ (compute-grid) ] bi ; : (pair-up) ( horiz vert -- dim ) - >r first r> second 2array ; + [ first ] [ second ] bi* 2array ; : pair-up ( horiz vert -- dims ) [ [ (pair-up) ] curry map ] with map ; diff --git a/basis/ui/gadgets/incremental/incremental-docs.factor b/basis/ui/gadgets/incremental/incremental-docs.factor index 28c28be3a7..930d5ed502 100755 --- a/basis/ui/gadgets/incremental/incremental-docs.factor +++ b/basis/ui/gadgets/incremental/incremental-docs.factor @@ -8,7 +8,7 @@ $nl $nl "Children are managed with the " { $link add-incremental } " and " { $link clear-incremental } " words." $nl -"Not every " { $link pack } " can use incremental layout, since incremental layout does not support non-default values for " { $snippet "align" } ", " { $snippet "fill" } ", and " { $snippet "gap" } "." } ; +"Not every " { $link pack } " can use incremental layout, since incremental layout does not support non-default values for the " { $slot "align" } ", " { $slot "fill" } ", and " { $slot "gap" } " slots." } ; HELP: <incremental> { $values { "incremental" "a new instance of " { $link incremental } } } diff --git a/basis/ui/gadgets/incremental/incremental.factor b/basis/ui/gadgets/incremental/incremental.factor index 4d67080775..af249bbdc8 100755 --- a/basis/ui/gadgets/incremental/incremental.factor +++ b/basis/ui/gadgets/incremental/incremental.factor @@ -4,17 +4,6 @@ USING: io kernel math namespaces math.vectors ui.gadgets ui.gadgets.packs accessors math.geometry.rect ; IN: ui.gadgets.incremental -! Incremental layout allows adding lines to panes to be O(1). -! Note that incremental packs are distinct from ordinary packs -! defined in layouts.factor, since you don't want all packs to -! be incremental. In particular, incremental packs do not -! support non-default values for pack-align, pack-fill and -! pack-gap. - -! The cursor is the current size of the incremental pack. -! New gadgets are added at -! incremental-cursor gadget-orientation v* - TUPLE: incremental < pack cursor ; : <incremental> ( -- incremental ) @@ -24,38 +13,42 @@ TUPLE: incremental < pack cursor ; M: incremental pref-dim* dup layout-state>> [ - dup call-next-method over (>>cursor) + dup call-next-method >>cursor ] when cursor>> ; : next-cursor ( gadget incremental -- cursor ) [ - swap rect-dim swap cursor>> - 2dup v+ >r vmax r> + [ rect-dim ] [ cursor>> ] bi* + [ vmax ] [ v+ ] 2bi ] keep orientation>> set-axis ; : update-cursor ( gadget incremental -- ) - [ next-cursor ] keep (>>cursor) ; + tuck next-cursor >>cursor drop ; : incremental-loc ( gadget incremental -- ) [ cursor>> ] [ orientation>> ] bi v* >>loc drop ; -: prefer-incremental ( gadget -- ) +: prefer-incremental ( gadget -- ) USE: slots.private dup forget-pref-dim dup pref-dim >>dim drop ; +M: incremental dim-changed drop ; + : add-incremental ( gadget incremental -- ) not-in-layout 2dup swap (add-gadget) drop - over prefer-incremental - over layout-later - 2dup incremental-loc - tuck update-cursor - dup prefer-incremental - parent>> [ invalidate* ] when* ; + t in-layout? [ + over prefer-incremental + over layout-later + 2dup incremental-loc + tuck update-cursor + dup prefer-incremental + parent>> [ invalidate* ] when* + ] with-variable ; : clear-incremental ( incremental -- ) not-in-layout dup (clear-gadget) dup forget-pref-dim - { 0 0 } over (>>cursor) + { 0 0 } >>cursor parent>> [ relayout ] when* ; diff --git a/basis/ui/gadgets/labelled/labelled.factor b/basis/ui/gadgets/labelled/labelled.factor index 64020c7626..8cf13c8367 100755 --- a/basis/ui/gadgets/labelled/labelled.factor +++ b/basis/ui/gadgets/labelled/labelled.factor @@ -11,10 +11,10 @@ IN: ui.gadgets.labelled TUPLE: labelled-gadget < track content ; : <labelled-gadget> ( gadget title -- newgadget ) - { 0 1 } labelled-gadget new-track - swap <label> reverse-video-theme f track-add - swap >>content - dup content>> 1 track-add ; + { 0 1 } labelled-gadget new-track + swap <label> reverse-video-theme f track-add + swap >>content + dup content>> 1 track-add ; M: labelled-gadget focusable-child* content>> ; @@ -22,25 +22,25 @@ M: labelled-gadget focusable-child* content>> ; >r <scroller> r> <labelled-gadget> ; : <labelled-pane> ( model quot scrolls? title -- gadget ) - >r >r <pane-control> r> over (>>scrolls?) r> + >r >r <pane-control> r> >>scrolls? r> <labelled-scroller> ; : <close-box> ( quot -- button/f ) gray close-box <polygon-gadget> swap <bevel-button> ; -: title-theme ( gadget -- ) - { 1 0 } over (>>orientation) +: title-theme ( gadget -- gadget ) + { 1 0 } >>orientation T{ gradient f { T{ rgba f 0.65 0.65 1.0 1.0 } T{ rgba f 0.65 0.45 1.0 1.0 } - } } swap (>>interior) ; + } } >>interior ; -: <title-label> ( text -- label ) <label> dup title-theme ; +: <title-label> ( text -- label ) <label> title-theme ; : <title-bar> ( title quot -- gadget ) - <frame> - swap dup [ <close-box> @left grid-add ] [ drop ] if - swap <title-label> @center grid-add ; + <frame> + swap dup [ <close-box> @left grid-add ] [ drop ] if + swap <title-label> @center grid-add ; TUPLE: closable-gadget < frame content ; @@ -48,9 +48,9 @@ TUPLE: closable-gadget < frame content ; [ closable-gadget? ] find-parent ; : <closable-gadget> ( gadget title quot -- gadget ) - closable-gadget new-frame - -rot <title-bar> @top grid-add - swap >>content - dup content>> @center grid-add ; + closable-gadget new-frame + -rot <title-bar> @top grid-add + swap >>content + dup content>> @center grid-add ; M: closable-gadget focusable-child* content>> ; diff --git a/basis/ui/gadgets/labels/labels.factor b/basis/ui/gadgets/labels/labels.factor index f27b9898a1..6c38b6183d 100755 --- a/basis/ui/gadgets/labels/labels.factor +++ b/basis/ui/gadgets/labels/labels.factor @@ -63,11 +63,11 @@ M: object >label ; M: f >label drop <gadget> ; : label-on-left ( gadget label -- button ) - { 1 0 } <track> - swap >label f track-add - swap 1 track-add ; - + { 1 0 } <track> + swap >label f track-add + swap 1 track-add ; + : label-on-right ( label gadget -- button ) - { 1 0 } <track> - swap f track-add - swap >label 1 track-add ; + { 1 0 } <track> + swap f track-add + swap >label 1 track-add ; diff --git a/basis/ui/gadgets/lists/lists.factor b/basis/ui/gadgets/lists/lists.factor index 67c0ccc496..62e5b7d780 100755 --- a/basis/ui/gadgets/lists/lists.factor +++ b/basis/ui/gadgets/lists/lists.factor @@ -27,8 +27,7 @@ TUPLE: list < pack index presenter color hook ; control-value length 1- min 0 max ; : bound-index ( list -- ) - dup index>> over calc-bounded-index - swap (>>index) ; + dup index>> over calc-bounded-index >>index drop ; : list-presentation-hook ( list -- quot ) hook>> [ [ list? ] find-parent ] prepend ; @@ -49,7 +48,7 @@ TUPLE: list < pack index presenter color hook ; M: list model-changed nip dup clear-gadget - dup <list-items> over swap add-gadgets drop + dup <list-items> add-gadgets bound-index ; : selected-rect ( list -- rect ) @@ -79,8 +78,8 @@ M: list focusable-child* drop t ; 2drop ] [ [ control-value length rem ] keep - [ (>>index) ] keep - [ relayout-1 ] keep + swap >>index + dup relayout-1 scroll>selected ] if ; diff --git a/basis/ui/gadgets/menus/menus.factor b/basis/ui/gadgets/menus/menus.factor index 26e405f6db..7dd57e526a 100644 --- a/basis/ui/gadgets/menus/menus.factor +++ b/basis/ui/gadgets/menus/menus.factor @@ -15,19 +15,17 @@ TUPLE: menu-glass < gadget ; : <menu-glass> ( menu world -- glass ) menu-glass new-gadget >r over menu-loc >>loc r> - [ swap add-gadget drop ] keep ; + swap add-gadget ; M: menu-glass layout* gadget-child prefer ; : hide-glass ( world -- ) - dup glass>> [ unparent ] when* - f swap (>>glass) ; + [ [ unparent ] when* f ] change-glass drop ; : show-glass ( gadget world -- ) - over hand-clicked set-global - [ hide-glass ] keep - [ swap add-gadget drop ] 2keep - (>>glass) ; + dup hide-glass + swap [ hand-clicked set-global ] [ >>glass ] bi + dup glass>> add-gadget drop ; : show-menu ( gadget owner -- ) find-world [ <menu-glass> ] keep show-glass ; @@ -48,7 +46,7 @@ M: menu-glass layout* gadget-child prefer ; faint-boundary ; : <commands-menu> ( hook target commands -- gadget ) - <filled-pile> - -roll - [ <menu-item> add-gadget ] with with each - 5 <border> menu-theme ; + <filled-pile> + -roll + [ <menu-item> add-gadget ] with with each + 5 <border> menu-theme ; diff --git a/basis/ui/gadgets/packs/packs.factor b/basis/ui/gadgets/packs/packs.factor index 207708afdf..32a60374eb 100755 --- a/basis/ui/gadgets/packs/packs.factor +++ b/basis/ui/gadgets/packs/packs.factor @@ -5,9 +5,9 @@ math.vectors namespaces math.order accessors math.geometry.rect ; IN: ui.gadgets.packs TUPLE: pack < gadget - { align initial: 0 } - { fill initial: 0 } - { gap initial: { 0 0 } } ; + { align initial: 0 } + { fill initial: 0 } + { gap initial: { 0 0 } } ; : packed-dim-2 ( gadget sizes -- list ) [ over rect-dim over v- rot fill>> v*n v+ ] with map ; @@ -40,7 +40,7 @@ TUPLE: pack < gadget : <pile> ( -- pack ) { 0 1 } <pack> ; -: <filled-pile> ( -- pack ) <pile> 1 over (>>fill) ; +: <filled-pile> ( -- pack ) <pile> 1 >>fill ; : <shelf> ( -- pack ) { 1 0 } <pack> ; diff --git a/basis/ui/gadgets/panes/panes.factor b/basis/ui/gadgets/panes/panes.factor index 7f00084104..f100a72f06 100755 --- a/basis/ui/gadgets/panes/panes.factor +++ b/basis/ui/gadgets/panes/panes.factor @@ -1,45 +1,51 @@ ! Copyright (C) 2005, 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: arrays ui.gadgets ui.gadgets.borders ui.gadgets.buttons - ui.gadgets.labels ui.gadgets.scrollers - ui.gadgets.paragraphs ui.gadgets.incremental ui.gadgets.packs - ui.gadgets.theme ui.clipboards ui.gestures ui.traverse ui.render - hashtables io kernel namespaces sequences io.styles strings - quotations math opengl combinators math.vectors - sorting splitting io.streams.nested assocs - ui.gadgets.presentations ui.gadgets.slots ui.gadgets.grids - ui.gadgets.grid-lines classes.tuple models continuations - destructors accessors math.geometry.rect ; +ui.gadgets.labels ui.gadgets.scrollers ui.gadgets.paragraphs +ui.gadgets.incremental ui.gadgets.packs ui.gadgets.theme +ui.clipboards ui.gestures ui.traverse ui.render hashtables io +kernel namespaces sequences io.styles strings quotations math +opengl combinators math.vectors sorting splitting +io.streams.nested assocs ui.gadgets.presentations +ui.gadgets.slots ui.gadgets.grids ui.gadgets.grid-lines +classes.tuple models continuations destructors accessors +math.geometry.rect ; IN: ui.gadgets.panes TUPLE: pane < pack - output current prototype scrolls? - selection-color caret mark selecting? ; +output current prototype scrolls? +selection-color caret mark selecting? ; -: clear-selection ( pane -- pane ) f >>caret f >>mark ; +: clear-selection ( pane -- pane ) + f >>caret f >>mark ; -: add-output ( pane current -- pane ) [ >>output ] [ add-gadget ] bi ; -: add-current ( pane current -- pane ) [ >>current ] [ add-gadget ] bi ; +: add-output ( pane current -- pane ) + [ >>output ] [ add-gadget ] bi ; + +: add-current ( pane current -- pane ) + [ >>current ] [ add-gadget ] bi ; : prepare-line ( pane -- pane ) - clear-selection - dup prototype>> clone add-current ; + clear-selection + dup prototype>> clone add-current ; -: pane-caret&mark ( pane -- caret mark ) [ caret>> ] [ mark>> ] bi ; +: pane-caret&mark ( pane -- caret mark ) + [ caret>> ] [ mark>> ] bi ; : selected-children ( pane -- seq ) [ pane-caret&mark sort-pair ] keep gadget-subtree ; M: pane gadget-selection? pane-caret&mark and ; -M: pane gadget-selection ( pane -- string/f ) selected-children gadget-text ; +M: pane gadget-selection ( pane -- string/f ) + selected-children gadget-text ; : pane-clear ( pane -- ) - clear-selection - [ output>> clear-incremental ] - [ current>> clear-gadget ] - bi ; + clear-selection + [ output>> clear-incremental ] + [ current>> clear-gadget ] + bi ; : new-pane ( class -- pane ) new-gadget @@ -109,7 +115,7 @@ C: <pane-stream> pane-stream GENERIC: write-gadget ( gadget stream -- ) M: pane-stream write-gadget ( gadget pane-stream -- ) - pane>> current>> swap add-gadget drop ; + pane>> current>> swap add-gadget drop ; M: style-stream write-gadget stream>> write-gadget ; @@ -132,12 +138,12 @@ M: style-stream write-gadget : make-pane ( quot -- gadget ) <pane> [ swap with-pane ] keep smash-pane ; inline -: <scrolling-pane> ( -- pane ) <pane> t over (>>scrolls?) ; +: <scrolling-pane> ( -- pane ) <pane> t >>scrolls? ; TUPLE: pane-control < pane quot ; M: pane-control model-changed ( model pane-control -- ) - [ value>> ] [ dup quot>> ] bi* with-pane ; + [ value>> ] [ dup quot>> ] bi* with-pane ; : <pane-control> ( model quot -- pane ) pane-control new-pane @@ -172,7 +178,7 @@ M: pane-stream make-span-stream >r pick at r> when* ; inline : apply-foreground-style ( style gadget -- style gadget ) - foreground [ over (>>color) ] apply-style ; + foreground [ >>color ] apply-style ; : apply-background-style ( style gadget -- style gadget ) background [ solid-interior ] apply-style ; @@ -183,7 +189,7 @@ M: pane-stream make-span-stream font-size swap at 12 or 3array ; : apply-font-style ( style gadget -- style gadget ) - over specified-font over (>>font) ; + over specified-font >>font ; : apply-presentation-style ( style gadget -- style gadget ) presented [ <presentation> ] apply-style ; @@ -254,15 +260,15 @@ M: pane-stream make-block-stream ! Tables : apply-table-gap-style ( style grid -- style grid ) - table-gap [ over (>>gap) ] apply-style ; + table-gap [ >>gap ] apply-style ; : apply-table-border-style ( style grid -- style grid ) - table-border [ <grid-lines> over (>>boundary) ] + table-border [ <grid-lines> >>boundary ] apply-style ; : styled-grid ( style grid -- grid ) <grid> - f over (>>fill?) + f >>fill? apply-table-gap-style apply-table-border-style nip ; @@ -286,13 +292,13 @@ M: pack dispose drop ; M: paragraph dispose drop ; : gadget-write ( string gadget -- ) - over empty? - [ 2drop ] [ >r <label> text-theme r> swap add-gadget drop ] if ; + swap dup empty? + [ 2drop ] [ <label> text-theme add-gadget drop ] if ; M: pack stream-write gadget-write ; : gadget-bl ( style stream -- ) - >r " " <word-break-gadget> style-label r> swap add-gadget drop ; + swap " " <word-break-gadget> style-label add-gadget drop ; M: paragraph stream-write swap " " split @@ -309,8 +315,8 @@ M: paragraph stream-write1 [ H{ } swap gadget-bl drop ] [ gadget-write1 ] if ; : gadget-format ( string style stream -- ) - pick empty? - [ 3drop ] [ >r swap <styled-label> r> swap add-gadget drop ] if ; + spin dup empty? + [ 3drop ] [ <styled-label> add-gadget drop ] if ; M: pack stream-format gadget-format ; @@ -326,13 +332,13 @@ M: paragraph stream-format ] if ; : caret>mark ( pane -- pane ) - dup caret>> >>mark - dup relayout-1 ; + dup caret>> >>mark + dup relayout-1 ; GENERIC: sloppy-pick-up* ( loc gadget -- n ) M: pack sloppy-pick-up* ( loc gadget -- n ) - [ orientation>> ] [ children>> ] bi (fast-children-on) ; + [ orientation>> ] [ children>> ] bi (fast-children-on) ; M: gadget sloppy-pick-up* children>> [ inside? ] with find-last drop ; @@ -350,12 +356,10 @@ M: f sloppy-pick-up* if ; : move-caret ( pane -- pane ) - dup hand-rel - over sloppy-pick-up - over (>>caret) - dup relayout-1 ; + dup hand-rel over sloppy-pick-up >>caret + dup relayout-1 ; -: begin-selection ( pane -- ) move-caret f swap (>>mark) ; +: begin-selection ( pane -- ) move-caret f >>mark drop ; : extend-selection ( pane -- ) hand-moved? [ diff --git a/basis/ui/gadgets/paragraphs/paragraphs.factor b/basis/ui/gadgets/paragraphs/paragraphs.factor index fed1fb97f1..216f21af27 100644 --- a/basis/ui/gadgets/paragraphs/paragraphs.factor +++ b/basis/ui/gadgets/paragraphs/paragraphs.factor @@ -17,8 +17,8 @@ TUPLE: paragraph < gadget margin ; : <paragraph> ( margin -- gadget ) paragraph new-gadget - { 1 0 } over (>>orientation) - [ (>>margin) ] keep ; + { 1 0 } >>orientation + swap >>margin ; SYMBOL: x SYMBOL: max-x diff --git a/basis/ui/gadgets/scrollers/scrollers-tests.factor b/basis/ui/gadgets/scrollers/scrollers-tests.factor index 48251c4927..625bfd7880 100755 --- a/basis/ui/gadgets/scrollers/scrollers-tests.factor +++ b/basis/ui/gadgets/scrollers/scrollers-tests.factor @@ -61,7 +61,7 @@ IN: ui.gadgets.scrollers.tests <gadget> { 600 400 } >>dim "g1" set <gadget> { 600 10 } >>dim "g2" set -"g2" get "g1" get swap add-gadget drop +"g1" get "g2" get add-gadget drop "g1" get <scroller> { 300 300 } >>dim diff --git a/basis/ui/gadgets/scrollers/scrollers.factor b/basis/ui/gadgets/scrollers/scrollers.factor index 70e56fc31c..fefce8a040 100755 --- a/basis/ui/gadgets/scrollers/scrollers.factor +++ b/basis/ui/gadgets/scrollers/scrollers.factor @@ -33,17 +33,17 @@ scroller H{ 0 0 0 0 <range> 0 0 0 0 <range> 2array <compose> ; : new-scroller ( gadget class -- scroller ) - new-frame - t >>root? - <scroller-model> >>model - faint-boundary + new-frame + t >>root? + <scroller-model> >>model + faint-boundary - dup model>> dependencies>> first <x-slider> >>x dup x>> @bottom grid-add - dup model>> dependencies>> second <y-slider> >>y dup y>> @right grid-add + dup model>> dependencies>> first <x-slider> >>x dup x>> @bottom grid-add + dup model>> dependencies>> second <y-slider> >>y dup y>> @right grid-add + + swap over model>> <viewport> >>viewport + dup viewport>> @center grid-add ; - swap over model>> <viewport> >>viewport - dup viewport>> @center grid-add ; - : <scroller> ( gadget -- scroller ) scroller new-scroller ; : scroll ( value scroller -- ) @@ -81,7 +81,7 @@ scroller H{ : scroll>rect ( rect gadget -- ) dup find-scroller* dup [ [ relative-scroll-rect ] keep - [ (>>follows) ] keep + swap >>follows relayout ] [ 3drop @@ -94,7 +94,7 @@ scroller H{ : scroll>gadget ( gadget -- ) dup find-scroller* dup [ - [ (>>follows) ] keep + swap >>follows relayout ] [ 2drop @@ -104,9 +104,7 @@ scroller H{ dup viewport>> viewport-dim { 0 1 } v* swap scroll ; : scroll>bottom ( gadget -- ) - find-scroller [ - t over (>>follows) relayout-1 - ] when* ; + find-scroller [ t >>follows relayout-1 ] when* ; : scroll>top ( gadget -- ) <zero-rect> swap scroll>rect ; @@ -124,14 +122,14 @@ M: f update-scroller drop dup scroller-value swap scroll ; M: scroller layout* dup call-next-method dup follows>> - [ update-scroller ] 2keep - swap (>>follows) ; + 2dup update-scroller + >>follows drop ; M: scroller focusable-child* viewport>> ; M: scroller model-changed - nip f swap (>>follows) ; + nip f >>follows drop ; TUPLE: limited-scroller < scroller fixed-dim ; diff --git a/basis/ui/gadgets/sliders/sliders.factor b/basis/ui/gadgets/sliders/sliders.factor index 8d673e66ad..f42d65f738 100755 --- a/basis/ui/gadgets/sliders/sliders.factor +++ b/basis/ui/gadgets/sliders/sliders.factor @@ -46,7 +46,7 @@ M: slider model-changed nip elevator>> relayout-1 ; TUPLE: thumb < gadget ; : begin-drag ( thumb -- ) - find-slider dup slider-value swap (>>saved) ; + find-slider dup slider-value >>saved drop ; : do-drag ( thumb -- ) find-slider drag-loc over orientation>> v. @@ -83,7 +83,7 @@ thumb H{ dup direction>> swap find-slider slide-by-page ; : elevator-click ( elevator -- ) - dup compute-direction over (>>direction) + dup compute-direction >>direction elevator-hold ; elevator H{ @@ -123,13 +123,13 @@ M: elevator layout* : <slide-button> ( vector polygon amount -- button ) >r gray swap <polygon-gadget> r> [ swap find-slider slide-by-line ] curry <repeat-button> - [ (>>orientation) ] keep ; + swap >>orientation ; : elevator, ( gadget orientation -- gadget ) - tuck <elevator> >>elevator - swap <thumb> >>thumb - dup elevator>> over thumb>> add-gadget - @center grid-add ; + tuck <elevator> >>elevator + swap <thumb> >>thumb + dup elevator>> over thumb>> add-gadget + @center grid-add ; : <left-button> ( -- button ) { 0 1 } arrow-left -1 <slide-button> ; : <right-button> ( -- button ) { 0 1 } arrow-right 1 <slide-button> ; @@ -143,16 +143,16 @@ M: elevator layout* 32 >>line ; : <x-slider> ( range -- slider ) - { 1 0 } <slider> - <left-button> @left grid-add - { 0 1 } elevator, - <right-button> @right grid-add ; + { 1 0 } <slider> + <left-button> @left grid-add + { 0 1 } elevator, + <right-button> @right grid-add ; : <y-slider> ( range -- slider ) - { 0 1 } <slider> - <up-button> @top grid-add - { 1 0 } elevator, - <down-button> @bottom grid-add ; + { 0 1 } <slider> + <up-button> @top grid-add + { 1 0 } elevator, + <down-button> @bottom grid-add ; M: slider pref-dim* dup call-next-method diff --git a/basis/ui/gadgets/slots/slots.factor b/basis/ui/gadgets/slots/slots.factor index b111caa179..1cf23e2d06 100755 --- a/basis/ui/gadgets/slots/slots.factor +++ b/basis/ui/gadgets/slots/slots.factor @@ -69,12 +69,12 @@ M: value-ref finish-editing } define-command : <slot-editor> ( ref -- gadget ) - { 0 1 } slot-editor new-track - swap >>ref - dup <toolbar> f track-add - <source-editor> >>text - dup text>> <scroller> 1 track-add - dup revert ; + { 0 1 } slot-editor new-track + swap >>ref + dup <toolbar> f track-add + <source-editor> >>text + dup text>> <scroller> 1 track-add + dup revert ; M: slot-editor pref-dim* call-next-method { 600 200 } vmin ; diff --git a/basis/ui/gadgets/tracks/tracks-tests.factor b/basis/ui/gadgets/tracks/tracks-tests.factor index 6feaf52b47..93f2d14528 100644 --- a/basis/ui/gadgets/tracks/tracks-tests.factor +++ b/basis/ui/gadgets/tracks/tracks-tests.factor @@ -3,14 +3,14 @@ USING: kernel ui.gadgets ui.gadgets.tracks tools.test IN: ui.gadgets.tracks.tests [ { 100 100 } ] [ - { 0 1 } <track> - <gadget> { 100 100 } >>dim 1 track-add - pref-dim + { 0 1 } <track> + <gadget> { 100 100 } >>dim 1 track-add + pref-dim ] unit-test [ { 100 110 } ] [ - { 0 1 } <track> - <gadget> { 10 10 } >>dim f track-add - <gadget> { 100 100 } >>dim 1 track-add - pref-dim + { 0 1 } <track> + <gadget> { 10 10 } >>dim f track-add + <gadget> { 100 100 } >>dim 1 track-add + pref-dim ] unit-test diff --git a/basis/ui/gadgets/tracks/tracks.factor b/basis/ui/gadgets/tracks/tracks.factor index 029bc5447c..5a9683ceff 100644 --- a/basis/ui/gadgets/tracks/tracks.factor +++ b/basis/ui/gadgets/tracks/tracks.factor @@ -9,23 +9,23 @@ IN: ui.gadgets.tracks TUPLE: track < pack sizes ; : normalized-sizes ( track -- seq ) - sizes>> dup sift sum '[ dup [ _ / ] when ] map ; + sizes>> dup sift sum '[ dup [ _ / ] when ] map ; : init-track ( track -- track ) - init-gadget - V{ } clone >>sizes - 1 >>fill ; + init-gadget + V{ } clone >>sizes + 1 >>fill ; : new-track ( orientation class -- track ) - new - init-track - swap >>orientation ; + new + init-track + swap >>orientation ; : <track> ( orientation -- track ) track new-track ; : alloted-dim ( track -- dim ) - [ children>> ] [ sizes>> ] bi { 0 0 } - [ [ drop { 0 0 } ] [ pref-dim ] if v+ ] 2reduce ; + [ children>> ] [ sizes>> ] bi { 0 0 } + [ [ drop { 0 0 } ] [ pref-dim ] if v+ ] 2reduce ; : available-dim ( track -- dim ) [ dim>> ] [ alloted-dim ] bi v- ; @@ -38,29 +38,26 @@ M: track layout* ( track -- ) dup track-layout pack-layout ; : track-pref-dims-1 ( track -- dim ) children>> pref-dims max-dim ; : track-pref-dims-2 ( track -- dim ) - [ children>> pref-dims ] [ normalized-sizes ] bi - [ [ v/n ] when* ] 2map - max-dim - [ >fixnum ] map ; + [ children>> pref-dims ] [ normalized-sizes ] bi + [ [ v/n ] when* ] 2map + max-dim + [ >fixnum ] map ; M: track pref-dim* ( gadget -- dim ) - [ track-pref-dims-1 ] - [ [ alloted-dim ] [ track-pref-dims-2 ] bi v+ ] - [ orientation>> ] - tri - set-axis ; + [ track-pref-dims-1 ] + [ [ alloted-dim ] [ track-pref-dims-2 ] bi v+ ] + [ orientation>> ] + tri + set-axis ; : track-add ( track gadget constraint -- track ) - pick sizes>> push add-gadget ; + pick sizes>> push add-gadget ; : track-remove ( track gadget -- track ) - dupd dup - [ - [ swap children>> index ] - [ unparent sizes>> ] 2bi - delete-nth - ] - [ 2drop ] - if ; + dupd dup [ + [ swap children>> index ] + [ unparent sizes>> ] 2bi + delete-nth + ] [ 2drop ] if ; : clear-track ( track -- ) V{ } clone >>sizes clear-gadget ; diff --git a/basis/ui/gadgets/viewports/viewports.factor b/basis/ui/gadgets/viewports/viewports.factor index c6e4b044cd..5f714a526b 100755 --- a/basis/ui/gadgets/viewports/viewports.factor +++ b/basis/ui/gadgets/viewports/viewports.factor @@ -18,7 +18,7 @@ TUPLE: viewport < gadget ; viewport new-gadget swap >>model t >>clipped? - [ swap add-gadget drop ] keep ; + swap add-gadget ; M: viewport layout* dup rect-dim viewport-gap 2 v*n v- diff --git a/basis/ui/gadgets/worlds/worlds-tests.factor b/basis/ui/gadgets/worlds/worlds-tests.factor index dbaaa33a51..34ddc17767 100644 --- a/basis/ui/gadgets/worlds/worlds-tests.factor +++ b/basis/ui/gadgets/worlds/worlds-tests.factor @@ -18,7 +18,7 @@ IN: ui.gadgets.worlds.tests <gadget> "g1" set <gadget> "g2" set -"g1" get "g2" get swap add-gadget drop +"g2" get "g1" get add-gadget drop [ ] [ "g2" get <test-world> "w" set @@ -33,8 +33,8 @@ IN: ui.gadgets.worlds.tests <gadget> "g1" set <gadget> "g2" set <gadget> "g3" set -"g1" get "g3" get swap add-gadget drop -"g2" get "g3" get swap add-gadget drop +"g3" get "g1" get add-gadget drop +"g3" get "g2" get add-gadget drop [ ] [ "g3" get <test-world> "w" set @@ -55,7 +55,7 @@ TUPLE: focus-test < gadget ; : <focus-test> focus-test new-gadget - <focusing> over swap add-gadget drop ; + dup <focusing> add-gadget drop ; M: focus-test focusable-child* gadget-child ; diff --git a/basis/ui/gadgets/worlds/worlds.factor b/basis/ui/gadgets/worlds/worlds.factor index cedd03e39e..1bdc63ed0e 100755 --- a/basis/ui/gadgets/worlds/worlds.factor +++ b/basis/ui/gadgets/worlds/worlds.factor @@ -89,7 +89,7 @@ SYMBOL: ui-error-hook (draw-world) ] [ over <world-error> ui-error - f swap (>>active?) + f >>active? drop ] recover ] with-variable ] [ diff --git a/basis/ui/operations/operations.factor b/basis/ui/operations/operations.factor index 3e0b36486e..8e83f69edb 100755 --- a/basis/ui/operations/operations.factor +++ b/basis/ui/operations/operations.factor @@ -19,8 +19,7 @@ TUPLE: operation predicate command translator hook listener? ; swap >>predicate ; PREDICATE: listener-operation < operation - dup command>> listener-command? - swap listener?>> or ; + [ command>> listener-command? ] [ listener?>> ] bi or ; M: operation command-name command>> command-name ; @@ -59,15 +58,15 @@ SYMBOL: operations : modify-operation ( hook translator operation -- operation ) clone - tuck (>>translator) - tuck (>>hook) - t over (>>listener?) ; + swap >>translator + swap >>hook + t >>listener? ; : modify-operations ( operations hook translator -- operations ) - rot [ >r 2dup r> modify-operation ] map 2nip ; + rot [ modify-operation ] with with map ; : operations>commands ( object hook translator -- pairs ) - >r >r object-operations r> r> modify-operations + [ object-operations ] 2dip modify-operations [ [ operation-gesture ] keep ] { } map>assoc ; : define-operation-map ( class group blurb object hook translator -- ) diff --git a/basis/ui/render/render.factor b/basis/ui/render/render.factor index 2147fc2b53..9aacf1c724 100644 --- a/basis/ui/render/render.factor +++ b/basis/ui/render/render.factor @@ -139,7 +139,7 @@ M: polygon draw-interior : <polygon-gadget> ( color points -- gadget ) dup max-dim >r <polygon> <gadget> r> >>dim - [ (>>interior) ] keep ; + swap >>interior ; ! Font rendering SYMBOL: font-renderer diff --git a/basis/ui/tools/browser/browser.factor b/basis/ui/tools/browser/browser.factor index 33523701aa..83a3b7ff68 100755 --- a/basis/ui/tools/browser/browser.factor +++ b/basis/ui/tools/browser/browser.factor @@ -20,11 +20,11 @@ TUPLE: browser-gadget < track pane history ; "handbook" >link <history> >>history drop ; : <browser-gadget> ( -- gadget ) - { 0 1 } browser-gadget new-track - dup init-history - dup <toolbar> f track-add - dup <help-pane> >>pane - dup pane>> <scroller> 1 track-add ; + { 0 1 } browser-gadget new-track + dup init-history + dup <toolbar> f track-add + dup <help-pane> >>pane + dup pane>> <scroller> 1 track-add ; M: browser-gadget call-tool* show-help ; diff --git a/basis/ui/tools/deploy/deploy.factor b/basis/ui/tools/deploy/deploy.factor index 285757e390..e6180e9982 100755 --- a/basis/ui/tools/deploy/deploy.factor +++ b/basis/ui/tools/deploy/deploy.factor @@ -42,8 +42,8 @@ TUPLE: deploy-gadget < pack vocab settings ; deploy-c-types? get "Retain all C types" <checkbox> add-gadget ; : deploy-settings-theme ( gadget -- gadget ) - { 10 10 } >>gap - 1 >>fill ; + { 10 10 } >>gap + 1 >>fill ; : <deploy-settings> ( vocab -- control ) default-config [ <model> ] assoc-map @@ -57,7 +57,7 @@ TUPLE: deploy-gadget < pack vocab settings ; advanced-settings deploy-settings-theme - namespace <mapping> over (>>model) + namespace <mapping> >>model ] bind ; diff --git a/basis/ui/tools/inspector/inspector.factor b/basis/ui/tools/inspector/inspector.factor index 273d6bc549..dcb3a3f8ad 100644 --- a/basis/ui/tools/inspector/inspector.factor +++ b/basis/ui/tools/inspector/inspector.factor @@ -16,11 +16,11 @@ TUPLE: inspector-gadget < track object pane ; ] with-pane ; : <inspector-gadget> ( -- gadget ) - { 0 1 } inspector-gadget new-track - dup <toolbar> f track-add - <pane> >>pane - dup pane>> <scroller> 1 track-add ; - + { 0 1 } inspector-gadget new-track + dup <toolbar> f track-add + <pane> >>pane + dup pane>> <scroller> 1 track-add ; + : inspect-object ( obj mirror keys inspector -- ) 2nip swap >>object refresh ; diff --git a/basis/ui/tools/listener/listener-tests.factor b/basis/ui/tools/listener/listener-tests.factor index dff45251d1..e86b52c664 100755 --- a/basis/ui/tools/listener/listener-tests.factor +++ b/basis/ui/tools/listener/listener-tests.factor @@ -15,7 +15,7 @@ IN: ui.tools.listener.tests [ "dup" ] [ \ dup word-completion-string ] unit-test - + [ "equal?" ] [ \ array \ equal? method word-completion-string ] unit-test diff --git a/basis/ui/tools/listener/listener.factor b/basis/ui/tools/listener/listener.factor index 4c20abca87..6fc6fa4f10 100755 --- a/basis/ui/tools/listener/listener.factor +++ b/basis/ui/tools/listener/listener.factor @@ -13,8 +13,8 @@ IN: ui.tools.listener TUPLE: listener-gadget < track input output stack ; : listener-output, ( listener -- listener ) - <scrolling-pane> >>output - dup output>> <scroller> "Output" <labelled-gadget> 1 track-add ; + <scrolling-pane> >>output + dup output>> <scroller> "Output" <labelled-gadget> 1 track-add ; : listener-streams ( listener -- input output ) [ input>> ] [ output>> <pane-stream> ] bi ; @@ -23,15 +23,15 @@ TUPLE: listener-gadget < track input output stack ; output>> <pane-stream> <interactor> ; : listener-input, ( listener -- listener ) - dup <listener-input> >>input - dup input>> - { 0 100 } <limited-scroller> - "Input" <labelled-gadget> - f track-add ; + dup <listener-input> >>input + dup input>> + { 0 100 } <limited-scroller> + "Input" <labelled-gadget> + f track-add ; : welcome. ( -- ) - "If this is your first time with Factor, please read the " print - "handbook" ($link) "." print nl ; + "If this is your first time with Factor, please read the " print + "handbook" ($link) "." print nl ; M: listener-gadget focusable-child* input>> ; @@ -121,11 +121,10 @@ M: engine-word word-completion-string TUPLE: stack-display < track ; : <stack-display> ( workspace -- gadget ) - listener>> - { 0 1 } stack-display new-track + listener>> + { 0 1 } stack-display new-track over <toolbar> f track-add - swap - stack>> [ [ stack. ] curry try ] t "Data stack" <labelled-pane> + swap stack>> [ [ stack. ] curry try ] t "Data stack" <labelled-pane> 1 track-add ; M: stack-display tool-scroller @@ -166,14 +165,14 @@ M: stack-display tool-scroller } cleave ; : init-listener ( listener -- ) - f <model> swap (>>stack) ; + f <model> >>stack drop ; : <listener-gadget> ( -- gadget ) - { 0 1 } listener-gadget new-track - dup init-listener - listener-output, - listener-input, ; - + { 0 1 } listener-gadget new-track + dup init-listener + listener-output, + listener-input, ; + : listener-help ( -- ) "ui-listener" help-window ; \ listener-help H{ { +nullary+ t } } define-command diff --git a/basis/ui/tools/profiler/profiler.factor b/basis/ui/tools/profiler/profiler.factor index 98717fc7bc..c60d0dac09 100755 --- a/basis/ui/tools/profiler/profiler.factor +++ b/basis/ui/tools/profiler/profiler.factor @@ -8,11 +8,11 @@ IN: ui.tools.profiler TUPLE: profiler-gadget < track pane ; : <profiler-gadget> ( -- gadget ) - { 0 1 } profiler-gadget new-track - dup <toolbar> f track-add - <pane> >>pane - dup pane>> <scroller> 1 track-add ; - + { 0 1 } profiler-gadget new-track + dup <toolbar> f track-add + <pane> >>pane + dup pane>> <scroller> 1 track-add ; + : with-profiler-pane ( gadget quot -- ) >r pane>> r> with-pane ; diff --git a/basis/ui/tools/search/search-tests.factor b/basis/ui/tools/search/search-tests.factor index dcfb7346b4..d477274520 100755 --- a/basis/ui/tools/search/search-tests.factor +++ b/basis/ui/tools/search/search-tests.factor @@ -19,7 +19,7 @@ IN: ui.tools.search.tests ] with-grafted-gadget ; : test-live-search ( gadget quot -- ? ) - >r update-live-search dup assert-non-empty r> all? ; + >r update-live-search dup assert-non-empty r> all? ; [ t ] [ "swp" all-words f <definition-search> diff --git a/basis/ui/tools/search/search.factor b/basis/ui/tools/search/search.factor index 5237813fe0..b88fe8454e 100755 --- a/basis/ui/tools/search/search.factor +++ b/basis/ui/tools/search/search.factor @@ -60,15 +60,14 @@ search-field H{ swap <list> ; : <live-search> ( string seq limited? presenter -- gadget ) - { 0 1 } live-search new-track - <search-field> >>field - dup field>> f track-add - -roll <search-list> >>list - dup list>> <scroller> 1 track-add - - swap - over field>> set-editor-string - dup field>> end-of-document ; + { 0 1 } live-search new-track + <search-field> >>field + dup field>> f track-add + -roll <search-list> >>list + dup list>> <scroller> 1 track-add + swap + over field>> set-editor-string + dup field>> end-of-document ; M: live-search focusable-child* field>> ; diff --git a/basis/ui/tools/tools-tests.factor b/basis/ui/tools/tools-tests.factor index b38dd52b6e..2265f27cc8 100755 --- a/basis/ui/tools/tools-tests.factor +++ b/basis/ui/tools/tools-tests.factor @@ -7,7 +7,7 @@ IN: ui.tools.tests [ f ] [ - <gadget> 0 <model> >>model <workspace-tabs> children>> empty? + <gadget> 0 <model> >>model <workspace-tabs> children>> empty? ] unit-test [ ] [ <workspace> "w" set ] unit-test diff --git a/basis/ui/tools/tools.factor b/basis/ui/tools/tools.factor index 21fa44b593..f4205061cd 100755 --- a/basis/ui/tools/tools.factor +++ b/basis/ui/tools/tools.factor @@ -13,35 +13,30 @@ mirrors ; IN: ui.tools : <workspace-tabs> ( workspace -- tabs ) - model>> - "tool-switching" workspace command-map commands>> - [ command-string ] { } assoc>map <enum> >alist - <toggle-buttons> ; + model>> + "tool-switching" workspace command-map commands>> + [ command-string ] { } assoc>map <enum> >alist + <toggle-buttons> ; : <workspace-book> ( workspace -- gadget ) - - dup - <stack-display> - <browser-gadget> - <inspector-gadget> - <profiler-gadget> - 4array - - swap model>> - - <book> ; + dup + <stack-display> + <browser-gadget> + <inspector-gadget> + <profiler-gadget> + 4array + swap model>> <book> ; : <workspace> ( -- workspace ) - { 0 1 } workspace new-track + { 0 1 } workspace new-track + 0 <model> >>model + <listener-gadget> >>listener + dup <workspace-book> >>book - 0 <model> >>model - <listener-gadget> >>listener - dup <workspace-book> >>book - - dup <workspace-tabs> f track-add - dup book>> 1/5 track-add - dup listener>> 4/5 track-add - dup <toolbar> f track-add ; + dup <workspace-tabs> f track-add + dup book>> 1/5 track-add + dup listener>> 4/5 track-add + dup <toolbar> f track-add ; : resize-workspace ( workspace -- ) dup sizes>> over control-value zero? [ diff --git a/basis/ui/tools/traceback/traceback.factor b/basis/ui/tools/traceback/traceback.factor index 92c5e09a88..6cb79916e0 100755 --- a/basis/ui/tools/traceback/traceback.factor +++ b/basis/ui/tools/traceback/traceback.factor @@ -25,14 +25,14 @@ TUPLE: traceback-gadget < track ; M: traceback-gadget pref-dim* drop { 550 600 } ; : <traceback-gadget> ( model -- gadget ) - { 0 1 } traceback-gadget new-track - swap >>model + { 0 1 } traceback-gadget new-track + swap >>model dup model>> - { 1 0 } <track> - over <datastack-display> 1/2 track-add - swap <retainstack-display> 1/2 track-add - 1/3 track-add + { 1 0 } <track> + over <datastack-display> 1/2 track-add + swap <retainstack-display> 1/2 track-add + 1/3 track-add dup model>> <callstack-display> 2/3 track-add diff --git a/basis/ui/tools/workspace/workspace.factor b/basis/ui/tools/workspace/workspace.factor index ab6b3fe1cf..bbe4b12712 100755 --- a/basis/ui/tools/workspace/workspace.factor +++ b/basis/ui/tools/workspace/workspace.factor @@ -26,7 +26,7 @@ GENERIC: tool-scroller ( tool -- scroller ) M: gadget tool-scroller drop f ; : find-tool ( class workspace -- index tool ) - book>> children>> [ class eq? ] with find ; + book>> children>> [ class eq? ] with find ; : show-tool ( class workspace -- tool ) [ find-tool swap ] keep book>> model>> @@ -55,15 +55,15 @@ M: gadget tool-scroller drop f ; article-title open-window ; : hide-popup ( workspace -- ) - dup popup>> track-remove - f >>popup - request-focus ; + dup popup>> track-remove + f >>popup + request-focus ; : show-popup ( gadget workspace -- ) - dup hide-popup - over >>popup - over f track-add drop - request-focus ; + dup hide-popup + over >>popup + over f track-add drop + request-focus ; : show-titled-popup ( workspace gadget title -- ) [ find-workspace hide-popup ] <closable-gadget> diff --git a/basis/ui/ui.factor b/basis/ui/ui.factor index da9e2f0d43..f561f3cd49 100755 --- a/basis/ui/ui.factor +++ b/basis/ui/ui.factor @@ -51,12 +51,12 @@ SYMBOL: stop-after-last-window? T{ gain-focus } swap each-gesture ; : focus-world ( world -- ) - t over (>>focused?) + t >>focused? dup raised-window focus-path f focus-gestures ; : unfocus-world ( world -- ) - f over (>>focused?) + f >>focused? focus-path f swap focus-gestures ; M: world graft* @@ -69,7 +69,7 @@ M: world graft* #! when restoring saved worlds on image startup. dup fonts>> clear-assoc dup unfocus-world - f swap (>>handle) ; + f >>handle drop ; M: world ungraft* dup free-fonts @@ -93,13 +93,8 @@ SYMBOL: ui-hook dup graft-state>> { { { f f } [ ] } { { f t } [ ] } - { { t t } [ - { f f } over (>>graft-state) - ] } - { { t f } [ - dup unqueue-graft - { f f } over (>>graft-state) - ] } + { { t t } [ { f f } >>graft-state ] } + { { t f } [ dup unqueue-graft { f f } >>graft-state ] } } case graft-later ; : restore-gadget ( gadget -- ) @@ -172,7 +167,7 @@ SYMBOL: ui-thread "UI update" spawn drop ; : open-world-window ( world -- ) - dup pref-dim over (>>dim) dup relayout graft ; + dup pref-dim >>dim dup relayout graft ; : open-window ( gadget title -- ) f <world> open-world-window ; diff --git a/basis/ui/x11/x11.factor b/basis/ui/x11/x11.factor index 854a0b0c62..3122bc536b 100755 --- a/basis/ui/x11/x11.factor +++ b/basis/ui/x11/x11.factor @@ -21,8 +21,8 @@ C: <x11-handle> x11-handle M: world expose-event nip relayout ; M: world configure-event - over configured-loc over (>>window-loc) - swap configured-dim over (>>dim) + over configured-loc >>window-loc + swap configured-dim >>dim ! In case dimensions didn't change relayout-1 ; @@ -173,7 +173,7 @@ M: world client-event dup window-loc>> over rect-dim glx-window over "Factor" create-xic <x11-handle> 2dup window>> register-window - swap (>>handle) ; + >>handle drop ; : wait-event ( -- event ) QueuedAfterFlush events-queued 0 > [ diff --git a/basis/unicode/breaks/breaks.factor b/basis/unicode/breaks/breaks.factor index 88381ca7d7..6aa3e60647 100755 --- a/basis/unicode/breaks/breaks.factor +++ b/basis/unicode/breaks/breaks.factor @@ -98,5 +98,4 @@ VALUE: grapheme-table init-grapheme-table table [ make-grapheme-table finish-table ] with-variable -\ grapheme-table set-value - +to: grapheme-table diff --git a/basis/unicode/collation/collation.factor b/basis/unicode/collation/collation.factor index 3ebb474a81..8e9e2963a8 100755 --- a/basis/unicode/collation/collation.factor +++ b/basis/unicode/collation/collation.factor @@ -27,7 +27,7 @@ TUPLE: weight primary secondary tertiary ignorable? ; [ parse-line ] H{ } map>assoc ; "resource:basis/unicode/collation/allkeys.txt" -ascii <file-reader> parse-ducet \ ducet set-value +ascii <file-reader> parse-ducet to: ducet ! Fix up table for long contractions : help-one ( assoc key -- ) diff --git a/basis/unicode/data/data.factor b/basis/unicode/data/data.factor index 6d6ed276a8..cd54b93f2a 100755 --- a/basis/unicode/data/data.factor +++ b/basis/unicode/data/data.factor @@ -164,18 +164,16 @@ C: <code-point> code-point [ [ set-code-point ] each ] H{ } make-assoc ; load-data { - [ process-names \ name-map set-value ] - [ 13 swap process-data \ simple-lower set-value ] - [ 12 swap process-data \ simple-upper set-value ] - [ 14 swap process-data - simple-upper assoc-union \ simple-title set-value ] - [ process-combining \ class-map set-value ] - [ process-canonical \ canonical-map set-value - \ combine-map set-value ] - [ process-compatibility \ compatibility-map set-value ] - [ process-category \ category-map set-value ] + [ process-names to: name-map ] + [ 13 swap process-data to: simple-lower ] + [ 12 swap process-data to: simple-upper ] + [ 14 swap process-data simple-upper assoc-union to: simple-title ] + [ process-combining to: class-map ] + [ process-canonical to: canonical-map to: combine-map ] + [ process-compatibility to: compatibility-map ] + [ process-category to: category-map ] } cleave -load-special-casing \ special-casing set-value +load-special-casing to: special-casing -load-properties \ properties set-value +load-properties to: properties diff --git a/basis/unicode/script/script.factor b/basis/unicode/script/script.factor index aa9ca843bd..103beb4d2a 100755 --- a/basis/unicode/script/script.factor +++ b/basis/unicode/script/script.factor @@ -32,7 +32,7 @@ SYMBOL: interned : process-script ( ranges -- ) dup values prune >symbols interned [ - expand-ranges \ script-table set-value + expand-ranges to: script-table ] with-variable ; : load-script ( -- ) diff --git a/basis/values/values-docs.factor b/basis/values/values-docs.factor index 4984b03f03..c96ea0f8cf 100755 --- a/basis/values/values-docs.factor +++ b/basis/values/values-docs.factor @@ -7,6 +7,7 @@ ARTICLE: "values" "Global values" "To get the value, just call the word. The following words manipulate values:" { $subsection get-value } { $subsection set-value } +{ $subsection POSTPONE: to: } { $subsection change-value } ; HELP: VALUE: @@ -20,8 +21,19 @@ HELP: get-value HELP: set-value { $values { "value" "a new value" } { "word" "a value word" } } -{ $description "Sets the value word." } ; +{ $description "Sets a value word." } ; + +HELP: to: +{ $syntax "... to: value" } +{ $values { "word" "a value word" } } +{ $description "Sets a value word." } +{ $notes + "Note that" + { $code "foo to: value" } + "is just sugar for" + { $code "foo \\ value set-value" } +} ; HELP: change-value -{ $values { "word" "a value word" } { "quot" "a quotation ( oldvalue -- newvalue )" } } +{ $values { "word" "a value word" } { "quot" "a quotation with stack effect " { $snippet "( oldvalue -- newvalue )" } } } { $description "Changes the value using the given quotation." } ; diff --git a/basis/values/values-tests.factor b/basis/values/values-tests.factor index 31b44be99e..6ad5e7dee6 100755 --- a/basis/values/values-tests.factor +++ b/basis/values/values-tests.factor @@ -3,7 +3,7 @@ IN: values.tests VALUE: foo [ f ] [ foo ] unit-test -[ ] [ 3 \ foo set-value ] unit-test +[ ] [ 3 to: foo ] unit-test [ 3 ] [ foo ] unit-test [ ] [ \ foo [ 1+ ] change-value ] unit-test [ 4 ] [ foo ] unit-test diff --git a/basis/values/values.factor b/basis/values/values.factor index 7f19898b18..0dd1058370 100755 --- a/basis/values/values.factor +++ b/basis/values/values.factor @@ -1,15 +1,42 @@ -USING: accessors kernel parser sequences words effects ; +! Copyright (C) 2008 Daniel Ehrenberg. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors kernel parser words sequences quotations ; IN: values +! Mutating literals in word definitions is not really allowed, +! and the deploy tool takes advantage of this fact to perform +! some aggressive stripping and compression. However, this +! breaks a naive implementation of values. We need to do two +! things: +! 1) Store the value in a subclass of identity-tuple, so that +! two quotations from different value words are never equal. +! This avoids bogus merging of values. +! 2) Set the "no-def-strip" word-prop, so that the shaker leaves +! the def>> slot alone, allowing us to introspect it. Otherwise, +! it will get set to [ ] and we would lose access to the +! value-holder. + +<PRIVATE + +TUPLE: value-holder < identity-tuple obj ; + +PRIVATE> + : VALUE: - CREATE-WORD { f } clone [ first ] curry + CREATE-WORD + dup t "no-def-strip" set-word-prop + T{ value-holder } clone [ obj>> ] curry (( -- value )) define-declared ; parsing : set-value ( value word -- ) - def>> first set-first ; + def>> first (>>obj) ; + +: to: + scan-word literalize parsed + \ set-value parsed ; parsing : get-value ( word -- value ) - def>> first first ; + def>> first obj>> ; : change-value ( word quot -- ) - over >r >r get-value r> call r> set-value ; inline + [ [ get-value ] dip call ] [ drop ] 2bi set-value ; inline diff --git a/core/math/parser/parser.factor b/core/math/parser/parser.factor index 04d8fb6a41..a126bbea8e 100755 --- a/core/math/parser/parser.factor +++ b/core/math/parser/parser.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2004, 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: kernel math.private namespaces make sequences strings -arrays combinators splitting math assocs ; +USING: kernel math.private namespaces sequences strings +arrays combinators splitting math assocs make ; IN: math.parser : digit> ( ch -- n ) @@ -94,10 +94,10 @@ PRIVATE> : >digit ( n -- ch ) dup 10 < [ CHAR: 0 + ] [ 10 - CHAR: a + ] if ; -: integer, ( num radix -- ) +: positive>base ( num radix -- str ) dup 1 <= [ "Invalid radix" throw ] when - [ /mod >digit , ] keep over 0 > - [ integer, ] [ 2drop ] if ; + [ dup 0 > ] swap [ /mod >digit ] curry [ ] "" produce-as nip + dup reverse-here ; inline PRIVATE> @@ -110,24 +110,27 @@ GENERIC# >base 1 ( n radix -- str ) PRIVATE> M: integer >base - [ - over 0 < [ - swap neg swap integer, CHAR: - , + over 0 = [ + 2drop "0" + ] [ + over 0 > [ + positive>base ] [ - integer, + [ neg ] dip positive>base CHAR: - prefix ] if - ] "" make reverse ; + ] if ; M: ratio >base [ + dup 0 < negative? set + 1 /mod + [ dup zero? [ drop "" ] [ (>base) sign append ] if ] [ - dup 0 < dup negative? set [ "-" % neg ] when - 1 /mod - >r dup zero? [ drop ] [ (>base) % sign % ] if r> - dup numerator (>base) % - "/" % - denominator (>base) % - ] "" make + [ numerator (>base) ] + [ denominator (>base) ] bi + "/" swap 3append + ] bi* append + negative? get [ CHAR: - prefix ] when ] with-radix ; : fix-float ( str -- newstr ) diff --git a/core/sequences/sequences.factor b/core/sequences/sequences.factor index 376133b02d..267238a502 100755 --- a/core/sequences/sequences.factor +++ b/core/sequences/sequences.factor @@ -454,8 +454,11 @@ PRIVATE> : accumulator ( quot -- quot' vec ) V{ } clone [ [ push ] curry compose ] keep ; inline +: produce-as ( pred quot tail exemplar -- seq ) + >r swap accumulator >r swap while r> r> like ; inline + : produce ( pred quot tail -- seq ) - swap accumulator >r swap while r> { } like ; inline + { } produce-as ; inline : follow ( obj quot -- seq ) >r [ dup ] r> [ keep ] curry [ ] produce nip ; inline