From 86a1b06034069e7b9506040239a19740864a20fa Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Sun, 24 May 2009 15:45:25 -0500 Subject: [PATCH 01/24] add a mode word --- basis/math/statistics/statistics-tests.factor | 3 +++ basis/math/statistics/statistics.factor | 9 ++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/basis/math/statistics/statistics-tests.factor b/basis/math/statistics/statistics-tests.factor index c160d57db7..32ebcbc6a1 100644 --- a/basis/math/statistics/statistics-tests.factor +++ b/basis/math/statistics/statistics-tests.factor @@ -13,6 +13,9 @@ IN: math.statistics.tests [ 2 ] [ { 1 2 3 } median ] unit-test [ 5/2 ] [ { 1 2 3 4 } median ] unit-test +[ 1 ] [ { 1 } mode ] unit-test +[ 3 ] [ { 1 2 3 3 3 4 5 6 76 7 2 21 1 3 3 3 } mode ] unit-test + [ { } median ] must-fail [ { } upper-median ] must-fail [ { } lower-median ] must-fail diff --git a/basis/math/statistics/statistics.factor b/basis/math/statistics/statistics.factor index 3812e79ec5..a1a214b2c0 100644 --- a/basis/math/statistics/statistics.factor +++ b/basis/math/statistics/statistics.factor @@ -2,7 +2,7 @@ ! See http://factorcode.org/license.txt for BSD license. USING: arrays combinators kernel math math.analysis math.functions math.order sequences sorting locals -sequences.private ; +sequences.private assocs fry ; IN: math.statistics : mean ( seq -- x ) @@ -56,6 +56,13 @@ IN: math.statistics : median ( seq -- x ) dup length odd? [ lower-median ] [ medians + 2 / ] if ; +: frequency ( seq -- hashtable ) + H{ } clone [ '[ _ inc-at ] each ] keep ; + +: mode ( seq -- x ) + frequency >alist + [ ] [ [ [ second ] bi@ > ] 2keep ? ] map-reduce first ; + : minmax ( seq -- min max ) #! find the min and max of a seq in one pass [ 1/0. -1/0. ] dip [ [ min ] [ max ] bi-curry bi* ] each ; From a54c78007b97ced66265165dd2203adfc9a533c3 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Sun, 24 May 2009 21:35:50 -0500 Subject: [PATCH 02/24] add a clamp word to math.order, use clamp word throughout libraries --- basis/compiler/tree/propagation/propagation-tests.factor | 6 +++--- basis/math/functions/functions-docs.factor | 3 ++- basis/math/ranges/ranges.factor | 6 +++++- basis/models/models.factor | 3 +-- core/math/order/order-docs.factor | 5 +++++ core/math/order/order-tests.factor | 3 +++ core/math/order/order.factor | 1 + extra/math/compare/compare-tests.factor | 5 ----- extra/math/compare/compare.factor | 3 --- extra/terrain/terrain.factor | 2 +- 10 files changed, 21 insertions(+), 16 deletions(-) diff --git a/basis/compiler/tree/propagation/propagation-tests.factor b/basis/compiler/tree/propagation/propagation-tests.factor index aba8dc9eda..9cb0e41291 100644 --- a/basis/compiler/tree/propagation/propagation-tests.factor +++ b/basis/compiler/tree/propagation/propagation-tests.factor @@ -197,7 +197,7 @@ IN: compiler.tree.propagation.tests { fixnum byte-array } declare [ nth-unsafe ] 2keep [ nth-unsafe ] 2keep nth-unsafe [ [ 298 * ] dip 100 * - ] dip 208 * - 128 + -8 shift - 255 min 0 max + 0 255 clamp ] final-classes ] unit-test @@ -210,7 +210,7 @@ IN: compiler.tree.propagation.tests ] unit-test [ V{ 1.5 } ] [ - [ /f 1.5 min 1.5 max ] final-literals + [ /f 1.5 1.5 clamp ] final-literals ] unit-test [ V{ 1.5 } ] [ @@ -693,4 +693,4 @@ TUPLE: circle me ; [ ] [ circle new dup >>me 1quotation final-info drop ] unit-test ! Joe found an oversight -[ V{ integer } ] [ [ >integer ] final-classes ] unit-test \ No newline at end of file +[ V{ integer } ] [ [ >integer ] final-classes ] unit-test diff --git a/basis/math/functions/functions-docs.factor b/basis/math/functions/functions-docs.factor index 48da8aa6ec..41800e46da 100644 --- a/basis/math/functions/functions-docs.factor +++ b/basis/math/functions/functions-docs.factor @@ -23,9 +23,10 @@ ARTICLE: "arithmetic-functions" "Arithmetic functions" "Incrementing, decrementing:" { $subsection 1+ } { $subsection 1- } -"Minimum, maximum:" +"Minimum, maximum, clamping:" { $subsection min } { $subsection max } +{ $subsection clamp } "Complex conjugation:" { $subsection conjugate } "Tests:" diff --git a/basis/math/ranges/ranges.factor b/basis/math/ranges/ranges.factor index 883be006dc..d0c918458a 100644 --- a/basis/math/ranges/ranges.factor +++ b/basis/math/ranges/ranges.factor @@ -26,12 +26,16 @@ M: range hashcode* tuple-hashcode ; INSTANCE: range immutable-sequence + -1 1 ? ; inline : (a, ( a b step -- a' b' step ) dup [ + ] curry 2dip ; inline : ,b) ( a b step -- a' b' step ) dup [ - ] curry dip ; inline +PRIVATE> + : [a,b] ( a b -- range ) twiddle ; inline : (a,b] ( a b -- range ) twiddle (a, ; inline @@ -62,7 +66,7 @@ INSTANCE: range immutable-sequence dup range-decreasing? first-or-peek ; : clamp-to-range ( n range -- n ) - [ range-min max ] [ range-max min ] bi ; + [ range-min ] [ range-max ] bi clamp ; : sequence-index-range ( seq -- range ) length [0,b) ; diff --git a/basis/models/models.factor b/basis/models/models.factor index 4f7aafe3e3..19b478eaf9 100644 --- a/basis/models/models.factor +++ b/basis/models/models.factor @@ -109,5 +109,4 @@ GENERIC: set-range-min-value ( value model -- ) GENERIC: set-range-max-value ( value model -- ) : clamp-value ( value range -- newvalue ) - [ range-min-value max ] keep - range-max-value* min ; + [ range-min-value ] [ range-max-value* ] bi clamp ; diff --git a/core/math/order/order-docs.factor b/core/math/order/order-docs.factor index 8b2200aa67..368d060eb9 100644 --- a/core/math/order/order-docs.factor +++ b/core/math/order/order-docs.factor @@ -51,6 +51,10 @@ HELP: min { $values { "x" real } { "y" real } { "z" real } } { $description "Outputs the smallest of two real numbers." } ; +HELP: clamp +{ $values { "x" real } { "min" real } { "max" real } { "y" real } } +{ $description "Outputs " { $snippet "x" } " if contained in the interval " { $snippet "[min,max]" } " or outputs one of the endpoints." } ; + HELP: between? { $values { "x" real } { "y" real } { "z" real } { "?" "a boolean" } } { $description "Tests if " { $snippet "x" } " is in the interval " { $snippet "[y,z]" } "." } @@ -105,6 +109,7 @@ ARTICLE: "math.order" "Linear order protocol" { $subsection "order-specifiers" } "Utilities for comparing objects:" { $subsection after? } +{ $subsection after? } { $subsection before? } { $subsection after=? } { $subsection before=? } diff --git a/core/math/order/order-tests.factor b/core/math/order/order-tests.factor index 665537be5d..edd50d3f55 100644 --- a/core/math/order/order-tests.factor +++ b/core/math/order/order-tests.factor @@ -7,3 +7,6 @@ IN: math.order.tests [ +eq+ ] [ 4 4 <=> ] unit-test [ +gt+ ] [ 4 3 <=> ] unit-test +[ 20 ] [ 20 0 100 clamp ] unit-test +[ 0 ] [ -20 0 100 clamp ] unit-test +[ 100 ] [ 120 0 100 clamp ] unit-test diff --git a/core/math/order/order.factor b/core/math/order/order.factor index a06209bf63..435eec9b96 100644 --- a/core/math/order/order.factor +++ b/core/math/order/order.factor @@ -34,6 +34,7 @@ M: real after=? ( obj1 obj2 -- ? ) >= ; : min ( x y -- z ) [ before? ] most ; inline : max ( x y -- z ) [ after? ] most ; inline +: clamp ( x min max -- y ) [ max ] dip min ; inline : between? ( x y z -- ? ) pick after=? [ after=? ] [ 2drop f ] if ; inline diff --git a/extra/math/compare/compare-tests.factor b/extra/math/compare/compare-tests.factor index 272471fe5d..5b30af0e63 100644 --- a/extra/math/compare/compare-tests.factor +++ b/extra/math/compare/compare-tests.factor @@ -14,8 +14,3 @@ IN: math.compare.tests [ 0 ] [ 1 3 negmin ] unit-test [ -3 ] [ 1 -3 negmin ] unit-test [ -1 ] [ -1 3 negmin ] unit-test - -[ 0 ] [ 0 -1 2 clamp ] unit-test -[ 1 ] [ 0 1 2 clamp ] unit-test -[ 2 ] [ 0 3 2 clamp ] unit-test - diff --git a/extra/math/compare/compare.factor b/extra/math/compare/compare.factor index 826f0ecf16..b48641d723 100644 --- a/extra/math/compare/compare.factor +++ b/extra/math/compare/compare.factor @@ -14,6 +14,3 @@ IN: math.compare : negmin ( a b -- x ) 0 min min ; - -: clamp ( a value b -- x ) - min max ; diff --git a/extra/terrain/terrain.factor b/extra/terrain/terrain.factor index 5847426fae..42aa7e903a 100644 --- a/extra/terrain/terrain.factor +++ b/extra/terrain/terrain.factor @@ -88,7 +88,7 @@ M: terrain-world tick-length yaw>> 0.0 ${ MOVEMENT-SPEED 0.0 0.0 } eye-rotate ; : clamp-pitch ( pitch -- pitch' ) - 90.0 min -90.0 max ; + -90.0 90.0 clamp ; : walk-forward ( player -- ) dup forward-vector [ v+ ] curry change-velocity drop ; From 5a3a14d1c908a27f060d484d6f127892d69806e9 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Sun, 24 May 2009 21:46:59 -0500 Subject: [PATCH 03/24] remove at-default. it was hardly used and it's just '?at drop' --- basis/core-text/fonts/fonts.factor | 2 +- basis/unicode/data/data.factor | 6 +++--- basis/windows/fonts/fonts.factor | 2 +- core/assocs/assocs-docs.factor | 3 ++- core/assocs/assocs-tests.factor | 12 ------------ core/assocs/assocs.factor | 3 --- misc/vim/syntax/factor.vim | 2 +- 7 files changed, 8 insertions(+), 22 deletions(-) diff --git a/basis/core-text/fonts/fonts.factor b/basis/core-text/fonts/fonts.factor index 4525509d44..2656811c1f 100644 --- a/basis/core-text/fonts/fonts.factor +++ b/basis/core-text/fonts/fonts.factor @@ -82,7 +82,7 @@ CONSTANT: font-names } : font-name ( string -- string' ) - font-names at-default ; + font-names ?at drop ; : (bold) ( x -- y ) kCTFontBoldTrait bitor ; inline diff --git a/basis/unicode/data/data.factor b/basis/unicode/data/data.factor index 318a56627b..1c6c6afdf3 100644 --- a/basis/unicode/data/data.factor +++ b/basis/unicode/data/data.factor @@ -33,9 +33,9 @@ VALUE: name-map : name>char ( name -- char ) name-map at ; inline : char>name ( char -- name ) name-map value-at ; inline : property? ( char property -- ? ) properties at interval-key? ; inline -: ch>lower ( ch -- lower ) simple-lower at-default ; inline -: ch>upper ( ch -- upper ) simple-upper at-default ; inline -: ch>title ( ch -- title ) simple-title at-default ; inline +: ch>lower ( ch -- lower ) simple-lower ?at drop ; inline +: ch>upper ( ch -- upper ) simple-upper ?at drop ; inline +: ch>title ( ch -- title ) simple-title ?at drop ; inline : special-case ( ch -- casing-tuple ) special-casing at ; inline ! For non-existent characters, use Cn diff --git a/basis/windows/fonts/fonts.factor b/basis/windows/fonts/fonts.factor index 1753ff1ce1..269e8f8f48 100755 --- a/basis/windows/fonts/fonts.factor +++ b/basis/windows/fonts/fonts.factor @@ -7,7 +7,7 @@ IN: windows.fonts { "sans-serif" "Tahoma" } { "serif" "Times New Roman" } { "monospace" "Courier New" } - } at-default ; + } ?at drop ; MEMO:: (cache-font) ( font -- HFONT ) font size>> neg ! nHeight diff --git a/core/assocs/assocs-docs.factor b/core/assocs/assocs-docs.factor index e56fedbd26..f971b8971b 100755 --- a/core/assocs/assocs-docs.factor +++ b/core/assocs/assocs-docs.factor @@ -66,7 +66,7 @@ ARTICLE: "assocs-lookup" "Lookup and querying of assocs" { $see-also at* assoc-size } ; ARTICLE: "assocs-values" "Transposed assoc operations" -"Most assoc words take a key and find the corresponding value. The following words take a value and find the corresponding key:" +"default Most assoc words take a key and find the corresponding value. The following words take a value and find the corresponding key:" { $subsection value-at } { $subsection value-at* } { $subsection value? } @@ -119,6 +119,7 @@ $nl { $subsection assoc-any? } { $subsection assoc-all? } "Additional combinators:" +{ $subsection assoc-partition } { $subsection cache } { $subsection map>assoc } { $subsection assoc>map } diff --git a/core/assocs/assocs-tests.factor b/core/assocs/assocs-tests.factor index fc74df6d45..c473ac0dfa 100644 --- a/core/assocs/assocs-tests.factor +++ b/core/assocs/assocs-tests.factor @@ -119,18 +119,6 @@ unit-test } extract-keys ] unit-test -[ f ] [ - "a" H{ { "a" f } } at-default -] unit-test - -[ "b" ] [ - "b" H{ { "a" f } } at-default -] unit-test - -[ "x" ] [ - "a" H{ { "a" "x" } } at-default -] unit-test - [ H{ { "b" [ 2 ] } { "d" [ 4 ] } } H{ { "a" [ 1 ] } { "c" [ 3 ] } } ] [ H{ { "a" [ 1 ] } diff --git a/core/assocs/assocs.factor b/core/assocs/assocs.factor index e783ef81c4..d655b99c30 100755 --- a/core/assocs/assocs.factor +++ b/core/assocs/assocs.factor @@ -82,9 +82,6 @@ PRIVATE> : at ( key assoc -- value/f ) at* drop ; inline -: at-default ( key assoc -- value/key ) - ?at drop ; inline - M: assoc assoc-clone-like ( assoc exemplar -- newassoc ) [ dup assoc-size ] dip new-assoc [ [ set-at ] with-assoc assoc-each ] keep ; diff --git a/misc/vim/syntax/factor.vim b/misc/vim/syntax/factor.vim index 86f4f19147..8da50017c8 100755 --- a/misc/vim/syntax/factor.vim +++ b/misc/vim/syntax/factor.vim @@ -47,7 +47,7 @@ syn keyword factorBoolean boolean f general-t t syn keyword factorCompileDirective inline foldable parsing syn keyword factorKeyword or tuck 2bi 2tri while wrapper nip 4dip wrapper? bi* callstack>array both? hashcode die dupd callstack callstack? 3dup tri@ pick curry build ?execute 3bi prepose >boolean ?if clone eq? tri* ? = swapd call-clear 2over 2keep 3keep clear 2dup when not tuple? dup 2bi* 2tri* call tri-curry object bi@ do unless* if* loop bi-curry* drop when* assert= retainstack assert? -rot execute 2bi@ 2tri@ boa with either? 3drop bi curry? datastack until 3dip over 3curry roll tri-curry* swap tri-curry@ 2nip and throw set-retainstack bi-curry (clone) hashcode* compose spin 2dip if 3tri unless compose? tuple keep 2curry equal? set-datastack assert tri 2drop most boolean? identity-tuple? null new set-callstack dip bi-curry@ rot -roll xor identity-tuple boolean -syn keyword factorKeyword ?at assoc? assoc-clone-like assoc= delete-at* assoc-partition extract-keys new-assoc value? assoc-size map>assoc push-at assoc-like key? assoc-intersect update assoc-union assoc-combine at* assoc-empty? at+ set-at assoc-all? assoc-subset? assoc-hashcode change-at assoc-each assoc-diff zip values value-at rename-at inc-at enum? at cache assoc>map assoc assoc-map enum value-at* remove-all assoc-map-as >alist assoc-filter-as substitute-here clear-assoc assoc-stack substitute assoc-filter 2cache delete-at assoc-find keys assoc-any? at-default unzip +syn keyword factorKeyword ?at assoc? assoc-clone-like assoc= delete-at* assoc-partition extract-keys new-assoc value? assoc-size map>assoc push-at assoc-like key? assoc-intersect update assoc-union assoc-combine at* assoc-empty? at+ set-at assoc-all? assoc-subset? assoc-hashcode change-at assoc-each assoc-diff zip values value-at rename-at inc-at enum? at cache assoc>map assoc assoc-map enum value-at* remove-all assoc-map-as >alist assoc-filter-as substitute-here clear-assoc assoc-stack substitute assoc-filter 2cache delete-at assoc-find keys assoc-any? unzip syn keyword factorKeyword case execute-effect dispatch-case-quot no-cond no-case? 3cleave>quot contiguous-range? 2cleave cond>quot wrong-values? no-cond? cleave>quot no-case hash-dispatch-quot case>quot 3cleave wrong-values alist>quot hash-case-table hash-case-quot case-find (distribute-buckets) cond cleave distribute-buckets call-effect 2cleave>quot recursive-hashcode linear-case-quot spread spread>quot syn keyword factorKeyword byte-array>bignum sgn >bignum next-float number= each-integer next-power-of-2 ?1+ fp-special? imaginary-part mod recip float>bits rational >float number? 2^ bignum? integer fixnum? neg fixnum sq bignum fp-snan? fp-infinity? denominator (all-integers?) times find-last-integer (each-integer) bit? * + fp-bitwise= - fp-qnan? / power-of-2? >= bitand find-integer complex < log2 > integer? real number bits>double double>bits bitor 2/ zero? rem fp-nan-payload all-integers? (find-integer) real-part prev-float align bits>float float? shift float 1+ 1- fp-nan? abs bitxor ratio? even? <= /mod odd? >integer ratio rational? bitnot real? >fixnum complex? /i numerator /f syn keyword factorKeyword append assert-sequence= find-last-from trim-head-slice clone-like 3sequence assert-sequence? map-as filter-here last-index-from prepare-index reversed index-from cut* pad-tail (indices) concat-as remq but-last snip trim-tail nths nth 2pusher sequence slice? partition remove-nth tail-slice empty? tail* if-empty find-from virtual-sequence? member? set-length delq drop-prefix unclip iota unclip-last-slice bounds-error? sequence-hashcode-step map start midpoint@ rest-slice prepend fourth sift delete sigma new-sequence follow like delete-nth first4 1sequence reverse slice unless-empty padding virtual@ repetition? index 4sequence max-length set-second immutable-sequence first2 first3 replicate-as reduce-index unclip-slice supremum insert-nth trim-tail-slice tail 3append short count suffix concat flip filter sum immutable? 2sequence delete-all start* indices snip-slice check-slice sequence? head map-find reduce append-as reverse-here sequence= halves collapse-slice interleave 2map binary-reduce virtual-seq slice-error? product bounds-check? bounds-check harvest immutable find produce remove pad-head replicate set-fourth peek shorten reversed? map-find-last 3map-as 2unclip-slice shorter? 3map find-last head-slice pop* 2map-as tail-slice* but-last-slice 2map-reduce iota? accumulate each pusher cut-slice new-resizable each-index head-slice* 2reverse-each sequence-hashcode memq? pop set-nth ?nth second change-each join when-empty accumulator immutable-sequence? all? 3append-as virtual-sequence subseq? push-either new-like length last-index push-if 2all? lengthen assert-sequence copy map-reduce move third first 3each tail? set-first prefix bounds-error any? trim-slice exchange surround 2reduce cut change-nth min-length set-third produce-as push-all head? delete-slice rest sum-lengths 2each head* infimum glue slice-error subseq replace-slice push repetition map-index trim-head unclip-last mismatch trim From e38e85ce5e0e812790ce918daabbbb6807132db1 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Mon, 25 May 2009 11:03:40 -0500 Subject: [PATCH 04/24] document 2cache --- core/assocs/assocs-docs.factor | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/core/assocs/assocs-docs.factor b/core/assocs/assocs-docs.factor index f971b8971b..12e895591c 100755 --- a/core/assocs/assocs-docs.factor +++ b/core/assocs/assocs-docs.factor @@ -121,6 +121,7 @@ $nl "Additional combinators:" { $subsection assoc-partition } { $subsection cache } +{ $subsection 2cache } { $subsection map>assoc } { $subsection assoc>map } { $subsection assoc-map-as } ; @@ -237,6 +238,13 @@ HELP: assoc-filter-as { assoc-filter assoc-filter-as } related-words +HELP: assoc-partition +{ $values + { "assoc" assoc } { "quot" quotation } + { "true-assoc" assoc } { "false-assoc" assoc } +} +{ $description "Calls a predicate quotation on each key of the input assoc. If the test yields true, the key/value pair is added to " { $snippet "true-assoc" } "; if false, it's added to " { $snippet "false-assoc" } "." } ; + HELP: assoc-any? { $values { "assoc" assoc } { "quot" { $quotation "( key value -- ? )" } } { "?" "a boolean" } } { $description "Tests if the assoc contains an entry satisfying a predicate by applying the quotation to each entry in turn. Iteration stops if an entry is found for which the quotation outputs a true value." } ; @@ -332,7 +340,12 @@ HELP: substitute HELP: cache { $values { "key" "a key" } { "assoc" assoc } { "quot" { $quotation "( key -- value )" } } { "value" "a previously-retained or freshly-computed value" } } -{ $description "If the key is present in the assoc, outputs the associated value, otherwise calls the quotation to produce a value and stores the key/value pair into the assoc." } +{ $description "If the key is present in the assoc, outputs the associated value, otherwise calls the quotation to produce a value and stores the key/value pair into the assoc. Returns a value either looked up or newly stored in the assoc." } +{ $side-effects "assoc" } ; + +HELP: 2cache +{ $values { "key1" "a key" } { "key2" "a key" } { "assoc" assoc } { "quot" { $quotation "( key -- value )" } } { "value" "a previously-retained or freshly-computed value" } } +{ $description "If a single key composed of the input keys is present in the assoc, outputs the associated value, otherwise calls the quotation to produce a value and stores the keys/value pair into the assoc. Returns the value stored in the assoc. Returns a value either looked up or newly stored in the assoc." } { $side-effects "assoc" } ; HELP: map>assoc From 6fa90432060479f4f4cb04558922b8b2ca088375 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Mon, 25 May 2009 13:58:06 -0500 Subject: [PATCH 05/24] remove clamp from docs --- extra/math/compare/compare-docs.factor | 5 ----- 1 file changed, 5 deletions(-) diff --git a/extra/math/compare/compare-docs.factor b/extra/math/compare/compare-docs.factor index 6c20db10fd..27e68081a6 100644 --- a/extra/math/compare/compare-docs.factor +++ b/extra/math/compare/compare-docs.factor @@ -16,8 +16,3 @@ HELP: posmax HELP: negmin { $values { "a" number } { "b" number } { "x" number } } { $description "Returns the most-negative value, or zero if both are positive." } ; - -HELP: clamp -{ $values { "a" number } { "value" number } { "b" number } { "x" number } } -{ $description "Returns the value when between " { $snippet "a" } " and " { $snippet "b" } ", " { $snippet "a" } " if <= " { $snippet "a" } ", or " { $snippet "b" } " if >= " { $snippet "b" } "." } ; - From 95837d53bc9310204a6dab1db455c9adca67b4a0 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Mon, 25 May 2009 15:18:20 -0500 Subject: [PATCH 06/24] use iota --- basis/tools/hexdump/hexdump-tests.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basis/tools/hexdump/hexdump-tests.factor b/basis/tools/hexdump/hexdump-tests.factor index 1a8ed35510..75537b0c11 100644 --- a/basis/tools/hexdump/hexdump-tests.factor +++ b/basis/tools/hexdump/hexdump-tests.factor @@ -4,7 +4,7 @@ IN: tools.hexdump.tests [ t ] [ B{ } hexdump "Length: 0, 0h\n" = ] unit-test [ t ] [ "abcdefghijklmnopqrstuvwxyz" >byte-array hexdump "Length: 26, 1ah\n00000000h: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 abcdefghijklmnop\n00000010h: 71 72 73 74 75 76 77 78 79 7a qrstuvwxyz\n" = ] unit-test -[ t ] [ 256 [ ] B{ } map-as hexdump "Length: 256, 100h\n00000000h: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ................\n00000010h: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f ................\n00000020h: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f !\"#$%&'()*+,-./\n00000030h: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 0123456789:;<=>?\n00000040h: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f @ABCDEFGHIJKLMNO\n00000050h: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f PQRSTUVWXYZ[\\]^_\n00000060h: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f `abcdefghijklmno\n00000070h: 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f pqrstuvwxyz{|}~.\n00000080h: 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f ................\n00000090h: 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f ................\n000000a0h: a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af ................\n000000b0h: b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf ................\n000000c0h: c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf ................\n000000d0h: d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df ................\n000000e0h: e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef ................\n000000f0h: f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff ................\n" = ] unit-test +[ t ] [ 256 iota [ ] B{ } map-as hexdump "Length: 256, 100h\n00000000h: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ................\n00000010h: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f ................\n00000020h: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f !\"#$%&'()*+,-./\n00000030h: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 0123456789:;<=>?\n00000040h: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f @ABCDEFGHIJKLMNO\n00000050h: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f PQRSTUVWXYZ[\\]^_\n00000060h: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f `abcdefghijklmno\n00000070h: 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f pqrstuvwxyz{|}~.\n00000080h: 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f ................\n00000090h: 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f ................\n000000a0h: a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af ................\n000000b0h: b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf ................\n000000c0h: c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf ................\n000000d0h: d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df ................\n000000e0h: e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef ................\n000000f0h: f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff ................\n" = ] unit-test [ From 3722c0ad62c8260e4e592b70d8c399c11f63fbf4 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Mon, 25 May 2009 15:35:50 -0500 Subject: [PATCH 07/24] move some words to private vocabs --- basis/hints/hints.factor | 10 +++++----- core/combinators/combinators-tests.factor | 2 +- core/combinators/combinators.factor | 5 ++++- core/splitting/splitting.factor | 4 ++++ 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/basis/hints/hints.factor b/basis/hints/hints.factor index db04033275..7624cb1517 100644 --- a/basis/hints/hints.factor +++ b/basis/hints/hints.factor @@ -1,10 +1,10 @@ ! Copyright (C) 2008, 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: parser words definitions kernel sequences assocs arrays -kernel.private fry combinators accessors vectors strings sbufs -byte-arrays byte-vectors io.binary io.streams.string splitting math -math.parser generic generic.single generic.standard classes -hashtables namespaces ; +USING: accessors arrays assocs byte-arrays byte-vectors classes +combinators definitions fry generic generic.single +generic.standard hashtables io.binary io.streams.string kernel +kernel.private math math.parser namespaces parser sbufs +sequences splitting splitting.private strings vectors words ; IN: hints GENERIC: specializer-predicate ( spec -- quot ) diff --git a/core/combinators/combinators-tests.factor b/core/combinators/combinators-tests.factor index aae6618ee8..b239b1eac9 100755 --- a/core/combinators/combinators-tests.factor +++ b/core/combinators/combinators-tests.factor @@ -1,6 +1,6 @@ USING: alien strings kernel math tools.test io prettyprint namespaces combinators words classes sequences accessors -math.functions arrays ; +math.functions arrays combinators.private ; IN: combinators.tests [ 3 ] [ 1 2 [ + ] call( x y -- z ) ] unit-test diff --git a/core/combinators/combinators.factor b/core/combinators/combinators.factor index 7bf76fea30..f293030f25 100755 --- a/core/combinators/combinators.factor +++ b/core/combinators/combinators.factor @@ -101,6 +101,8 @@ ERROR: no-case object ; [ \ drop prefix ] bi* ] assoc-map alist>quot ; + + : case>quot ( default assoc -- quot ) dup keys { { [ dup empty? ] [ 2drop ] } @@ -160,7 +164,6 @@ ERROR: no-case object ; [ drop linear-case-quot ] } cond ; -! recursive-hashcode : recursive-hashcode ( n obj quot -- code ) pick 0 <= [ 3drop 0 ] [ [ 1 - ] 2dip call ] if ; inline diff --git a/core/splitting/splitting.factor b/core/splitting/splitting.factor index c55a75baa6..04b3e53422 100644 --- a/core/splitting/splitting.factor +++ b/core/splitting/splitting.factor @@ -53,6 +53,8 @@ PRIVATE> [ ] bi@ split1-slice [ ] bi@ [ f ] [ swap ] if-empty ; + : split, ( seq separators -- ) 0 rot (split) ; +PRIVATE> + : split ( seq separators -- pieces ) [ split, ] { } make ; From 0ac80c6917da99a59431493cf8f3c3264df7b1df Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Mon, 25 May 2009 15:42:59 -0500 Subject: [PATCH 08/24] fix using --- core/generic/single/single.factor | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/generic/single/single.factor b/core/generic/single/single.factor index 747963256d..8a2243c264 100644 --- a/core/generic/single/single.factor +++ b/core/generic/single/single.factor @@ -3,7 +3,8 @@ USING: accessors arrays assocs classes classes.algebra combinators definitions generic hashtables kernel kernel.private layouts math namespaces quotations -sequences words generic.single.private effects make ; +sequences words generic.single.private effects make +combinators.private ; IN: generic.single ERROR: no-method object generic ; From 407377fc985faf7e3bc12b906053eee79d8fb5f5 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Mon, 25 May 2009 16:38:33 -0500 Subject: [PATCH 09/24] rename peek -> last and update all usages --- basis/bootstrap/compiler/compiler.factor | 2 +- basis/circular/circular.factor | 4 ++-- basis/compiler/cfg/alias-analysis/alias-analysis.factor | 2 +- basis/compiler/cfg/intrinsics/allot/allot.factor | 2 +- basis/compiler/cfg/iterator/iterator.factor | 2 +- basis/compiler/cfg/linear-scan/debugger/debugger.factor | 2 +- basis/compiler/cfg/linear-scan/linear-scan-tests.factor | 2 +- basis/compiler/cfg/useless-blocks/useless-blocks.factor | 2 +- basis/compiler/tree/dead-code/branches/branches.factor | 2 +- basis/compiler/tree/debugger/debugger.factor | 2 +- .../tree/propagation/constraints/constraints.factor | 2 +- basis/compiler/tree/propagation/info/info.factor | 8 ++++---- basis/compiler/tree/tree.factor | 2 +- basis/csv/csv.factor | 2 +- basis/documents/documents-tests.factor | 4 ++-- basis/documents/documents.factor | 4 ++-- basis/farkup/farkup.factor | 8 ++++---- basis/generalizations/generalizations.factor | 2 +- basis/heaps/heaps.factor | 2 +- basis/help/lint/checks/checks.factor | 2 +- basis/hints/hints.factor | 2 +- basis/http/parsers/parsers.factor | 2 +- basis/inspector/inspector.factor | 2 +- basis/inverse/inverse.factor | 2 +- basis/lcs/lcs.factor | 2 +- basis/logging/parser/parser.factor | 2 +- basis/math/bits/bits-tests.factor | 6 +++--- basis/math/polynomials/polynomials.factor | 2 +- basis/math/ranges/ranges.factor | 8 ++++---- basis/peg/ebnf/ebnf.factor | 2 +- basis/persistent/vectors/vectors.factor | 6 +++--- basis/porter-stemmer/porter-stemmer.factor | 8 ++++---- basis/prettyprint/sections/sections.factor | 8 ++++---- basis/quoted-printable/quoted-printable-tests.factor | 2 +- basis/quoting/quoting.factor | 4 ++-- basis/splitting/monotonic/monotonic.factor | 4 ++-- basis/stack-checker/transforms/transforms.factor | 4 ++-- basis/tools/completion/completion.factor | 4 ++-- basis/ui/backend/cocoa/cocoa.factor | 2 +- basis/unicode/case/case.factor | 2 +- basis/unicode/collation/collation.factor | 8 ++++---- basis/vlists/vlists-tests.factor | 2 +- basis/xml/xml.factor | 2 +- core/classes/algebra/algebra.factor | 2 +- core/continuations/continuations.factor | 2 +- core/destructors/destructors.factor | 2 +- core/generic/math/math.factor | 2 +- core/generic/single/single.factor | 2 +- core/namespaces/namespaces.factor | 2 +- core/sequences/sequences-docs.factor | 7 +++---- core/sequences/sequences.factor | 6 +++--- core/splitting/splitting.factor | 2 +- core/vectors/vectors-tests.factor | 4 ++-- core/vocabs/loader/loader.factor | 2 +- core/vocabs/parser/parser.factor | 2 +- extra/24-game/24-game.factor | 2 +- extra/animations/animations.factor | 2 +- extra/bson/reader/reader.factor | 4 ++-- extra/dns/dns.factor | 2 +- extra/html/parser/parser.factor | 2 +- extra/irc/messages/messages.factor | 2 +- extra/jamshred/tunnel/tunnel.factor | 2 +- extra/mason/notify/server/server.factor | 2 +- extra/math/vectors/homogeneous/homogeneous.factor | 2 +- extra/project-euler/049/049.factor | 2 +- extra/project-euler/059/059.factor | 2 +- extra/project-euler/116/116.factor | 4 ++-- extra/project-euler/117/117.factor | 2 +- extra/project-euler/164/164.factor | 2 +- 69 files changed, 105 insertions(+), 106 deletions(-) diff --git a/basis/bootstrap/compiler/compiler.factor b/basis/bootstrap/compiler/compiler.factor index 5e3827efea..0505dcb184 100755 --- a/basis/bootstrap/compiler/compiler.factor +++ b/basis/bootstrap/compiler/compiler.factor @@ -69,7 +69,7 @@ nl "." write flush { - new-sequence nth push pop peek flip + new-sequence nth push pop last flip } compile-unoptimized "." write flush diff --git a/basis/circular/circular.factor b/basis/circular/circular.factor index 909b2ed713..ae79e70d73 100644 --- a/basis/circular/circular.factor +++ b/basis/circular/circular.factor @@ -46,13 +46,13 @@ M: growing-circular length length>> ; : full? ( circular -- ? ) [ length ] [ seq>> length ] bi = ; -: set-peek ( elt seq -- ) +: set-last ( elt seq -- ) [ length 1- ] keep set-nth ; PRIVATE> : push-growing-circular ( elt circular -- ) dup full? [ push-circular ] - [ [ 1+ ] change-length set-peek ] if ; + [ [ 1+ ] change-length set-last ] if ; : ( capacity -- growing-circular ) { } new-sequence 0 0 growing-circular boa ; diff --git a/basis/compiler/cfg/alias-analysis/alias-analysis.factor b/basis/compiler/cfg/alias-analysis/alias-analysis.factor index ec8fe62dfb..2a9d2579e3 100644 --- a/basis/compiler/cfg/alias-analysis/alias-analysis.factor +++ b/basis/compiler/cfg/alias-analysis/alias-analysis.factor @@ -165,7 +165,7 @@ SYMBOL: heap-ac : record-constant-set-slot ( slot# vreg -- ) history [ - dup empty? [ dup peek store? [ dup pop* ] when ] unless + dup empty? [ dup last store? [ dup pop* ] when ] unless store new-action swap ?push ] change-at ; diff --git a/basis/compiler/cfg/intrinsics/allot/allot.factor b/basis/compiler/cfg/intrinsics/allot/allot.factor index 938dbbccbf..7b407c3ee4 100644 --- a/basis/compiler/cfg/intrinsics/allot/allot.factor +++ b/basis/compiler/cfg/intrinsics/allot/allot.factor @@ -19,7 +19,7 @@ IN: compiler.cfg.intrinsics.allot [ second ds-load ] [ ^^load-literal ] bi prefix ; : emit- ( node -- ) - dup node-input-infos peek literal>> + dup node-input-infos last literal>> dup array? [ nip ds-drop diff --git a/basis/compiler/cfg/iterator/iterator.factor b/basis/compiler/cfg/iterator/iterator.factor index 3444b517ac..a8958733a7 100644 --- a/basis/compiler/cfg/iterator/iterator.factor +++ b/basis/compiler/cfg/iterator/iterator.factor @@ -7,7 +7,7 @@ SYMBOL: node-stack : >node ( cursor -- ) node-stack get push ; : node> ( -- cursor ) node-stack get pop ; -: node@ ( -- cursor ) node-stack get peek ; +: node@ ( -- cursor ) node-stack get last ; : current-node ( -- node ) node@ first ; : iterate-next ( -- cursor ) node@ rest-slice ; : skip-next ( -- next ) node> rest-slice [ first ] [ >node ] bi ; diff --git a/basis/compiler/cfg/linear-scan/debugger/debugger.factor b/basis/compiler/cfg/linear-scan/debugger/debugger.factor index c6481b305e..dad87b62ae 100644 --- a/basis/compiler/cfg/linear-scan/debugger/debugger.factor +++ b/basis/compiler/cfg/linear-scan/debugger/debugger.factor @@ -23,7 +23,7 @@ IN: compiler.cfg.linear-scan.debugger [ split-children ] map concat check-assigned ; : picture ( uses -- str ) - dup peek 1 + CHAR: space + dup last 1 + CHAR: space [ '[ CHAR: * swap _ set-nth ] each ] keep ; : interval-picture ( interval -- str ) diff --git a/basis/compiler/cfg/linear-scan/linear-scan-tests.factor b/basis/compiler/cfg/linear-scan/linear-scan-tests.factor index 4ddd1fdc0b..65b932c4a2 100644 --- a/basis/compiler/cfg/linear-scan/linear-scan-tests.factor +++ b/basis/compiler/cfg/linear-scan/linear-scan-tests.factor @@ -244,7 +244,7 @@ SYMBOL: max-uses swap int-regs swap vreg boa >>vreg max-uses get random 2 max [ not-taken ] replicate natural-sort [ >>uses ] [ first >>start ] bi - dup uses>> peek >>end + dup uses>> last >>end ] map ] with-scope ; diff --git a/basis/compiler/cfg/useless-blocks/useless-blocks.factor b/basis/compiler/cfg/useless-blocks/useless-blocks.factor index f543aa4036..05cb13748b 100644 --- a/basis/compiler/cfg/useless-blocks/useless-blocks.factor +++ b/basis/compiler/cfg/useless-blocks/useless-blocks.factor @@ -37,7 +37,7 @@ IN: compiler.cfg.useless-blocks : delete-conditional? ( bb -- ? ) dup instructions>> [ drop f ] [ - peek class { + last class { ##compare-branch ##compare-imm-branch ##compare-float-branch diff --git a/basis/compiler/tree/dead-code/branches/branches.factor b/basis/compiler/tree/dead-code/branches/branches.factor index eba82384ab..fd1b2d5adb 100644 --- a/basis/compiler/tree/dead-code/branches/branches.factor +++ b/basis/compiler/tree/dead-code/branches/branches.factor @@ -28,7 +28,7 @@ M: #branch remove-dead-code* : remove-phi-inputs ( #phi -- ) if-node get children>> - [ dup ends-with-terminate? [ drop f ] [ peek out-d>> ] if ] map + [ dup ends-with-terminate? [ drop f ] [ last out-d>> ] if ] map pad-with-bottom >>phi-in-d drop ; : live-value-indices ( values -- indices ) diff --git a/basis/compiler/tree/debugger/debugger.factor b/basis/compiler/tree/debugger/debugger.factor index d1a9f5215a..4fc4f4814b 100644 --- a/basis/compiler/tree/debugger/debugger.factor +++ b/basis/compiler/tree/debugger/debugger.factor @@ -191,7 +191,7 @@ SYMBOL: node-count propagate compute-def-use dup check-nodes - peek node-input-infos ; + last node-input-infos ; : final-classes ( quot -- seq ) final-info [ class>> ] map ; diff --git a/basis/compiler/tree/propagation/constraints/constraints.factor b/basis/compiler/tree/propagation/constraints/constraints.factor index 2652547aad..31f6cea148 100644 --- a/basis/compiler/tree/propagation/constraints/constraints.factor +++ b/basis/compiler/tree/propagation/constraints/constraints.factor @@ -83,7 +83,7 @@ TUPLE: implication p q ; C: --> implication : assume-implication ( p q -- ) - [ constraints get [ assoc-stack swap suffix ] 2keep peek set-at ] + [ constraints get [ assoc-stack swap suffix ] 2keep last set-at ] [ satisfied? [ assume ] [ drop ] if ] 2bi ; M: implication assume* diff --git a/basis/compiler/tree/propagation/info/info.factor b/basis/compiler/tree/propagation/info/info.factor index 4d4b22218d..50762c2b66 100644 --- a/basis/compiler/tree/propagation/info/info.factor +++ b/basis/compiler/tree/propagation/info/info.factor @@ -259,12 +259,12 @@ SYMBOL: value-infos resolve-copy value-infos get assoc-stack null-info or ; : set-value-info ( info value -- ) - resolve-copy value-infos get peek set-at ; + resolve-copy value-infos get last set-at ; : refine-value-info ( info value -- ) resolve-copy value-infos get [ assoc-stack value-info-intersect ] 2keep - peek set-at ; + last set-at ; : value-literal ( value -- obj ? ) value-info >literal< ; @@ -294,10 +294,10 @@ SYMBOL: value-infos dup in-d>> first node-value-info literal>> ; : last-literal ( #call -- obj ) - dup out-d>> peek node-value-info literal>> ; + dup out-d>> last node-value-info literal>> ; : immutable-tuple-boa? ( #call -- ? ) dup word>> \ eq? [ - dup in-d>> peek node-value-info + dup in-d>> last node-value-info literal>> first immutable-tuple-class? ] [ drop f ] if ; diff --git a/basis/compiler/tree/tree.factor b/basis/compiler/tree/tree.factor index 9f9a43df64..c73f2211f0 100644 --- a/basis/compiler/tree/tree.factor +++ b/basis/compiler/tree/tree.factor @@ -169,7 +169,7 @@ M: #return-recursive inputs/outputs [ in-d>> ] [ out-d>> ] bi ; [ label>> calls>> [ in-d>> ] map ] [ in-d>> ] bi suffix ; : ends-with-terminate? ( nodes -- ? ) - [ f ] [ peek #terminate? ] if-empty ; + [ f ] [ last #terminate? ] if-empty ; M: vector child-visitor V{ } clone ; M: vector #introduce, #introduce node, ; diff --git a/basis/csv/csv.factor b/basis/csv/csv.factor index 5902999a76..23416d6912 100755 --- a/basis/csv/csv.factor +++ b/basis/csv/csv.factor @@ -63,7 +63,7 @@ PRIVATE> : csv ( stream -- rows ) [ [ (csv) ] { } make ] with-input-stream - dup peek { "" } = [ but-last ] when ; + dup last { "" } = [ but-last ] when ; : file>csv ( path encoding -- csv ) csv ; diff --git a/basis/documents/documents-tests.factor b/basis/documents/documents-tests.factor index b0ff3bc8d8..9f7f25c56e 100644 --- a/basis/documents/documents-tests.factor +++ b/basis/documents/documents-tests.factor @@ -120,7 +120,7 @@ namespaces tools.test make arrays kernel fry ; [ "Goodbye, cruel world." ] [ "d" get doc-string ] unit-test [ "" { 0 9 } { 0 15 } ] [ - "d" get undos>> peek + "d" get undos>> last [ old-string>> ] [ from>> ] [ new-to>> ] tri ] unit-test @@ -150,4 +150,4 @@ namespaces tools.test make arrays kernel fry ; [ ] [ "Hello world" "d" get set-doc-string ] unit-test -[ { "" } ] [ "value" get ] unit-test \ No newline at end of file +[ { "" } ] [ "value" get ] unit-test diff --git a/basis/documents/documents.factor b/basis/documents/documents.factor index 104dea6b98..cc2466053b 100644 --- a/basis/documents/documents.factor +++ b/basis/documents/documents.factor @@ -86,7 +86,7 @@ CONSTANT: doc-start { 0 0 } ] [ first swap length 1- + 0 ] if - ] dip peek length + 2array ; + ] dip last length + 2array ; : prepend-first ( str seq -- ) 0 swap [ append ] change-nth ; @@ -191,4 +191,4 @@ PRIVATE> [ undos>> ] [ redos>> ] [ undo-edit ] undo/redo ; : redo ( document -- ) - [ redos>> ] [ undos>> ] [ redo-edit ] undo/redo ; \ No newline at end of file + [ redos>> ] [ undos>> ] [ redo-edit ] undo/redo ; diff --git a/basis/farkup/farkup.factor b/basis/farkup/farkup.factor index a008b1d049..4acd1eeab8 100644 --- a/basis/farkup/farkup.factor +++ b/basis/farkup/farkup.factor @@ -149,15 +149,15 @@ DEFER: (parse-paragraph) : trim-row ( seq -- seq' ) rest - dup peek empty? [ but-last ] when ; + dup last empty? [ but-last ] when ; -: ?peek ( seq -- elt/f ) - [ f ] [ peek ] if-empty ; +: ?last ( seq -- elt/f ) + [ f ] [ last ] if-empty ; : coalesce ( rows -- rows' ) V{ } clone [ '[ - _ dup ?peek ?peek CHAR: \\ = + _ dup ?last ?last CHAR: \\ = [ [ pop "|" rot 3append ] keep ] when push ] each diff --git a/basis/generalizations/generalizations.factor b/basis/generalizations/generalizations.factor index 397166a418..28a1f7dddb 100644 --- a/basis/generalizations/generalizations.factor +++ b/basis/generalizations/generalizations.factor @@ -76,7 +76,7 @@ MACRO: ncleave ( quots n -- ) MACRO: nspread ( quots n -- ) over empty? [ 2drop [ ] ] [ [ [ but-last ] dip ] - [ [ peek ] dip ] 2bi + [ [ last ] dip ] 2bi swap '[ [ _ _ nspread ] _ ndip @ ] ] if ; diff --git a/basis/heaps/heaps.factor b/basis/heaps/heaps.factor index 65cb6541f4..f2ccaad1b4 100644 --- a/basis/heaps/heaps.factor +++ b/basis/heaps/heaps.factor @@ -76,7 +76,7 @@ M: heap heap-size ( heap -- n ) data>> pop* ; inline : data-peek ( heap -- entry ) - data>> peek ; inline + data>> last ; inline : data-first ( heap -- entry ) data>> first ; inline diff --git a/basis/help/lint/checks/checks.factor b/basis/help/lint/checks/checks.factor index 4a15f864a6..f8a4e6c15d 100644 --- a/basis/help/lint/checks/checks.factor +++ b/basis/help/lint/checks/checks.factor @@ -25,7 +25,7 @@ SYMBOL: vocab-articles [ (eval>string) ] call( code -- output ) "\n" ?tail drop ] keep - peek assert= + last assert= ] vocabs-quot get call( quot -- ) ; : check-examples ( element -- ) diff --git a/basis/hints/hints.factor b/basis/hints/hints.factor index 7624cb1517..cfd6329b1d 100644 --- a/basis/hints/hints.factor +++ b/basis/hints/hints.factor @@ -77,7 +77,7 @@ SYNTAX: HINTS: { first first2 first3 first4 } [ { array } "specializer" set-word-prop ] each -{ peek pop* pop } [ +{ last pop* pop } [ { vector } "specializer" set-word-prop ] each diff --git a/basis/http/parsers/parsers.factor b/basis/http/parsers/parsers.factor index 1810617c56..1a80236817 100644 --- a/basis/http/parsers/parsers.factor +++ b/basis/http/parsers/parsers.factor @@ -142,7 +142,7 @@ PEG: parse-header-line ( string -- pair ) 'space' , 'attr' , 'space' , - [ "=" token , 'space' , 'value' , ] seq* [ peek ] action optional , + [ "=" token , 'space' , 'value' , ] seq* [ last ] action optional , 'space' , ] seq* ; diff --git a/basis/inspector/inspector.factor b/basis/inspector/inspector.factor index 8cab5b5ad3..82c2487f67 100644 --- a/basis/inspector/inspector.factor +++ b/basis/inspector/inspector.factor @@ -91,7 +91,7 @@ PRIVATE> : &back ( -- ) inspector-stack get - dup length 1 <= [ drop ] [ [ pop* ] [ peek reinspect ] bi ] if ; + dup length 1 <= [ drop ] [ [ pop* ] [ last reinspect ] bi ] if ; : &add ( value key -- ) mirror get set-at &push reinspect ; diff --git a/basis/inverse/inverse.factor b/basis/inverse/inverse.factor index 7690b34410..cf97a0b2c8 100755 --- a/basis/inverse/inverse.factor +++ b/basis/inverse/inverse.factor @@ -220,7 +220,7 @@ DEFER: __ \ first4 [ 4array ] define-inverse \ prefix \ unclip define-dual -\ suffix [ dup but-last swap peek ] define-inverse +\ suffix [ dup but-last swap last ] define-inverse \ append 1 [ [ ?tail assure ] curry ] define-pop-inverse \ prepend 1 [ [ ?head assure ] curry ] define-pop-inverse diff --git a/basis/lcs/lcs.factor b/basis/lcs/lcs.factor index d32b199873..ab4fbd60bb 100644 --- a/basis/lcs/lcs.factor +++ b/basis/lcs/lcs.factor @@ -34,7 +34,7 @@ PRIVATE> : levenshtein ( old new -- n ) [ levenshtein-initialize ] [ levenshtein-step ] - run-lcs peek peek ; + run-lcs last last ; TUPLE: retain item ; TUPLE: delete item ; diff --git a/basis/logging/parser/parser.factor b/basis/logging/parser/parser.factor index 5406d8fcd0..dbc26c7efc 100644 --- a/basis/logging/parser/parser.factor +++ b/basis/logging/parser/parser.factor @@ -66,7 +66,7 @@ PEG: parse-log-line ( string -- entry ) 'log-line' ; building get empty? [ "Warning: log begins with multiline entry" print drop ] [ - message>> first building get peek message>> push + message>> first building get last message>> push ] if ; : parse-log ( lines -- entries ) diff --git a/basis/math/bits/bits-tests.factor b/basis/math/bits/bits-tests.factor index ed4e8419c9..b17d9d8b6e 100644 --- a/basis/math/bits/bits-tests.factor +++ b/basis/math/bits/bits-tests.factor @@ -23,9 +23,9 @@ IN: math.bits.tests ] unit-test [ t ] [ - 1067811677921310779 make-bits peek + 1067811677921310779 make-bits last ] unit-test [ t ] [ - 1067811677921310779 >bignum make-bits peek -] unit-test \ No newline at end of file + 1067811677921310779 >bignum make-bits last +] unit-test diff --git a/basis/math/polynomials/polynomials.factor b/basis/math/polynomials/polynomials.factor index fd6eda4a90..0de18b6feb 100644 --- a/basis/math/polynomials/polynomials.factor +++ b/basis/math/polynomials/polynomials.factor @@ -48,7 +48,7 @@ PRIVATE> : /-last ( seq seq -- a ) #! divide the last two numbers in the sequences - [ peek ] bi@ / ; + [ last ] bi@ / ; : (p/mod) ( p p -- p p ) 2dup /-last diff --git a/basis/math/ranges/ranges.factor b/basis/math/ranges/ranges.factor index d0c918458a..5b4bdae1e6 100644 --- a/basis/math/ranges/ranges.factor +++ b/basis/math/ranges/ranges.factor @@ -56,14 +56,14 @@ PRIVATE> : range-decreasing? ( range -- ? ) step>> 0 < ; -: first-or-peek ( seq head? -- elt ) - [ first ] [ peek ] if ; +: first-or-last ( seq head? -- elt ) + [ first ] [ last ] if ; : range-min ( range -- min ) - dup range-increasing? first-or-peek ; + dup range-increasing? first-or-last ; : range-max ( range -- max ) - dup range-decreasing? first-or-peek ; + dup range-decreasing? first-or-last ; : clamp-to-range ( n range -- n ) [ range-min ] [ range-max ] bi clamp ; diff --git a/basis/peg/ebnf/ebnf.factor b/basis/peg/ebnf/ebnf.factor index f3d555d5a1..4b2eca69b4 100644 --- a/basis/peg/ebnf/ebnf.factor +++ b/basis/peg/ebnf/ebnf.factor @@ -370,7 +370,7 @@ SYMBOL: ignore-ws ] bind ; M: ebnf (transform) ( ast -- parser ) - rules>> [ (transform) ] map peek ; + rules>> [ (transform) ] map last ; M: ebnf-tokenizer (transform) ( ast -- parser ) elements>> dup "default" = [ diff --git a/basis/persistent/vectors/vectors.factor b/basis/persistent/vectors/vectors.factor index ae33b7c39a..5927171aa3 100644 --- a/basis/persistent/vectors/vectors.factor +++ b/basis/persistent/vectors/vectors.factor @@ -70,7 +70,7 @@ M: persistent-vector nth-unsafe dup level>> 1 = [ new-child ] [ - tuck children>> peek (ppush-new-tail) + tuck children>> last (ppush-new-tail) [ swap new-child ] [ swap node-set-last f ] ?if ] if ; @@ -127,13 +127,13 @@ M: persistent-vector new-nth ( obj i pvec -- pvec' ) : ppop-contraction ( node -- node' tail' ) dup children>> length 1 = - [ children>> peek f swap ] + [ children>> last f swap ] [ (ppop-contraction) ] if ; : (ppop-new-tail) ( root -- root' tail' ) dup level>> 1 > [ - dup children>> peek (ppop-new-tail) [ + dup children>> last (ppop-new-tail) [ dup [ swap node-set-last ] [ drop ppop-contraction drop ] diff --git a/basis/porter-stemmer/porter-stemmer.factor b/basis/porter-stemmer/porter-stemmer.factor index b6eb0ff464..35ed84aaf4 100644 --- a/basis/porter-stemmer/porter-stemmer.factor +++ b/basis/porter-stemmer/porter-stemmer.factor @@ -52,7 +52,7 @@ USING: kernel math parser sequences combinators splitting ; : consonant-end? ( n seq -- ? ) [ length swap - ] keep consonant? ; -: last-is? ( str possibilities -- ? ) [ peek ] dip member? ; +: last-is? ( str possibilities -- ? ) [ last ] dip member? ; : cvc? ( str -- ? ) { @@ -67,7 +67,7 @@ USING: kernel math parser sequences combinators splitting ; pick consonant-seq 0 > [ nip ] [ drop ] if append ; : step1a ( str -- newstr ) - dup peek CHAR: s = [ + dup last CHAR: s = [ { { [ "sses" ?tail ] [ "ss" append ] } { [ "ies" ?tail ] [ "i" append ] } @@ -199,13 +199,13 @@ USING: kernel math parser sequences combinators splitting ; [ 1 = [ but-last-slice cvc? not ] [ drop f ] if ] if ; : remove-e ( str -- newstr ) - dup peek CHAR: e = [ + dup last CHAR: e = [ dup remove-e? [ but-last-slice ] when ] when ; : ll->l ( str -- newstr ) { - { [ dup peek CHAR: l = not ] [ ] } + { [ dup last CHAR: l = not ] [ ] } { [ dup length 1- over double-consonant? not ] [ ] } { [ dup consonant-seq 1 > ] [ but-last-slice ] } [ ] diff --git a/basis/prettyprint/sections/sections.factor b/basis/prettyprint/sections/sections.factor index b4eb40757d..0e0c7afb82 100644 --- a/basis/prettyprint/sections/sections.factor +++ b/basis/prettyprint/sections/sections.factor @@ -153,7 +153,7 @@ TUPLE: block < section sections ; : ( style -- block ) block new-block ; -: pprinter-block ( -- block ) pprinter-stack get peek ; +: pprinter-block ( -- block ) pprinter-stack get last ; : add-section ( section -- ) pprinter-block sections>> push ; @@ -292,7 +292,7 @@ M: colon unindent-first-line? drop t ; ! Long section layout algorithm : chop-break ( seq -- seq ) - dup peek line-break? [ but-last-slice chop-break ] when ; + dup last line-break? [ but-last-slice chop-break ] when ; SYMBOL: prev SYMBOL: next @@ -317,7 +317,7 @@ SYMBOL: next ] { } make { t } split harvest ; : break-group? ( seq -- ? ) - [ first section-fits? ] [ peek section-fits? not ] bi and ; + [ first section-fits? ] [ last section-fits? not ] bi and ; : ?break-group ( seq -- ) dup break-group? [ first latin2 encode >quoted ] unit-test [ 1 ] [ message >quoted string-lines length ] unit-test [ t ] [ message >quoted-lines "=\r\n" swap subseq? ] unit-test [ 4 ] [ message >quoted-lines string-lines length ] unit-test -[ "===o" ] [ message >quoted-lines string-lines [ peek ] "" map-as ] unit-test +[ "===o" ] [ message >quoted-lines string-lines [ last ] "" map-as ] unit-test diff --git a/basis/quoting/quoting.factor b/basis/quoting/quoting.factor index 5b09347c8c..86d8183ac6 100644 --- a/basis/quoting/quoting.factor +++ b/basis/quoting/quoting.factor @@ -9,8 +9,8 @@ IN: quoting { [ length 1 > ] [ first quote? ] - [ [ first ] [ peek ] bi = ] + [ [ first ] [ last ] bi = ] } 1&& ; : unquote ( str -- newstr ) - dup quoted? [ but-last-slice rest-slice >string ] when ; \ No newline at end of file + dup quoted? [ but-last-slice rest-slice >string ] when ; diff --git a/basis/splitting/monotonic/monotonic.factor b/basis/splitting/monotonic/monotonic.factor index 2e2ac74e30..088de52766 100644 --- a/basis/splitting/monotonic/monotonic.factor +++ b/basis/splitting/monotonic/monotonic.factor @@ -6,9 +6,9 @@ IN: splitting.monotonic quot diff --git a/basis/tools/completion/completion.factor b/basis/tools/completion/completion.factor index 00d86a1608..c8fd3a6658 100644 --- a/basis/tools/completion/completion.factor +++ b/basis/tools/completion/completion.factor @@ -24,7 +24,7 @@ IN: tools.completion 2dup number= [ drop ] [ nip V{ } clone pick push ] if 1+ - ] keep pick peek push + ] keep pick last push ] each ; : runs ( seq -- newseq ) @@ -78,4 +78,4 @@ IN: tools.completion all-vocabs-seq name-completions ; : chars-matching ( str -- seq ) - name-map keys dup zip completions ; \ No newline at end of file + name-map keys dup zip completions ; diff --git a/basis/ui/backend/cocoa/cocoa.factor b/basis/ui/backend/cocoa/cocoa.factor index b6c9b43271..aa84ee43c5 100755 --- a/basis/ui/backend/cocoa/cocoa.factor +++ b/basis/ui/backend/cocoa/cocoa.factor @@ -83,7 +83,7 @@ M: pasteboard set-clipboard-contents dup { 0 0 } = [ drop windows get length 1 <= [ -> center ] [ - windows get peek second window-loc>> + windows get last second window-loc>> dupd first2 -> cascadeTopLeftFromPoint: -> setFrameTopLeftPoint: ] if diff --git a/basis/unicode/case/case.factor b/basis/unicode/case/case.factor index 1ad3931746..79db087220 100644 --- a/basis/unicode/case/case.factor +++ b/basis/unicode/case/case.factor @@ -59,7 +59,7 @@ SYMBOL: locale ! Just casing locale, or overall? : fix-sigma-end ( string -- string ) [ "" ] [ - dup peek CHAR: greek-small-letter-sigma = + dup last CHAR: greek-small-letter-sigma = [ 1 head* CHAR: greek-small-letter-final-sigma suffix ] when ] if-empty ; inline diff --git a/basis/unicode/collation/collation.factor b/basis/unicode/collation/collation.factor index f8beca3c60..5cab884b3c 100755 --- a/basis/unicode/collation/collation.factor +++ b/basis/unicode/collation/collation.factor @@ -63,13 +63,13 @@ ducet insert-helpers [ drop { } ] [ [ AAAA ] [ BBBB ] bi 2array ] if ; -: last ( -- char ) - building get empty? [ 0 ] [ building get peek peek ] if ; +: building-last ( -- char ) + building get empty? [ 0 ] [ building get last last ] if ; : blocked? ( char -- ? ) combining-class dup { 0 f } member? - [ drop last non-starter? ] - [ last combining-class = ] if ; + [ drop building-last non-starter? ] + [ building-last combining-class = ] if ; : possible-bases ( -- slice-of-building ) building get dup [ first non-starter? not ] find-last diff --git a/basis/vlists/vlists-tests.factor b/basis/vlists/vlists-tests.factor index 3546051364..6df942eb84 100644 --- a/basis/vlists/vlists-tests.factor +++ b/basis/vlists/vlists-tests.factor @@ -16,7 +16,7 @@ IN: vlists.tests [ "foo" VL{ "hi" "there" } t ] [ VL{ "hi" "there" "foo" } dup "v" set - [ peek ] [ ppop ] bi + [ last ] [ ppop ] bi dup "v" get [ vector>> ] bi@ eq? ] unit-test diff --git a/basis/xml/xml.factor b/basis/xml/xml.factor index 9df7165e6c..cca1b5e2e0 100755 --- a/basis/xml/xml.factor +++ b/basis/xml/xml.factor @@ -11,7 +11,7 @@ IN: xml quot picker prepend define-predicate-engine ] if-empty ; + [ last ] [ alist>quot picker prepend define-predicate-engine ] if-empty ; M: predicate-engine compile-engine [ compile-predicate-engine ] [ class>> ] bi diff --git a/core/namespaces/namespaces.factor b/core/namespaces/namespaces.factor index 64cc328d19..9428445d26 100644 --- a/core/namespaces/namespaces.factor +++ b/core/namespaces/namespaces.factor @@ -12,7 +12,7 @@ IN: namespaces PRIVATE> -: namespace ( -- namespace ) namestack* peek ; inline +: namespace ( -- namespace ) namestack* last ; inline : namestack ( -- namestack ) namestack* clone ; : set-namestack ( namestack -- ) >vector 0 setenv ; : global ( -- g ) 21 getenv { hashtable } declare ; inline diff --git a/core/sequences/sequences-docs.factor b/core/sequences/sequences-docs.factor index b6cfface12..04c9aca035 100755 --- a/core/sequences/sequences-docs.factor +++ b/core/sequences/sequences-docs.factor @@ -546,12 +546,12 @@ HELP: join { join concat concat-as } related-words -HELP: peek +HELP: last { $values { "seq" sequence } { "elt" object } } { $description "Outputs the last element of a sequence." } { $errors "Throws an error if the sequence is empty." } ; -{ peek pop pop* } related-words +{ last pop pop* } related-words HELP: pop* { $values { "seq" "a resizable mutable sequence" } } @@ -1382,7 +1382,7 @@ ARTICLE: "sequences-access" "Accessing sequence elements" { $subsection first2 } { $subsection first3 } { $subsection first4 } -{ $see-also nth peek } ; +{ $see-also nth last } ; ARTICLE: "sequences-add-remove" "Adding and removing sequence elements" "Adding elements:" @@ -1579,7 +1579,6 @@ ARTICLE: "sequences-destructive" "Destructive operations" ARTICLE: "sequences-stacks" "Treating sequences as stacks" "The classical stack operations, modifying a sequence in place:" -{ $subsection peek } { $subsection push } { $subsection pop } { $subsection pop* } diff --git a/core/sequences/sequences.factor b/core/sequences/sequences.factor index 9b0f4c1530..36e4c95470 100755 --- a/core/sequences/sequences.factor +++ b/core/sequences/sequences.factor @@ -626,7 +626,7 @@ PRIVATE> [ 0 swap copy ] keep ] new-like ; -: peek ( seq -- elt ) [ length 1 - ] [ nth ] bi ; +: last ( seq -- elt ) [ length 1 - ] [ nth ] bi ; : pop* ( seq -- ) [ length 1 - ] [ shorten ] bi ; @@ -821,7 +821,7 @@ PRIVATE> [ rest ] [ first-unsafe ] bi ; : unclip-last ( seq -- butlast last ) - [ but-last ] [ peek ] bi ; + [ but-last ] [ last ] bi ; : unclip-slice ( seq -- rest-slice first ) [ rest-slice ] [ first-unsafe ] bi ; inline @@ -852,7 +852,7 @@ PRIVATE> [ find-last ] (map-find) ; inline : unclip-last-slice ( seq -- butlast-slice last ) - [ but-last-slice ] [ peek ] bi ; inline + [ but-last-slice ] [ last ] bi ; inline : ( seq -- slice ) dup slice? [ { } like ] when diff --git a/core/splitting/splitting.factor b/core/splitting/splitting.factor index 04b3e53422..5ec396e5ba 100644 --- a/core/splitting/splitting.factor +++ b/core/splitting/splitting.factor @@ -75,7 +75,7 @@ M: string string-lines but-last-slice [ "\r" ?tail drop "\r" split ] map - ] keep peek "\r" split suffix concat + ] keep last "\r" split suffix concat ] [ 1array ] if ; diff --git a/core/vectors/vectors-tests.factor b/core/vectors/vectors-tests.factor index 12e2ea49f7..9052638e7d 100644 --- a/core/vectors/vectors-tests.factor +++ b/core/vectors/vectors-tests.factor @@ -62,7 +62,7 @@ IN: vectors.tests [ ] [ V{ 1 5 } "funny-stack" get push ] unit-test [ ] [ V{ 2 3 } "funny-stack" get push ] unit-test [ V{ 2 3 } ] [ "funny-stack" get pop ] unit-test -[ V{ 1 5 } ] [ "funny-stack" get peek ] unit-test +[ V{ 1 5 } ] [ "funny-stack" get last ] unit-test [ V{ 1 5 } ] [ "funny-stack" get pop ] unit-test [ "funny-stack" get pop ] must-fail [ "funny-stack" get pop ] must-fail @@ -98,4 +98,4 @@ IN: vectors.tests [ fixnum ] [ 1 >bignum [ ] V{ } map-as length class ] unit-test -[ V{ "lulz" } ] [ "lulz" 1vector ] unit-test \ No newline at end of file +[ V{ "lulz" } ] [ "lulz" 1vector ] unit-test diff --git a/core/vocabs/loader/loader.factor b/core/vocabs/loader/loader.factor index 6561c55b67..2c0f67641d 100644 --- a/core/vocabs/loader/loader.factor +++ b/core/vocabs/loader/loader.factor @@ -39,7 +39,7 @@ PRIVATE> : vocab-dir+ ( vocab str/f -- path ) [ vocab-name "." split ] dip - [ [ dup peek ] dip append suffix ] when* + [ [ dup last ] dip append suffix ] when* "/" join ; : find-vocab-root ( vocab -- path/f ) diff --git a/core/vocabs/parser/parser.factor b/core/vocabs/parser/parser.factor index ff55f8e68d..ca783c13e6 100644 --- a/core/vocabs/parser/parser.factor +++ b/core/vocabs/parser/parser.factor @@ -193,7 +193,7 @@ TUPLE: ambiguous-use-error words ; : qualified-search ( name manifest -- word/f ) qualified-vocabs>> - (vocab-search) 0 = [ drop f ] [ peek ] if ; + (vocab-search) 0 = [ drop f ] [ last ] if ; PRIVATE> diff --git a/extra/24-game/24-game.factor b/extra/24-game/24-game.factor index 19928b2e0b..15c610ce7a 100644 --- a/extra/24-game/24-game.factor +++ b/extra/24-game/24-game.factor @@ -40,7 +40,7 @@ SYMBOL: commands if ; DEFER: check-status : quit-game ( vector -- ) drop "you're a quitter" print ; -: quit? ( vector -- t/f ) peek "quit" = ; +: quit? ( vector -- t/f ) last "quit" = ; : end-game ( vector -- ) dup victory? [ drop "You WON!" ] diff --git a/extra/animations/animations.factor b/extra/animations/animations.factor index a5c7dbdde4..8f416dc799 100644 --- a/extra/animations/animations.factor +++ b/extra/animations/animations.factor @@ -14,4 +14,4 @@ SYMBOL: sleep-period : set-end ( duration -- end-time ) duration>milliseconds millis + ; : loop ( quot end -- ) dup millis > [ [ dup call ] dip loop ] [ 2drop ] if ; inline : animate ( quot duration -- ) reset-progress set-end loop ; inline -: sample ( revs quot -- avg ) reset-progress dupd times progress swap / ; inline \ No newline at end of file +: sample ( revs quot -- avg ) reset-progress dupd times progress swap / ; inline diff --git a/extra/bson/reader/reader.factor b/extra/bson/reader/reader.factor index 9f1d8c31d2..6fadcf7679 100644 --- a/extra/bson/reader/reader.factor +++ b/extra/bson/reader/reader.factor @@ -83,7 +83,7 @@ GENERIC: element-binary-read ( length type -- object ) get-state element>> pop ; inline : peek-scope ( -- ht ) - get-state scope>> peek ; inline + get-state scope>> last ; inline : read-elements ( -- ) read-element-type @@ -136,7 +136,7 @@ M: bson-not-eoo element-read ( type -- cont? ) read-int32 drop get-state [scope-changer] change-scope - scope>> peek ; inline + scope>> last ; inline M: bson-object element-data-read ( type -- object ) (object-data-read) ; diff --git a/extra/dns/dns.factor b/extra/dns/dns.factor index 6d81f2a14b..f16664fb02 100644 --- a/extra/dns/dns.factor +++ b/extra/dns/dns.factor @@ -495,7 +495,7 @@ ERROR: name-error name ; : fully-qualified ( name -- name ) { { [ dup empty? ] [ "." append ] } - { [ dup peek CHAR: . = ] [ ] } + { [ dup last CHAR: . = ] [ ] } { [ t ] [ "." append ] } } cond ; diff --git a/extra/html/parser/parser.factor b/extra/html/parser/parser.factor index 948bd0c954..9fcbffd0db 100644 --- a/extra/html/parser/parser.factor +++ b/extra/html/parser/parser.factor @@ -21,7 +21,7 @@ SYMBOL: tagstack : closing-tag? ( string -- ? ) [ f ] - [ { [ first CHAR: / = ] [ peek CHAR: / = ] } 1|| ] if-empty ; + [ { [ first CHAR: / = ] [ last CHAR: / = ] } 1|| ] if-empty ; : ( name attributes closing? -- tag ) tag new diff --git a/extra/irc/messages/messages.factor b/extra/irc/messages/messages.factor index 2006cc24c3..d53ef6924b 100755 --- a/extra/irc/messages/messages.factor +++ b/extra/irc/messages/messages.factor @@ -65,7 +65,7 @@ IRC: rpl-nick-collision "436" nickname : comment ; PREDICATE: channel-mode < mode name>> first "#&" member? ; PREDICATE: participant-mode < channel-mode parameter>> ; PREDICATE: ctcp < privmsg - trailing>> { [ length 1 > ] [ first 1 = ] [ peek 1 = ] } 1&& ; + trailing>> { [ length 1 > ] [ first 1 = ] [ last 1 = ] } 1&& ; PREDICATE: action < ctcp trailing>> rest "ACTION" head? ; M: rpl-names post-process-irc-message ( rpl-names -- ) diff --git a/extra/jamshred/tunnel/tunnel.factor b/extra/jamshred/tunnel/tunnel.factor index 7e124dc713..59120cc578 100644 --- a/extra/jamshred/tunnel/tunnel.factor +++ b/extra/jamshred/tunnel/tunnel.factor @@ -25,7 +25,7 @@ CONSTANT: random-rotation-angle $[ pi 20 / ] : (random-segments) ( segments n -- segments ) dup 0 > [ - [ dup peek random-segment over push ] dip 1- (random-segments) + [ dup last random-segment over push ] dip 1- (random-segments) ] [ drop ] if ; CONSTANT: default-segment-radius 1 diff --git a/extra/mason/notify/server/server.factor b/extra/mason/notify/server/server.factor index 9ed29aef45..5e99b15df5 100644 --- a/extra/mason/notify/server/server.factor +++ b/extra/mason/notify/server/server.factor @@ -45,7 +45,7 @@ builder "BUILDERS" { SYMBOLS: host-name target-os target-cpu message message-arg ; : parse-args ( command-line -- ) - dup peek message-arg set + dup last message-arg set [ { [ host-name set ] diff --git a/extra/math/vectors/homogeneous/homogeneous.factor b/extra/math/vectors/homogeneous/homogeneous.factor index 218e56dfb5..65f57be514 100644 --- a/extra/math/vectors/homogeneous/homogeneous.factor +++ b/extra/math/vectors/homogeneous/homogeneous.factor @@ -5,7 +5,7 @@ IN: math.vectors.homogeneous : (homogeneous-xyz) ( h -- xyz ) 1 head* ; inline : (homogeneous-w) ( h -- w ) - peek ; inline + last ; inline : h+ ( a b -- c ) 2dup [ (homogeneous-w) ] bi@ over = diff --git a/extra/project-euler/049/049.factor b/extra/project-euler/049/049.factor index 15dd7ed6d2..9ecf942ef6 100644 --- a/extra/project-euler/049/049.factor +++ b/extra/project-euler/049/049.factor @@ -50,7 +50,7 @@ HINTS: count-digits fixnum ; : (find-unusual-terms) ( n seq -- seq/f ) [ [ arithmetic-terms ] with map ] keep - '[ _ [ peek ] dip member? ] find nip ; + '[ _ [ last ] dip member? ] find nip ; : find-unusual-terms ( seq -- seq/? ) unclip-slice over (find-unusual-terms) [ diff --git a/extra/project-euler/059/059.factor b/extra/project-euler/059/059.factor index 9a2fb8c868..1fb5c7c8bb 100644 --- a/extra/project-euler/059/059.factor +++ b/extra/project-euler/059/059.factor @@ -75,7 +75,7 @@ INSTANCE: rollover immutable-sequence ] { } make nip ; inline : most-frequent ( seq -- elt ) - frequency-analysis sort-values keys peek ; + frequency-analysis sort-values keys last ; : crack-key ( seq key-length -- key ) [ " " decrypt ] dip group but-last-slice diff --git a/extra/project-euler/116/116.factor b/extra/project-euler/116/116.factor index 174618e147..2766322323 100644 --- a/extra/project-euler/116/116.factor +++ b/extra/project-euler/116/116.factor @@ -41,10 +41,10 @@ IN: project-euler.116 [ length swap - 1- ] keep ?nth 0 or ; : next ( colortile seq -- ) - [ nth* ] [ peek + ] [ push ] tri ; + [ nth* ] [ last + ] [ push ] tri ; : ways ( length colortile -- permutations ) - V{ 1 } clone [ [ next ] 2curry times ] keep peek 1- ; + V{ 1 } clone [ [ next ] 2curry times ] keep last 1- ; : (euler116) ( length -- permutations ) 3 [1,b] [ ways ] with sigma ; diff --git a/extra/project-euler/117/117.factor b/extra/project-euler/117/117.factor index cb485d3ce2..0d4ec78226 100644 --- a/extra/project-euler/117/117.factor +++ b/extra/project-euler/117/117.factor @@ -31,7 +31,7 @@ IN: project-euler.117 [ 4 short tail* sum ] keep push ; : (euler117) ( n -- m ) - V{ 1 } clone tuck [ next ] curry times peek ; + V{ 1 } clone tuck [ next ] curry times last ; PRIVATE> diff --git a/extra/project-euler/164/164.factor b/extra/project-euler/164/164.factor index cea1472c0b..af8b7e49c0 100644 --- a/extra/project-euler/164/164.factor +++ b/extra/project-euler/164/164.factor @@ -18,7 +18,7 @@ IN: project-euler.164 Date: Mon, 25 May 2009 17:03:32 -0500 Subject: [PATCH 10/24] unassociate last with pop/pop* in docs --- core/sequences/sequences-docs.factor | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/sequences/sequences-docs.factor b/core/sequences/sequences-docs.factor index 04c9aca035..927a404519 100755 --- a/core/sequences/sequences-docs.factor +++ b/core/sequences/sequences-docs.factor @@ -551,7 +551,7 @@ HELP: last { $description "Outputs the last element of a sequence." } { $errors "Throws an error if the sequence is empty." } ; -{ last pop pop* } related-words +{ pop pop* } related-words HELP: pop* { $values { "seq" "a resizable mutable sequence" } } @@ -1378,11 +1378,13 @@ ARTICLE: "sequences-access" "Accessing sequence elements" { $subsection second } { $subsection third } { $subsection fourth } +"Extracting the last element:" +{ $subsection last } "Unpacking sequences:" { $subsection first2 } { $subsection first3 } { $subsection first4 } -{ $see-also nth last } ; +{ $see-also nth } ; ARTICLE: "sequences-add-remove" "Adding and removing sequence elements" "Adding elements:" From 0d5ed7e98239648e467bfe81e05d183b588b49b9 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Mon, 25 May 2009 19:00:18 -0500 Subject: [PATCH 11/24] remove duplicate definition of last --- extra/adsoda/adsoda.factor | 1 - 1 file changed, 1 deletion(-) diff --git a/extra/adsoda/adsoda.factor b/extra/adsoda/adsoda.factor index 4042528eba..c659e109ce 100755 --- a/extra/adsoda/adsoda.factor +++ b/extra/adsoda/adsoda.factor @@ -58,7 +58,6 @@ t to: remove-hidden-solids? : with-pv ( i quot -- ) [ swap >pv call ] with-scope ; inline : dimension ( array -- x ) length 1- ; inline -: last ( seq -- x ) [ dimension ] [ nth ] bi ; inline : change-last ( seq quot -- ) [ [ dimension ] keep ] dip change-nth ; inline From 0cb7b408b4542a8f6b717ae768ee0c9d5c60de95 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Mon, 25 May 2009 21:24:12 -0500 Subject: [PATCH 12/24] remove clamp-to-range and associated words, update jamshred --- basis/math/ranges/ranges-tests.factor | 13 +------------ basis/math/ranges/ranges.factor | 21 --------------------- extra/jamshred/player/player.factor | 4 ++-- extra/jamshred/tunnel/tunnel.factor | 12 +++++++++--- 4 files changed, 12 insertions(+), 38 deletions(-) diff --git a/basis/math/ranges/ranges-tests.factor b/basis/math/ranges/ranges-tests.factor index aedd2f7933..e314f72c6b 100644 --- a/basis/math/ranges/ranges-tests.factor +++ b/basis/math/ranges/ranges-tests.factor @@ -22,17 +22,6 @@ IN: math.ranges.tests [ { 0 1/3 2/3 1 } ] [ 0 1 1/3 >array ] unit-test [ { 0 1/3 2/3 1 } ] [ 1 0 -1/3 >array reverse ] unit-test -[ t ] [ 5 [0,b] range-increasing? ] unit-test -[ f ] [ 5 [0,b] range-decreasing? ] unit-test -[ f ] [ -5 [0,b] range-increasing? ] unit-test -[ t ] [ -5 [0,b] range-decreasing? ] unit-test -[ 0 ] [ 5 [0,b] range-min ] unit-test -[ 5 ] [ 5 [0,b] range-max ] unit-test -[ 3 ] [ 3 5 [0,b] clamp-to-range ] unit-test -[ 0 ] [ -1 5 [0,b] clamp-to-range ] unit-test -[ 5 ] [ 6 5 [0,b] clamp-to-range ] unit-test -[ { 0 1 2 3 4 } ] [ 5 sequence-index-range >array ] unit-test - [ 100 ] [ 1 100 [a,b] [ 2^ [1,b] ] map prune length -] unit-test \ No newline at end of file +] unit-test diff --git a/basis/math/ranges/ranges.factor b/basis/math/ranges/ranges.factor index 5b4bdae1e6..d28afa1413 100644 --- a/basis/math/ranges/ranges.factor +++ b/basis/math/ranges/ranges.factor @@ -49,24 +49,3 @@ PRIVATE> : [1,b] ( b -- range ) 1 swap [a,b] ; inline : [0,b) ( b -- range ) 0 swap [a,b) ; inline - -: range-increasing? ( range -- ? ) - step>> 0 > ; - -: range-decreasing? ( range -- ? ) - step>> 0 < ; - -: first-or-last ( seq head? -- elt ) - [ first ] [ last ] if ; - -: range-min ( range -- min ) - dup range-increasing? first-or-last ; - -: range-max ( range -- max ) - dup range-decreasing? first-or-last ; - -: clamp-to-range ( n range -- n ) - [ range-min ] [ range-max ] bi clamp ; - -: sequence-index-range ( seq -- range ) - length [0,b) ; diff --git a/extra/jamshred/player/player.factor b/extra/jamshred/player/player.factor index 5b92b3a434..3364179920 100644 --- a/extra/jamshred/player/player.factor +++ b/extra/jamshred/player/player.factor @@ -45,10 +45,10 @@ CONSTANT: max-speed 30.0 max-speed [0,b] ; : change-player-speed ( inc player -- ) - [ + speed-range clamp-to-range ] change-speed drop ; + [ + 0 max-speed clamp ] change-speed drop ; : multiply-player-speed ( n player -- ) - [ * speed-range clamp-to-range ] change-speed drop ; + [ * 0 max-speed clamp ] change-speed drop ; : distance-to-move ( seconds-passed player -- distance ) speed>> * ; diff --git a/extra/jamshred/tunnel/tunnel.factor b/extra/jamshred/tunnel/tunnel.factor index 59120cc578..986574ee91 100644 --- a/extra/jamshred/tunnel/tunnel.factor +++ b/extra/jamshred/tunnel/tunnel.factor @@ -1,6 +1,9 @@ ! Copyright (C) 2007, 2008 Alex Chapman ! See http://factorcode.org/license.txt for BSD license. -USING: accessors arrays colors combinators kernel literals locals math math.constants math.matrices math.order math.ranges math.vectors math.quadratic random sequences specialized-arrays.float vectors jamshred.oint ; +USING: accessors arrays colors combinators fry jamshred.oint +kernel literals locals math math.constants math.matrices +math.order math.quadratic math.ranges math.vectors random +sequences specialized-arrays.float vectors ; FROM: jamshred.oint => distance ; IN: jamshred.tunnel @@ -12,6 +15,9 @@ C: segment : segment-number++ ( segment -- ) [ number>> 1+ ] keep (>>number) ; +: clamp-length ( n seq -- n' ) + 0 swap length clamp ; + : random-color ( -- color ) { 100 100 100 } [ random 100 / >float ] map first3 1.0 ; @@ -53,7 +59,7 @@ CONSTANT: default-segment-radius 1 : sub-tunnel ( from to segments -- segments ) #! return segments between from and to, after clamping from and to to #! valid values - [ sequence-index-range [ clamp-to-range ] curry bi@ ] keep ; + [ '[ _ clamp-length ] bi@ ] keep ; : nearer-segment ( segment segment oint -- segment ) #! return whichever of the two segments is nearer to the oint @@ -82,7 +88,7 @@ CONSTANT: default-segment-radius 1 ] dip nearer-segment ; : get-segment ( segments n -- segment ) - over sequence-index-range clamp-to-range swap nth ; + over clamp-length swap nth ; : next-segment ( segments current-segment -- segment ) number>> 1+ get-segment ; From 16b288aac82a948ff94deabecd942b889f599cd7 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Mon, 25 May 2009 21:25:56 -0500 Subject: [PATCH 13/24] remove whitespace --- basis/math/ranges/ranges-docs.factor | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/basis/math/ranges/ranges-docs.factor b/basis/math/ranges/ranges-docs.factor index e35adb10e5..59053a4c02 100644 --- a/basis/math/ranges/ranges-docs.factor +++ b/basis/math/ranges/ranges-docs.factor @@ -1,5 +1,4 @@ USING: help.syntax help.markup arrays sequences ; - IN: math.ranges ARTICLE: "math.ranges" "Numeric ranges" @@ -24,4 +23,4 @@ $nl { $code "100 1 [a,b] product" } "A range can be converted into a concrete sequence using a word such as " { $link >array } ". In most cases this is unnecessary since ranges implement the sequence protocol already. It is necessary if a mutable sequence is needed, for use with words such as " { $link set-nth } " or " { $link change-each } "." ; -ABOUT: "math.ranges" \ No newline at end of file +ABOUT: "math.ranges" From daf1594390d4af28cd5c391f594bf5cb23ebc819 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Tue, 26 May 2009 10:05:55 -0500 Subject: [PATCH 14/24] fix human sort -- wrap all elements so that integers dont get compared against strings directly --- basis/sorting/human/human-tests.factor | 14 ++++++++++++-- basis/sorting/human/human.factor | 13 ++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/basis/sorting/human/human-tests.factor b/basis/sorting/human/human-tests.factor index 20a607188c..68ddf8c3c9 100644 --- a/basis/sorting/human/human-tests.factor +++ b/basis/sorting/human/human-tests.factor @@ -1,4 +1,14 @@ -USING: sorting.human tools.test sorting.slots ; +USING: sorting.human tools.test sorting.slots sorting ; IN: sorting.human.tests -[ { "x1y" "x2" "x10y" } ] [ { "x1y" "x10y" "x2" } { human<=> } sort-by ] unit-test +[ { "x1y" "x2" "x10y" } ] +[ { "x1y" "x10y" "x2" } { human<=> } sort-by ] unit-test + +[ { "4dup" "nip" } ] +[ { "4dup" "nip" } [ human<=> ] sort ] unit-test + +[ { "4dup" "nip" } ] +[ { "nip" "4dup" } [ human<=> ] sort ] unit-test + +[ { "4dup" "4nip" "5drop" "nip" "nip2" "nipd" } ] +[ { "nip" "4dup" "4nip" "5drop" "nip2" "nipd" } [ human<=> ] sort ] unit-test diff --git a/basis/sorting/human/human.factor b/basis/sorting/human/human.factor index b3dae45a9b..56de7f2f48 100644 --- a/basis/sorting/human/human.factor +++ b/basis/sorting/human/human.factor @@ -6,4 +6,15 @@ IN: sorting.human : find-numbers ( string -- seq ) [EBNF Result = ([0-9]+ => [[ string>number ]] | (!([0-9]) .)+)* EBNF] ; -<< "human" [ find-numbers ] define-sorting >> +! For comparing integers or sequences +TUPLE: hybrid obj ; + +M: hybrid <=> + [ obj>> ] bi@ + 2dup [ integer? ] bi@ xor [ + drop integer? [ +lt+ ] [ +gt+ ] if + ] [ + <=> + ] if ; + +<< "human" [ find-numbers [ hybrid boa ] map ] define-sorting >> From 0d45dafdd00b82e9bdd96fd98d0a63945bba4bdd Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Tue, 26 May 2009 11:55:48 -0500 Subject: [PATCH 15/24] fix formatting --- basis/sorting/title/title.factor | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/basis/sorting/title/title.factor b/basis/sorting/title/title.factor index dbdbf8a8fb..b9a46c41fc 100644 --- a/basis/sorting/title/title.factor +++ b/basis/sorting/title/title.factor @@ -4,4 +4,7 @@ USING: sorting.functor regexp kernel accessors sequences unicode.case ; IN: sorting.title -<< "title" [ >lower dup R/ ^(the|a|an|el|la|los|las|il) / first-match [ to>> tail-slice ] when* ] define-sorting >> +<< "title" [ + >lower dup R/ ^(the|a|an|el|la|los|las|il) / first-match + [ to>> tail-slice ] when* +] define-sorting >> From 1bc39df8386ae0a17da4d54f285f7da111102727 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Tue, 26 May 2009 12:01:28 -0500 Subject: [PATCH 16/24] fix using, make sure article-only title sort works --- basis/sorting/human/human.factor | 3 ++- basis/sorting/title/title-tests.factor | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/basis/sorting/human/human.factor b/basis/sorting/human/human.factor index 56de7f2f48..7487f559ed 100644 --- a/basis/sorting/human/human.factor +++ b/basis/sorting/human/human.factor @@ -1,6 +1,7 @@ ! Copyright (C) 2008 Doug Coleman, Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: math.parser peg.ebnf sorting.functor ; +USING: accessors kernel math math.order math.parser peg.ebnf +sequences sorting.functor ; IN: sorting.human : find-numbers ( string -- seq ) diff --git a/basis/sorting/title/title-tests.factor b/basis/sorting/title/title-tests.factor index 65a58e463d..1e978838c5 100644 --- a/basis/sorting/title/title-tests.factor +++ b/basis/sorting/title/title-tests.factor @@ -8,6 +8,9 @@ IN: sorting.title.tests "The Beatles" "A river runs through it" "Another" + "The" + "A" + "Los" "la vida loca" "Basketball" "racquetball" @@ -21,6 +24,7 @@ IN: sorting.title.tests } ; [ { + "A" "Another" "Basketball" "The Beatles" @@ -29,10 +33,12 @@ IN: sorting.title.tests "for the horde" "Los Fujis" "los Fujis" + "Los" "of mice and men" "on belay" "racquetball" "A river runs through it" + "The" "la vida loca" } ] [ From 38a8e80ba99cd6c9f722bbd0528134a5d8922e60 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Tue, 26 May 2009 17:46:41 -0500 Subject: [PATCH 17/24] unbackwardsify hmac keys --- basis/checksums/hmac/hmac-tests.factor | 22 +++++++++++----------- basis/checksums/hmac/hmac.factor | 21 ++++++++++----------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/basis/checksums/hmac/hmac-tests.factor b/basis/checksums/hmac/hmac-tests.factor index ffae146614..70451252f7 100755 --- a/basis/checksums/hmac/hmac-tests.factor +++ b/basis/checksums/hmac/hmac-tests.factor @@ -6,43 +6,43 @@ IN: checksums.hmac.tests [ "\u000092\u000094rz68\u0000bb\u00001c\u000013\u0000f4\u00008e\u0000f8\u000015\u00008b\u0000fc\u00009d" ] [ - 16 11 "Hi There" md5 hmac-bytes >string ] unit-test + "Hi There" 16 11 md5 hmac-bytes >string ] unit-test [ "u\u00000cx>j\u0000b0\u0000b5\u000003\u0000ea\u0000a8n1\n]\u0000b78" ] -[ "Jefe" "what do ya want for nothing?" md5 hmac-bytes >string ] unit-test +[ "what do ya want for nothing?" "Jefe" md5 hmac-bytes >string ] unit-test [ "V\u0000be4R\u00001d\u000014L\u000088\u0000db\u0000b8\u0000c73\u0000f0\u0000e8\u0000b3\u0000f6" ] [ - 16 HEX: aa - 50 HEX: dd md5 hmac-bytes >string + 50 HEX: dd + 16 HEX: aa md5 hmac-bytes >string ] unit-test [ "g[\u00000b:\eM\u0000dfN\u000012Hr\u0000dal/c+\u0000fe\u0000d9W\u0000e9" ] [ - 16 11 "Hi There" sha1 hmac-bytes >string + "Hi There" 16 11 sha1 hmac-bytes >string ] unit-test [ "\u0000ef\u0000fc\u0000dfj\u0000e5\u0000eb/\u0000a2\u0000d2t\u000016\u0000d5\u0000f1\u000084\u0000df\u00009c%\u00009a|y" ] [ - "Jefe" "what do ya want for nothing?" sha1 hmac-bytes >string + "what do ya want for nothing?" "Jefe" sha1 hmac-bytes >string ] unit-test [ "\u0000d70YM\u000016~5\u0000d5\u000095o\u0000d8\0=\r\u0000b3\u0000d3\u0000f4m\u0000c7\u0000bb" ] [ - 16 HEX: aa - 50 HEX: dd sha1 hmac-bytes >string + 50 HEX: dd + 16 HEX: aa sha1 hmac-bytes >string ] unit-test [ "b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7" ] -[ 20 HEX: b "Hi There" sha-256 hmac-bytes hex-string ] unit-test +[ "Hi There" 20 HEX: b sha-256 hmac-bytes hex-string ] unit-test [ "167f928588c5cc2eef8e3093caa0e87c9ff566a14794aa61648d81621a2a40c6" ] [ - "JefeJefeJefeJefeJefeJefeJefeJefe" - "what do ya want for nothing?" sha-256 hmac-bytes hex-string + "what do ya want for nothing?" + "JefeJefeJefeJefeJefeJefeJefeJefe" sha-256 hmac-bytes hex-string ] unit-test diff --git a/basis/checksums/hmac/hmac.factor b/basis/checksums/hmac/hmac.factor index b163766016..9ec78248a1 100755 --- a/basis/checksums/hmac/hmac.factor +++ b/basis/checksums/hmac/hmac.factor @@ -13,27 +13,26 @@ IN: checksums.hmac : ipad ( checksum-state -- seq ) block-size>> HEX: 36 ; -:: init-K ( K checksum checksum-state -- o i ) - checksum-state block-size>> K length < - [ K checksum checksum-bytes ] [ K ] if +:: init-key ( checksum key checksum-state -- o i ) + checksum-state block-size>> key length < + [ key checksum checksum-bytes ] [ key ] if checksum-state block-size>> 0 pad-tail [ checksum-state opad seq-bitxor ] [ checksum-state ipad seq-bitxor ] bi ; PRIVATE> -:: hmac-stream ( K stream checksum -- value ) - K checksum dup initialize-checksum-state - dup :> checksum-state - init-K :> Ki :> Ko +:: hmac-stream ( stream key checksum -- value ) + checksum initialize-checksum-state :> checksum-state + checksum key checksum-state init-key :> Ki :> Ko checksum-state Ki add-checksum-bytes stream add-checksum-stream get-checksum checksum initialize-checksum-state Ko add-checksum-bytes swap add-checksum-bytes get-checksum ; -: hmac-file ( K path checksum -- value ) - [ binary ] dip hmac-stream ; +: hmac-file ( path key checksum -- value ) + [ binary ] 2dip hmac-stream ; -: hmac-bytes ( K seq checksum -- value ) - [ binary ] dip hmac-stream ; +: hmac-bytes ( seq key checksum -- value ) + [ binary ] 2dip hmac-stream ; From 1d721a32c15de6e3c3cb8b29b1337b523c325144 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Tue, 26 May 2009 21:05:46 -0500 Subject: [PATCH 18/24] check in kobie's image rotation code --- extra/images/processing/rotation/authors.txt | 2 + .../processing/rotation/rotation-tests.factor | 77 ++++++++++++++++++ .../processing/rotation/rotation.factor | 71 ++++++++++++++++ .../rotation/test-bitmaps/PastedImage.bmp | Bin 0 -> 43702 bytes .../rotation/test-bitmaps/PastedImage90.bmp | Bin 0 -> 43578 bytes .../processing/rotation/test-bitmaps/lake.bmp | Bin 0 -> 485 bytes .../rotation/test-bitmaps/small-rotated.bmp | Bin 0 -> 454 bytes .../rotation/test-bitmaps/small.bmp | Bin 0 -> 470 bytes 8 files changed, 150 insertions(+) create mode 100644 extra/images/processing/rotation/authors.txt create mode 100755 extra/images/processing/rotation/rotation-tests.factor create mode 100644 extra/images/processing/rotation/rotation.factor create mode 100755 extra/images/processing/rotation/test-bitmaps/PastedImage.bmp create mode 100755 extra/images/processing/rotation/test-bitmaps/PastedImage90.bmp create mode 100755 extra/images/processing/rotation/test-bitmaps/lake.bmp create mode 100755 extra/images/processing/rotation/test-bitmaps/small-rotated.bmp create mode 100755 extra/images/processing/rotation/test-bitmaps/small.bmp diff --git a/extra/images/processing/rotation/authors.txt b/extra/images/processing/rotation/authors.txt new file mode 100644 index 0000000000..07c95811a0 --- /dev/null +++ b/extra/images/processing/rotation/authors.txt @@ -0,0 +1,2 @@ +Kobie Lurie +Doug Coleman diff --git a/extra/images/processing/rotation/rotation-tests.factor b/extra/images/processing/rotation/rotation-tests.factor new file mode 100755 index 0000000000..ffad4130b5 --- /dev/null +++ b/extra/images/processing/rotation/rotation-tests.factor @@ -0,0 +1,77 @@ +! Copyright (C) 2009 Kobie Lurie, Doug Coleman. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors fry images.loader images.normalization +images.processing.rotation kernel literals math sequences +tools.test images.processing.rotation.private ; +IN: images.processing.rotation.tests + +: first-row ( seq^2 -- seq ) first ; +: first-col ( seq^2 -- item ) harvest [ first ] map ; +: last-row ( seq^2 -- item ) last ; +: last-col ( seq^2 -- item ) harvest [ last ] map ; +: end-of-first-row ( seq^2 -- item ) first-row last ; +: first-of-first-row ( seq^2 -- item ) first-row first ; +: end-of-last-row ( seq^2 -- item ) last-row last ; +: first-of-last-row ( seq^2 -- item ) last-row first ; + +<< + +: clone-image ( image -- new-image ) + clone [ clone ] change-bitmap ; + +>> + +CONSTANT: pasted-image + $[ + "vocab:images/processing/rotation/test-bitmaps/PastedImage.bmp" + load-image normalize-image clone-image + ] + +CONSTANT: pasted-image90 + $[ + "vocab:images/processing/rotation/test-bitmaps/PastedImage90.bmp" + load-image normalize-image clone-image + ] + +CONSTANT: lake-image + $[ + "vocab:images/processing/rotation/test-bitmaps/lake.bmp" + load-image preprocess + ] + +[ t ] [ pasted-image dup clone-image 4 [ 90 rotate ] times = ] unit-test +[ t ] [ pasted-image dup clone-image 2 [ 180 rotate ] times = ] unit-test +[ t ] [ pasted-image dup clone-image 270 rotate 90 rotate = ] unit-test +[ t ] [ + pasted-image dup clone-image dup { 90 180 90 } [ rotate drop ] with each = +] unit-test + +[ t ] [ + pasted-image 90 rotate + pasted-image90 = +] unit-test + +[ t ] [ + "vocab:images/processing/rotation/test-bitmaps/small.bmp" + load-image 90 rotate + "vocab:images/processing/rotation/test-bitmaps/small-rotated.bmp" + load-image normalize-image = +] unit-test + +[ t ] [ + lake-image + [ first-of-first-row ] + [ 90 (rotate) end-of-first-row ] bi = +] unit-test + +[ t ] +[ lake-image [ first-row ] [ 90 (rotate) last-col ] bi = ] unit-test + +[ t ] +[ lake-image [ last-col ] [ 90 (rotate) last-row reverse ] bi = ] unit-test + +[ t ] +[ lake-image [ last-row ] [ 90 (rotate) first-col ] bi = ] unit-test + +[ t ] +[ lake-image [ first-col ] [ 90 (rotate) first-row reverse ] bi = ] unit-test diff --git a/extra/images/processing/rotation/rotation.factor b/extra/images/processing/rotation/rotation.factor new file mode 100644 index 0000000000..93b67e3b34 --- /dev/null +++ b/extra/images/processing/rotation/rotation.factor @@ -0,0 +1,71 @@ +! Copyright (C) 2009 Kobie Lurie. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors arrays colors combinators +combinators.short-circuit fry grouping images images.bitmap +images.loader images.normalization kernel locals math sequences ; +IN: images.processing.rotation + +ERROR: unsupported-rotation degrees ; + +> length ] [ dim>> second ] bi /i ; + +: image>byte-rows ( image -- byte-rows ) + [ bitmap>> ] [ row-length ] bi group rows-remove-pad ; + +: (seperate-to-pixels) ( byte-rows image -- pixel-rows ) + component-order>> bytes-per-pixel '[ _ group ] map ; + +: image>pixel-rows ( image -- pixel-rows ) + [ image>byte-rows ] keep (seperate-to-pixels) ; + +: flatten-table ( seq^3 -- seq ) + [ concat ] map concat ; + +: preprocess ( image -- pixelrows ) + normalize-image image>pixel-rows ; + +: ?reverse-dimensions ( image n -- ) + { 270 90 } member? [ [ reverse ] change-dim ] when drop ; + +: normalize-degree ( n -- n' ) 360 rem ; + +: processing-effect ( image quot -- image' ) + '[ preprocess @ flatten-table ] [ (>>bitmap) ] [ ] tri ; inline + +:: rotate' ( image n -- image ) + n normalize-degree :> n' + image preprocess :> pixel-table + image n' ?reverse-dimensions + pixel-table n' (rotate) :> table-rotated + image table-rotated flatten-table >>bitmap ; + +PRIVATE> + +: rotate ( image n -- image' ) + normalize-degree + [ '[ _ (rotate) ] processing-effect ] [ ?reverse-dimensions ] 2bi ; + +: reflect-y-axis ( image -- image ) + [ [ reverse ] map ] processing-effect ; + +: reflect-x-axis ( image -- image ) + [ reverse ] processing-effect ; diff --git a/extra/images/processing/rotation/test-bitmaps/PastedImage.bmp b/extra/images/processing/rotation/test-bitmaps/PastedImage.bmp new file mode 100755 index 0000000000000000000000000000000000000000..8edfedd4b55c01573c53caab5380b867826904cd GIT binary patch literal 43702 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 z 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 J1HW*U|36r0nGpa0 literal 0 HcmV?d00001 diff --git a/extra/images/processing/rotation/test-bitmaps/lake.bmp b/extra/images/processing/rotation/test-bitmaps/lake.bmp new file mode 100755 index 0000000000000000000000000000000000000000..431e4ef8ae54a49e6fe9dcfbb7dfe6611921cf3b GIT binary patch literal 485 zcma)%%L#x$3`EDP;N23e!1LnWp3;$3Sx1~r)`-jc36nw1!kU;vcJ~>mrCY$3(1C_5x)prJUxt$(sLR UkU%|9cvQr5i9Vt1`U7R|0QP}-@c;k- literal 0 HcmV?d00001 diff --git a/extra/images/processing/rotation/test-bitmaps/small-rotated.bmp b/extra/images/processing/rotation/test-bitmaps/small-rotated.bmp new file mode 100755 index 0000000000000000000000000000000000000000..571ea835ffe7948a5c48c781b78905126194bb26 GIT binary patch literal 454 zcmcJI!3}^g3(p>h>6M}?ogZW%8LrgEpDXcIlp4l8h=*DOtzk@D{_AhyVtLa5 literal 0 HcmV?d00001 From 5e4506c98794ec2157506d24a4b0b985e44ae13e Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Tue, 26 May 2009 21:07:14 -0500 Subject: [PATCH 19/24] misspelled kobi's name --- extra/images/processing/rotation/authors.txt | 2 +- extra/images/processing/rotation/rotation-tests.factor | 2 +- extra/images/processing/rotation/rotation.factor | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/extra/images/processing/rotation/authors.txt b/extra/images/processing/rotation/authors.txt index 07c95811a0..09801441c8 100644 --- a/extra/images/processing/rotation/authors.txt +++ b/extra/images/processing/rotation/authors.txt @@ -1,2 +1,2 @@ -Kobie Lurie +Kobi Lurie Doug Coleman diff --git a/extra/images/processing/rotation/rotation-tests.factor b/extra/images/processing/rotation/rotation-tests.factor index ffad4130b5..493f09b145 100755 --- a/extra/images/processing/rotation/rotation-tests.factor +++ b/extra/images/processing/rotation/rotation-tests.factor @@ -1,4 +1,4 @@ -! Copyright (C) 2009 Kobie Lurie, Doug Coleman. +! Copyright (C) 2009 Kobi Lurie, Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. USING: accessors fry images.loader images.normalization images.processing.rotation kernel literals math sequences diff --git a/extra/images/processing/rotation/rotation.factor b/extra/images/processing/rotation/rotation.factor index 93b67e3b34..c10bfa0ee0 100644 --- a/extra/images/processing/rotation/rotation.factor +++ b/extra/images/processing/rotation/rotation.factor @@ -1,4 +1,4 @@ -! Copyright (C) 2009 Kobie Lurie. +! Copyright (C) 2009 Kobi Lurie. ! See http://factorcode.org/license.txt for BSD license. USING: accessors arrays colors combinators combinators.short-circuit fry grouping images images.bitmap From d44216735484cc6259e6a7f78955522621322c90 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 27 May 2009 19:36:52 -0500 Subject: [PATCH 20/24] tools.annotations: work better on generic words --- .../tools/annotations/annotations-docs.factor | 5 --- .../annotations/annotations-tests.factor | 3 ++ basis/tools/annotations/annotations.factor | 35 ++++++++----------- 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/basis/tools/annotations/annotations-docs.factor b/basis/tools/annotations/annotations-docs.factor index 005f5f7af8..8d73d85fb5 100644 --- a/basis/tools/annotations/annotations-docs.factor +++ b/basis/tools/annotations/annotations-docs.factor @@ -39,11 +39,6 @@ HELP: breakpoint-if { $values { "quot" { $quotation "( -- ? )" } } { "word" word } } { $description "Annotates a word definition to enter the single stepper if the quotation yields true." } ; -HELP: annotate-methods -{ $values - { "word" word } { "quot" quotation } } -{ $description "Annotates the word -- for generic words, all its methods -- with the quotation." } ; - HELP: reset { $values { "word" word } } diff --git a/basis/tools/annotations/annotations-tests.factor b/basis/tools/annotations/annotations-tests.factor index bbd2ac2ca8..c312b54edb 100644 --- a/basis/tools/annotations/annotations-tests.factor +++ b/basis/tools/annotations/annotations-tests.factor @@ -39,6 +39,9 @@ M: object another-generic ; [ "" ] [ [ 3 another-generic drop ] with-string-writer ] unit-test +! reset should do the right thing for generic words +[ ] [ \ another-generic watch ] unit-test + GENERIC: blah-generic ( a -- b ) M: string blah-generic ; diff --git a/basis/tools/annotations/annotations.factor b/basis/tools/annotations/annotations.factor index 3cb74fb00b..3aac371a6a 100644 --- a/basis/tools/annotations/annotations.factor +++ b/basis/tools/annotations/annotations.factor @@ -9,8 +9,7 @@ IN: tools.annotations GENERIC: reset ( word -- ) M: generic reset - [ call-next-method ] - [ subwords [ reset ] each ] bi ; + subwords [ reset ] each ; M: word reset dup "unannotated-def" word-prop [ @@ -22,6 +21,8 @@ M: word reset ERROR: cannot-annotate-twice word ; +M: cannot-annotate-twice summary drop "Cannot annotate a word twice" ; + > "unannotated-def" set-word-prop ; - -: (annotate) ( word quot -- ) - [ dup def>> ] dip call( old -- new ) define ; - PRIVATE> -: annotate ( word quot -- ) +GENERIC# annotate 1 ( word quot -- ) + +M: generic annotate + [ "methods" word-prop values ] dip '[ _ annotate ] each ; + +M: word annotate [ check-annotate-twice ] dip - [ over save-unannotated-def (annotate) ] with-compilation-unit ; + [ + [ dup def>> 2dup "unannotated-def" set-word-prop ] dip + call( old -- new ) define + ] with-compilation-unit ; : watch-vars ( word vars -- ) dupd '[ [ _ _ ] dip (watch-vars) ] annotate ; -GENERIC# annotate-methods 1 ( word quot -- ) - -M: generic annotate-methods - [ "methods" word-prop values ] dip [ annotate ] curry each ; - -M: word annotate-methods - annotate ; - : breakpoint ( word -- ) - [ add-breakpoint ] annotate-methods ; + [ add-breakpoint ] annotate ; : breakpoint-if ( word quot -- ) - '[ [ _ [ [ break ] when ] ] dip 3append ] annotate-methods ; + '[ [ _ [ [ break ] when ] ] dip 3append ] annotate ; SYMBOL: word-timing From a4b2fa2aeb2cb90e0ece2b5b2eed8c1273930ba8 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 27 May 2009 19:37:03 -0500 Subject: [PATCH 21/24] destructors: improve docs --- core/destructors/destructors-docs.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/destructors/destructors-docs.factor b/core/destructors/destructors-docs.factor index 0b6ca15f31..536ee19c8b 100644 --- a/core/destructors/destructors-docs.factor +++ b/core/destructors/destructors-docs.factor @@ -26,7 +26,7 @@ HELP: with-disposal HELP: with-destructors { $values { "quot" "a quotation" } } -{ $description "Calls a quotation within a new dynamic scope. This quotation may register destructors, on any object, by wrapping the object in a destructor and implementing " { $link dispose } " on that object type. After the quotation finishes, if an error was thrown, all destructors are called and the error is then rethrown. However, if the quotation was successful, only those destructors created with an 'always cleanup' flag will be destroyed." } +{ $description "Calls a quotation within a new dynamic scope. This quotation may register destructors using " { $link &dispose } " or " { $link |dispose } ". The former registers a destructor that will always run whether or not the quotation threw an error, and the latter registers a destructor that only runs if the quotation throws an error only. Destructors are run in reverse order from the order in which they were registered." } { $notes "Destructors generalize " { $link with-disposal } ". The following two lines are equivalent, except that the second line establishes a new dynamic scope:" { $code From 430b1f50b9a0ac45aa3d7f651f33a376450ee60c Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 27 May 2009 19:37:12 -0500 Subject: [PATCH 22/24] webapps.planet: fix edit-blog action --- extra/webapps/planet/planet.factor | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/extra/webapps/planet/planet.factor b/extra/webapps/planet/planet.factor index 52d64f0f9e..12b7ccda24 100755 --- a/extra/webapps/planet/planet.factor +++ b/extra/webapps/planet/planet.factor @@ -166,9 +166,7 @@ posting "POSTINGS" [ f [ deposit-blog-slots ] - [ "id" value >>id ] - [ update-tuple ] - tri + [ "id" value >>id update-tuple ] bi "$planet/admin" >>path From ef73bc67321f5fa59aafc8f5c12a01f3a90a4ab0 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 28 May 2009 02:50:57 -0500 Subject: [PATCH 23/24] io.encodings.utf16: cleanup --- core/io/encodings/utf16/utf16.factor | 40 +++++++++++++--------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/core/io/encodings/utf16/utf16.factor b/core/io/encodings/utf16/utf16.factor index a6ccc95bf5..1fb5ad1116 100644 --- a/core/io/encodings/utf16/utf16.factor +++ b/core/io/encodings/utf16/utf16.factor @@ -59,7 +59,7 @@ M: utf16be decode-char ] [ append-nums ] if ; : begin-utf16le ( stream byte -- stream char ) - over stream-read1 [ double-le ] [ drop replacement-char ] if* ; + over stream-read1 dup [ double-le ] [ 2drop replacement-char ] if ; M: utf16le decode-char drop dup stream-read1 dup [ begin-utf16le ] when nip ; @@ -68,36 +68,34 @@ M: utf16le decode-char : encode-first ( char -- byte1 byte2 ) -10 shift - dup -8 shift BIN: 11011000 bitor - swap HEX: FF bitand ; + [ -8 shift BIN: 11011000 bitor ] [ HEX: FF bitand ] bi ; : encode-second ( char -- byte3 byte4 ) BIN: 1111111111 bitand - dup -8 shift BIN: 11011100 bitor - swap BIN: 11111111 bitand ; + [ -8 shift BIN: 11011100 bitor ] [ BIN: 11111111 bitand ] bi ; -: stream-write2 ( stream char1 char2 -- ) - rot [ stream-write1 ] curry bi@ ; +: stream-write2 ( char1 char2 stream -- ) + [ stream-write1 ] curry bi@ ; -: char>utf16be ( stream char -- ) - dup HEX: FFFF > [ - HEX: 10000 - - 2dup encode-first stream-write2 - encode-second stream-write2 - ] [ h>b/b swap stream-write2 ] if ; +: char>utf16be ( char stream -- ) + over HEX: FFFF > [ + [ HEX: 10000 - ] dip + [ [ encode-first ] dip stream-write2 ] + [ [ encode-second ] dip stream-write2 ] 2bi + ] [ [ h>b/b swap ] dip stream-write2 ] if ; M: utf16be encode-char ( char stream encoding -- ) - drop swap char>utf16be ; + drop char>utf16be ; -: char>utf16le ( char stream -- ) - dup HEX: FFFF > [ - HEX: 10000 - - 2dup encode-first swap stream-write2 - encode-second swap stream-write2 - ] [ h>b/b stream-write2 ] if ; +: char>utf16le ( stream char -- ) + over HEX: FFFF > [ + [ HEX: 10000 - ] dip + [ [ encode-first swap ] dip stream-write2 ] + [ [ encode-second swap ] dip stream-write2 ] 2bi + ] [ [ h>b/b ] dip stream-write2 ] if ; M: utf16le encode-char ( char stream encoding -- ) - drop swap char>utf16le ; + drop char>utf16le ; ! UTF-16 From 0dffd311a530f9f6c53619bf0418613ab9c73ede Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 28 May 2009 02:52:05 -0500 Subject: [PATCH 24/24] descriptive: update for tools.annotations change --- extra/descriptive/descriptive.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extra/descriptive/descriptive.factor b/extra/descriptive/descriptive.factor index 9af94aa4ed..0756c5c975 100755 --- a/extra/descriptive/descriptive.factor +++ b/extra/descriptive/descriptive.factor @@ -28,7 +28,7 @@ PRIVATE> : make-descriptive ( word -- ) dup [ ] [ def>> ] [ stack-effect ] tri [descriptive] - '[ drop _ ] annotate-methods ; + '[ drop _ ] annotate ; : define-descriptive ( word def effect -- ) [ drop "descriptive-definition" set-word-prop ]