diff --git a/basis/alien/structs/fields/fields.factor b/basis/alien/structs/fields/fields.factor index 17294aed87..abce91f56f 100644 --- a/basis/alien/structs/fields/fields.factor +++ b/basis/alien/structs/fields/fields.factor @@ -29,7 +29,7 @@ PREDICATE: slot-writer < word "writing" word-prop >boolean ; writer>> swap "writing" set-word-prop ; : reader-word ( class name vocab -- word ) - [ "-" swap 3append ] dip create ; + [ "-" glue ] dip create ; : writer-word ( class name vocab -- word ) [ [ swap "set-" % % "-" % % ] "" make ] dip create ; diff --git a/basis/db/queries/queries.factor b/basis/db/queries/queries.factor index b181aab23b..a96398ff2c 100644 --- a/basis/db/queries/queries.factor +++ b/basis/db/queries/queries.factor @@ -162,22 +162,19 @@ M: db ( tuple class -- statement ) where-clause ] query-make ; -: splice ( string1 string2 string3 -- string ) - swap 3append ; - : do-group ( tuple groups -- ) dup string? [ 1array ] when - [ ", " join " group by " splice ] curry change-sql drop ; + [ ", " join " group by " glue ] curry change-sql drop ; : do-order ( tuple order -- ) dup string? [ 1array ] when - [ ", " join " order by " splice ] curry change-sql drop ; + [ ", " join " order by " glue ] curry change-sql drop ; : do-offset ( tuple n -- ) - [ number>string " offset " splice ] curry change-sql drop ; + [ number>string " offset " glue ] curry change-sql drop ; : do-limit ( tuple n -- ) - [ number>string " limit " splice ] curry change-sql drop ; + [ number>string " limit " glue ] curry change-sql drop ; : make-query* ( tuple query -- tuple' ) dupd diff --git a/basis/db/types/types-docs.factor b/basis/db/types/types-docs.factor index f1a6ba6c6c..bd0b443fbe 100644 --- a/basis/db/types/types-docs.factor +++ b/basis/db/types/types-docs.factor @@ -147,12 +147,6 @@ HELP: get-slot-named { "value" "the value stored in the slot" } } { $description "Returns the value stored in a tuple slot, where the tuple slot is a string." } ; -HELP: join-space -{ $values - { "string1" string } { "string2" string } - { "new-string" null } } -{ $description "" } ; - HELP: literal-bind { $description "" } ; diff --git a/basis/db/types/types.factor b/basis/db/types/types.factor index 6a889689ce..da9fe39b80 100644 --- a/basis/db/types/types.factor +++ b/basis/db/types/types.factor @@ -158,12 +158,6 @@ ERROR: no-sql-type type ; modifiers>> [ lookup-modifier ] map " " join [ "" ] [ " " prepend ] if-empty ; -: join-space ( string1 string2 -- new-string ) - " " swap 3append ; - -: paren ( string -- new-string ) - "(" swap ")" 3append ; - HOOK: bind% db ( spec -- ) HOOK: bind# db ( spec obj -- ) @@ -171,7 +165,7 @@ ERROR: no-column column ; : >reference-string ( string pair -- string ) first2 - [ [ unparse join-space ] [ db-columns ] bi ] dip + [ [ unparse " " glue ] [ db-columns ] bi ] dip swap [ column-name>> = ] with find nip [ no-column ] unless* - column-name>> paren append ; + column-name>> "(" ")" surround append ; diff --git a/basis/environment/environment.factor b/basis/environment/environment.factor index d6ce34dbcf..e60a52c995 100644 --- a/basis/environment/environment.factor +++ b/basis/environment/environment.factor @@ -18,7 +18,7 @@ HOOK: (set-os-envs) os ( seq -- ) (os-envs) [ "=" split1 ] H{ } map>assoc ; : set-os-envs ( assoc -- ) - [ "=" swap 3append ] { } assoc>map (set-os-envs) ; + [ "=" glue ] { } assoc>map (set-os-envs) ; { { [ os unix? ] [ "environment.unix" require ] } diff --git a/extra/ftp/client/authors.txt b/basis/ftp/client/authors.txt similarity index 100% rename from extra/ftp/client/authors.txt rename to basis/ftp/client/authors.txt diff --git a/extra/ftp/client/client.factor b/basis/ftp/client/client.factor similarity index 100% rename from extra/ftp/client/client.factor rename to basis/ftp/client/client.factor diff --git a/extra/ftp/client/listing-parser/authors.txt b/basis/ftp/client/listing-parser/authors.txt similarity index 100% rename from extra/ftp/client/listing-parser/authors.txt rename to basis/ftp/client/listing-parser/authors.txt diff --git a/extra/ftp/client/listing-parser/listing-parser.factor b/basis/ftp/client/listing-parser/listing-parser.factor similarity index 100% rename from extra/ftp/client/listing-parser/listing-parser.factor rename to basis/ftp/client/listing-parser/listing-parser.factor diff --git a/extra/ftp/client/tags.txt b/basis/ftp/client/tags.txt similarity index 100% rename from extra/ftp/client/tags.txt rename to basis/ftp/client/tags.txt diff --git a/extra/ftp/ftp.factor b/basis/ftp/ftp.factor similarity index 100% rename from extra/ftp/ftp.factor rename to basis/ftp/ftp.factor diff --git a/extra/ftp/server/server.factor b/basis/ftp/server/server.factor similarity index 98% rename from extra/ftp/server/server.factor rename to basis/ftp/server/server.factor index 342c6a3c95..b0ec340202 100644 --- a/extra/ftp/server/server.factor +++ b/basis/ftp/server/server.factor @@ -7,8 +7,7 @@ namespaces make sequences ftp io.unix.launcher.parser unicode.case splitting assocs classes io.servers.connection destructors calendar io.timeouts io.streams.duplex threads continuations math concurrency.promises byte-arrays -io.backend sequences.lib tools.hexdump tools.files -io.streams.string ; +io.backend tools.hexdump tools.files io.streams.string ; IN: ftp.server TUPLE: ftp-client url mode state command-promise user password ; @@ -231,7 +230,7 @@ M: ftp-put service-command ( stream obj -- ) expect-connection [ "Entering Passive Mode (127,0,0,1," % - port>bytes [ number>string ] bi@ "," splice % + port>bytes [ number>string ] bi@ "," glue % ")" % ] "" make 227 swap server-response ; diff --git a/extra/ftp/server/tags.txt b/basis/ftp/server/tags.txt similarity index 100% rename from extra/ftp/server/tags.txt rename to basis/ftp/server/tags.txt diff --git a/extra/ftp/tags.txt b/basis/ftp/tags.txt similarity index 100% rename from extra/ftp/tags.txt rename to basis/ftp/tags.txt diff --git a/basis/furnace/utilities/utilities.factor b/basis/furnace/utilities/utilities.factor index f2b71fb89f..7f71a131ed 100644 --- a/basis/furnace/utilities/utilities.factor +++ b/basis/furnace/utilities/utilities.factor @@ -7,7 +7,7 @@ http.server.redirection http.server.remapping ; IN: furnace.utilities : word>string ( word -- string ) - [ vocabulary>> ] [ name>> ] bi ":" swap 3append ; + [ vocabulary>> ] [ name>> ] bi ":" glue ; : words>strings ( seq -- seq' ) [ word>string ] map ; diff --git a/basis/http/http.factor b/basis/http/http.factor index c90a1872ce..d006c86462 100644 --- a/basis/http/http.factor +++ b/basis/http/http.factor @@ -111,7 +111,7 @@ TUPLE: cookie name value version comment path domain expires max-age http-only s { [ dup real? ] [ number>string ] } [ ] } cond - [ check-cookie-string ] bi@ "=" swap 3append , + [ check-cookie-string ] bi@ "=" glue , ] } case ; diff --git a/extra/io/files/unique/backend/backend.factor b/basis/io/files/unique/backend/backend.factor similarity index 100% rename from extra/io/files/unique/backend/backend.factor rename to basis/io/files/unique/backend/backend.factor diff --git a/extra/io/files/unique/unique-docs.factor b/basis/io/files/unique/unique-docs.factor similarity index 100% rename from extra/io/files/unique/unique-docs.factor rename to basis/io/files/unique/unique-docs.factor diff --git a/extra/io/files/unique/unique-tests.factor b/basis/io/files/unique/unique-tests.factor similarity index 100% rename from extra/io/files/unique/unique-tests.factor rename to basis/io/files/unique/unique-tests.factor diff --git a/extra/io/files/unique/unique.factor b/basis/io/files/unique/unique.factor similarity index 87% rename from extra/io/files/unique/unique.factor rename to basis/io/files/unique/unique.factor index 3a6c556846..ec89517bbc 100644 --- a/extra/io/files/unique/unique.factor +++ b/basis/io/files/unique/unique.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2008 Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. -USING: kernel math math.bitwise combinators.lib math.parser -random sequences sequences.lib continuations namespaces +USING: kernel math math.bitwise math.parser +random sequences continuations namespaces io.files io arrays io.files.unique.backend system combinators vocabs.loader fry ; IN: io.files.unique @@ -29,7 +29,7 @@ PRIVATE> : make-unique-file ( prefix suffix -- path ) temporary-path -rot [ - unique-length get random-name swap 3append append-path + unique-length get random-name glue append-path dup (make-unique-file) ] 3curry unique-retries get retry ; diff --git a/basis/io/servers/connection/connection.factor b/basis/io/servers/connection/connection.factor index 6c7ff7e0f1..2d990e6483 100644 --- a/basis/io/servers/connection/connection.factor +++ b/basis/io/servers/connection/connection.factor @@ -79,7 +79,7 @@ M: threaded-server handle-client* handler>> call ; \ handle-client ERROR add-error-logging : thread-name ( server-name addrspec -- string ) - unparse-short " connection from " swap 3append ; + unparse-short " connection from " glue ; : accept-connection ( threaded-server -- ) [ accept ] [ addr>> ] bi diff --git a/basis/io/sockets/sockets.factor b/basis/io/sockets/sockets.factor index ce7c4f6ddd..fbfae333c0 100644 --- a/basis/io/sockets/sockets.factor +++ b/basis/io/sockets/sockets.factor @@ -115,7 +115,7 @@ M: invalid-inet6 summary drop "Invalid IPv6 address" ; : pad-inet6 ( string1 string2 -- seq ) 2dup [ length ] bi@ + 8 swap - dup 0 < [ "More than 8 components" throw ] when - swap 3append ; + glue ; : inet6-bytes ( seq -- bytes ) [ 2 >be ] { } map-as concat >byte-array ; diff --git a/basis/io/unix/files/netbsd/netbsd.factor b/basis/io/unix/files/netbsd/netbsd.factor index c200331db5..23717b41a4 100644 --- a/basis/io/unix/files/netbsd/netbsd.factor +++ b/basis/io/unix/files/netbsd/netbsd.factor @@ -4,7 +4,7 @@ USING: alien.syntax kernel unix.stat math unix combinators system io.backend accessors alien.c-types io.encodings.utf8 alien.strings unix.types io.unix.files io.files unix.statvfs.netbsd unix.getfsstat.netbsd -grouping sequences ; +grouping sequences io.encodings.utf8 ; IN: io.unix.files.netbsd TUPLE: netbsd-file-system-info < unix-file-system-info @@ -40,13 +40,13 @@ M: netbsd statvfs>file-system-info ( file-system-info statvfs -- file-system-inf [ statvfs-f_namemax >>name-max ] [ statvfs-f_owner >>owner ] ! [ statvfs-f_spare >>spare ] - [ statvfs-f_fstypename alien>native-string >>type ] - [ statvfs-f_mntonname alien>native-string >>mount-point ] - [ statvfs-f_mntfromname alien>native-string >>device-name ] + [ statvfs-f_fstypename utf8 alien>string >>type ] + [ statvfs-f_mntonname utf8 alien>string >>mount-point ] + [ statvfs-f_mntfromname utf8 alien>string >>device-name ] } cleave ; M: netbsd file-systems ( -- array ) f 0 0 getvfsstat dup io-error "statvfs" dup dup length 0 getvfsstat io-error "statvfs" heap-size group - [ statvfs-f_mntonname alien>native-string file-system-info ] map ; + [ statvfs-f_mntonname utf8 alien>string file-system-info ] map ; diff --git a/basis/io/unix/launcher/launcher.factor b/basis/io/unix/launcher/launcher.factor index 7a1cac3ff1..c81da60e12 100644 --- a/basis/io/unix/launcher/launcher.factor +++ b/basis/io/unix/launcher/launcher.factor @@ -16,7 +16,7 @@ USE: unix command>> dup string? [ tokenize-command ] when ; : assoc>env ( assoc -- env ) - [ "=" swap 3append ] { } assoc>map ; + [ "=" glue ] { } assoc>map ; : setup-priority ( process -- process ) dup priority>> [ diff --git a/extra/math/blas/cblas/authors.txt b/basis/math/blas/cblas/authors.txt similarity index 100% rename from extra/math/blas/cblas/authors.txt rename to basis/math/blas/cblas/authors.txt diff --git a/extra/math/blas/cblas/cblas.factor b/basis/math/blas/cblas/cblas.factor similarity index 100% rename from extra/math/blas/cblas/cblas.factor rename to basis/math/blas/cblas/cblas.factor diff --git a/extra/math/blas/cblas/summary.txt b/basis/math/blas/cblas/summary.txt similarity index 100% rename from extra/math/blas/cblas/summary.txt rename to basis/math/blas/cblas/summary.txt diff --git a/extra/math/blas/cblas/tags.txt b/basis/math/blas/cblas/tags.txt similarity index 100% rename from extra/math/blas/cblas/tags.txt rename to basis/math/blas/cblas/tags.txt diff --git a/extra/math/blas/matrices/authors.txt b/basis/math/blas/matrices/authors.txt similarity index 100% rename from extra/math/blas/matrices/authors.txt rename to basis/math/blas/matrices/authors.txt diff --git a/extra/math/blas/matrices/matrices-docs.factor b/basis/math/blas/matrices/matrices-docs.factor similarity index 100% rename from extra/math/blas/matrices/matrices-docs.factor rename to basis/math/blas/matrices/matrices-docs.factor diff --git a/extra/math/blas/matrices/matrices-tests.factor b/basis/math/blas/matrices/matrices-tests.factor similarity index 100% rename from extra/math/blas/matrices/matrices-tests.factor rename to basis/math/blas/matrices/matrices-tests.factor diff --git a/extra/math/blas/matrices/matrices.factor b/basis/math/blas/matrices/matrices.factor similarity index 100% rename from extra/math/blas/matrices/matrices.factor rename to basis/math/blas/matrices/matrices.factor diff --git a/extra/math/blas/matrices/summary.txt b/basis/math/blas/matrices/summary.txt similarity index 100% rename from extra/math/blas/matrices/summary.txt rename to basis/math/blas/matrices/summary.txt diff --git a/extra/math/blas/matrices/tags.txt b/basis/math/blas/matrices/tags.txt similarity index 100% rename from extra/math/blas/matrices/tags.txt rename to basis/math/blas/matrices/tags.txt diff --git a/extra/math/blas/syntax/authors.txt b/basis/math/blas/syntax/authors.txt similarity index 100% rename from extra/math/blas/syntax/authors.txt rename to basis/math/blas/syntax/authors.txt diff --git a/extra/math/blas/syntax/summary.txt b/basis/math/blas/syntax/summary.txt similarity index 100% rename from extra/math/blas/syntax/summary.txt rename to basis/math/blas/syntax/summary.txt diff --git a/extra/math/blas/syntax/syntax-docs.factor b/basis/math/blas/syntax/syntax-docs.factor similarity index 100% rename from extra/math/blas/syntax/syntax-docs.factor rename to basis/math/blas/syntax/syntax-docs.factor diff --git a/extra/math/blas/syntax/syntax.factor b/basis/math/blas/syntax/syntax.factor similarity index 100% rename from extra/math/blas/syntax/syntax.factor rename to basis/math/blas/syntax/syntax.factor diff --git a/extra/math/blas/syntax/tags.txt b/basis/math/blas/syntax/tags.txt similarity index 100% rename from extra/math/blas/syntax/tags.txt rename to basis/math/blas/syntax/tags.txt diff --git a/extra/math/blas/vectors/authors.txt b/basis/math/blas/vectors/authors.txt similarity index 100% rename from extra/math/blas/vectors/authors.txt rename to basis/math/blas/vectors/authors.txt diff --git a/extra/math/blas/vectors/summary.txt b/basis/math/blas/vectors/summary.txt similarity index 100% rename from extra/math/blas/vectors/summary.txt rename to basis/math/blas/vectors/summary.txt diff --git a/extra/math/blas/vectors/tags.txt b/basis/math/blas/vectors/tags.txt similarity index 100% rename from extra/math/blas/vectors/tags.txt rename to basis/math/blas/vectors/tags.txt diff --git a/extra/math/blas/vectors/vectors-docs.factor b/basis/math/blas/vectors/vectors-docs.factor similarity index 100% rename from extra/math/blas/vectors/vectors-docs.factor rename to basis/math/blas/vectors/vectors-docs.factor diff --git a/extra/math/blas/vectors/vectors-tests.factor b/basis/math/blas/vectors/vectors-tests.factor similarity index 100% rename from extra/math/blas/vectors/vectors-tests.factor rename to basis/math/blas/vectors/vectors-tests.factor diff --git a/extra/math/blas/vectors/vectors.factor b/basis/math/blas/vectors/vectors.factor similarity index 100% rename from extra/math/blas/vectors/vectors.factor rename to basis/math/blas/vectors/vectors.factor diff --git a/extra/math/combinatorics/authors.txt b/basis/math/combinatorics/authors.txt similarity index 100% rename from extra/math/combinatorics/authors.txt rename to basis/math/combinatorics/authors.txt diff --git a/extra/math/combinatorics/combinatorics-docs.factor b/basis/math/combinatorics/combinatorics-docs.factor similarity index 100% rename from extra/math/combinatorics/combinatorics-docs.factor rename to basis/math/combinatorics/combinatorics-docs.factor diff --git a/extra/math/combinatorics/combinatorics-tests.factor b/basis/math/combinatorics/combinatorics-tests.factor similarity index 100% rename from extra/math/combinatorics/combinatorics-tests.factor rename to basis/math/combinatorics/combinatorics-tests.factor diff --git a/extra/math/combinatorics/combinatorics.factor b/basis/math/combinatorics/combinatorics.factor similarity index 100% rename from extra/math/combinatorics/combinatorics.factor rename to basis/math/combinatorics/combinatorics.factor diff --git a/extra/math/combinatorics/summary.txt b/basis/math/combinatorics/summary.txt similarity index 100% rename from extra/math/combinatorics/summary.txt rename to basis/math/combinatorics/summary.txt diff --git a/extra/math/polynomials/authors.txt b/basis/math/polynomials/authors.txt similarity index 100% rename from extra/math/polynomials/authors.txt rename to basis/math/polynomials/authors.txt diff --git a/extra/math/polynomials/polynomials-docs.factor b/basis/math/polynomials/polynomials-docs.factor similarity index 100% rename from extra/math/polynomials/polynomials-docs.factor rename to basis/math/polynomials/polynomials-docs.factor diff --git a/extra/math/polynomials/polynomials-tests.factor b/basis/math/polynomials/polynomials-tests.factor similarity index 100% rename from extra/math/polynomials/polynomials-tests.factor rename to basis/math/polynomials/polynomials-tests.factor diff --git a/extra/math/polynomials/polynomials.factor b/basis/math/polynomials/polynomials.factor similarity index 100% rename from extra/math/polynomials/polynomials.factor rename to basis/math/polynomials/polynomials.factor diff --git a/extra/math/polynomials/summary.txt b/basis/math/polynomials/summary.txt similarity index 100% rename from extra/math/polynomials/summary.txt rename to basis/math/polynomials/summary.txt diff --git a/extra/math/quaternions/authors.txt b/basis/math/quaternions/authors.txt similarity index 100% rename from extra/math/quaternions/authors.txt rename to basis/math/quaternions/authors.txt diff --git a/extra/math/quaternions/quaternions-docs.factor b/basis/math/quaternions/quaternions-docs.factor similarity index 100% rename from extra/math/quaternions/quaternions-docs.factor rename to basis/math/quaternions/quaternions-docs.factor diff --git a/extra/math/quaternions/quaternions-tests.factor b/basis/math/quaternions/quaternions-tests.factor similarity index 100% rename from extra/math/quaternions/quaternions-tests.factor rename to basis/math/quaternions/quaternions-tests.factor diff --git a/extra/math/quaternions/quaternions.factor b/basis/math/quaternions/quaternions.factor similarity index 100% rename from extra/math/quaternions/quaternions.factor rename to basis/math/quaternions/quaternions.factor diff --git a/extra/math/quaternions/summary.txt b/basis/math/quaternions/summary.txt similarity index 100% rename from extra/math/quaternions/summary.txt rename to basis/math/quaternions/summary.txt diff --git a/extra/math/statistics/authors.txt b/basis/math/statistics/authors.txt similarity index 100% rename from extra/math/statistics/authors.txt rename to basis/math/statistics/authors.txt diff --git a/extra/math/statistics/statistics-docs.factor b/basis/math/statistics/statistics-docs.factor similarity index 84% rename from extra/math/statistics/statistics-docs.factor rename to basis/math/statistics/statistics-docs.factor index 695834b554..7a7eb70dd2 100644 --- a/extra/math/statistics/statistics-docs.factor +++ b/basis/math/statistics/statistics-docs.factor @@ -3,13 +3,14 @@ IN: math.statistics HELP: geometric-mean { $values { "seq" "a sequence of numbers" } { "n" "a non-negative real number"} } -{ $description "Computes the geometric mean of all elements in " { $snippet "seq" } ". The geometric mean measures the central tendency of a data set that minimizes the effects of extreme values." } +{ $description "Computes the geometric mean of all elements in " { $snippet "seq" } ". The geometric mean measures the central tendency of a data set that minimizes the effects of extreme values." } { $examples { $example "USING: math.statistics prettyprint ;" "{ 1 2 3 } geometric-mean ." "1.81712059283214" } } { $errors "Throws a " { $link signal-error. } " (square-root of 0) if the sequence is empty." } ; HELP: harmonic-mean { $values { "seq" "a sequence of numbers" } { "n" "a non-negative real number"} } -{ $description "Computes the harmonic mean of the elements in " { $snippet "seq" } ". The harmonic mean is appropriate when the average of rates is desired." } +{ $description "Computes the harmonic mean of the elements in " { $snippet "seq" } ". The harmonic mean is appropriate when the average of rates is desired." } +{ $notes "Positive reals only." } { $examples { $example "USING: math.statistics prettyprint ;" "{ 1 2 3 } harmonic-mean ." "6/11" } } { $errors "Throws a " { $link signal-error. } " (divide by zero) if the sequence is empty." } ; @@ -36,21 +37,21 @@ HELP: range HELP: std { $values { "seq" "a sequence of numbers" } { "x" "a non-negative real number"} } -{ $description "Computes the standard deviation of " { $snippet "seq" } " by squaring the variance of the sequence. It measures how widely spread the values in a sequence are about the mean." } +{ $description "Computes the standard deviation of " { $snippet "seq" } ", which is the square root of the variance. It measures how widely spread the values in a sequence are about the mean." } { $examples { $example "USING: math.statistics prettyprint ;" "{ 1 2 3 } std ." "1.0" } { $example "USING: math.statistics prettyprint ;" "{ 1 2 3 4 } std ." "1.290994448735806" } } ; HELP: ste { $values { "seq" "a sequence of numbers" } { "x" "a non-negative real number"} } - { $description "Computes the standard error of the mean for " { $snippet "seq" } ". It's defined as the standard deviation divided by the square root of the length of the sequence, and measures uncertainty associated with the estimate of the mean." } + { $description "Computes the standard error of the mean for " { $snippet "seq" } ". It's defined as the standard deviation divided by the square root of the length of the sequence, and measures uncertainty associated with the estimate of the mean." } { $examples { $example "USING: math.statistics prettyprint ;" "{ -2 2 } ste ." "2.0" } { $example "USING: math.statistics prettyprint ;" "{ -2 2 2 } ste ." "1.333333333333333" } } ; HELP: var { $values { "seq" "a sequence of numbers" } { "x" "a non-negative real number"} } -{ $description "Computes the variance of " { $snippet "seq" } ". It's a measurement of the spread of values in a sequence. The larger the variance, the larger the distance of values from the mean." } +{ $description "Computes the variance of " { $snippet "seq" } ". It's a measurement of the spread of values in a sequence. The larger the variance, the larger the distance of values from the mean." } { $notes "If the number of elements in " { $snippet "seq" } " is 1 or less, it outputs 0." } { $examples { $example "USING: math.statistics prettyprint ;" "{ 1 } var ." "0" } diff --git a/extra/math/statistics/statistics-tests.factor b/basis/math/statistics/statistics-tests.factor similarity index 100% rename from extra/math/statistics/statistics-tests.factor rename to basis/math/statistics/statistics-tests.factor diff --git a/extra/math/statistics/statistics.factor b/basis/math/statistics/statistics.factor similarity index 79% rename from extra/math/statistics/statistics.factor rename to basis/math/statistics/statistics.factor index 7568af5294..d2494ee32a 100644 --- a/extra/math/statistics/statistics.factor +++ b/basis/math/statistics/statistics.factor @@ -5,20 +5,15 @@ USING: arrays combinators kernel math math.analysis math.functions sequences IN: math.statistics : mean ( seq -- n ) - #! arithmetic mean, sum divided by length [ sum ] [ length ] bi / ; : geometric-mean ( seq -- n ) - #! geometric mean, nth root of product [ length ] [ product ] bi nth-root ; : harmonic-mean ( seq -- n ) - #! harmonic mean, reciprocal of sum of reciprocals. - #! positive reals only [ recip ] sigma recip ; : median ( seq -- n ) - #! middle number if odd, avg of two middle numbers if even natural-sort dup length even? [ [ midpoint@ dup 1- 2array ] keep nths mean ] [ @@ -26,11 +21,10 @@ IN: math.statistics ] if ; : range ( seq -- n ) - #! max - min minmax swap - ; : var ( seq -- x ) - #! variance, normalize by N-1 + #! normalize by N-1 dup length 1 <= [ drop 0 ] [ @@ -39,11 +33,9 @@ IN: math.statistics ] if ; : std ( seq -- x ) - #! standard deviation, sqrt of variance var sqrt ; : ste ( seq -- x ) - #! standard error, standard deviation / sqrt ( length of sequence ) [ std ] [ length ] bi sqrt / ; : ((r)) ( mean(x) mean(y) {x} {y} -- (r) ) diff --git a/extra/math/statistics/summary.txt b/basis/math/statistics/summary.txt similarity index 100% rename from extra/math/statistics/summary.txt rename to basis/math/statistics/summary.txt diff --git a/basis/prettyprint/prettyprint.factor b/basis/prettyprint/prettyprint.factor index 82acef9b72..7c4de1e973 100644 --- a/basis/prettyprint/prettyprint.factor +++ b/basis/prettyprint/prettyprint.factor @@ -129,7 +129,7 @@ SYMBOL: -> : remove-breakpoints ( quot pos -- quot' ) over quotation? [ 1+ cut [ (remove-breakpoints) ] bi@ - [ -> ] swap 3append + [ -> ] glue ] [ drop ] if ; diff --git a/basis/random/mersenne-twister/mersenne-twister.factor b/basis/random/mersenne-twister/mersenne-twister.factor index 3097eafd15..357ab87966 100644 --- a/basis/random/mersenne-twister/mersenne-twister.factor +++ b/basis/random/mersenne-twister/mersenne-twister.factor @@ -15,11 +15,14 @@ TUPLE: mersenne-twister { seq uint-array } { i fixnum } ; : mt-m 397 ; inline : mt-a HEX: 9908b0df ; inline +: mersenne-wrap ( n -- n' ) + dup mt-n > [ mt-n - ] when ; inline + : wrap-nth ( n seq -- obj ) - [ length mod ] keep nth-unsafe ; inline + [ mersenne-wrap ] dip nth-unsafe ; inline : set-wrap-nth ( obj n seq -- ) - [ length mod ] keep set-nth-unsafe ; inline + [ mersenne-wrap ] dip set-nth-unsafe ; inline : calculate-y ( n seq -- y ) [ wrap-nth 31 mask-bit ] @@ -50,7 +53,7 @@ TUPLE: mersenne-twister { seq uint-array } { i fixnum } ; : init-mt-seq ( seed -- seq ) 32 bits mt-n - [ set-first ] [ init-mt-rest ] [ ] tri ; + [ set-first ] [ init-mt-rest ] [ ] tri ; inline : mt-temper ( y -- yt ) dup -11 shift bitxor diff --git a/basis/tools/memory/memory.factor b/basis/tools/memory/memory.factor index 70f9a10a51..8c35ae25a8 100644 --- a/basis/tools/memory/memory.factor +++ b/basis/tools/memory/memory.factor @@ -10,7 +10,7 @@ IN: tools.memory : write-size ( n -- ) number>string - dup length 4 > [ 3 cut* "," swap 3append ] when + dup length 4 > [ 3 cut* "," glue ] when " KB" append write-cell ; : write-total/used/free ( free total str -- ) diff --git a/basis/tools/vocabs/vocabs.factor b/basis/tools/vocabs/vocabs.factor index ef0c74d7c8..ab2d089d94 100644 --- a/basis/tools/vocabs/vocabs.factor +++ b/basis/tools/vocabs/vocabs.factor @@ -238,7 +238,7 @@ M: vocab-link summary vocab-summary ; vocab-dir append-path dup exists? [ subdirs ] [ drop { } ] if ] keep [ - swap [ "." swap 3append ] with map + swap [ "." glue ] with map ] unless-empty ; : vocabs-in-dir ( root name -- ) diff --git a/basis/tools/walker/walker.factor b/basis/tools/walker/walker.factor index f1a1e3c873..953291cc59 100644 --- a/basis/tools/walker/walker.factor +++ b/basis/tools/walker/walker.factor @@ -126,7 +126,7 @@ SYMBOL: +stopped+ [ 2dup length = [ nip [ break ] append ] [ 2dup nth \ break = [ nip ] [ - swap 1+ cut [ break ] swap 3append + swap 1+ cut [ break ] glue ] if ] if ] change-frame ; diff --git a/basis/urls/encoding/encoding.factor b/basis/urls/encoding/encoding.factor index fa882609a5..f621384ede 100644 --- a/basis/urls/encoding/encoding.factor +++ b/basis/urls/encoding/encoding.factor @@ -91,6 +91,6 @@ PRIVATE> [ [ [ url-encode ] dip - [ url-encode "=" swap 3append , ] with each + [ url-encode "=" glue , ] with each ] assoc-each ] { } make "&" join ; diff --git a/core/continuations/continuations-docs.factor b/core/continuations/continuations-docs.factor index 7a22306c50..f57be71ca8 100644 --- a/core/continuations/continuations-docs.factor +++ b/core/continuations/continuations-docs.factor @@ -79,6 +79,7 @@ $nl { $subsection continue-with } "Continuations as control-flow:" { $subsection attempt-all } +{ $subsection retry } { $subsection with-return } "Reflecting the datastack:" { $subsection with-datastack } @@ -237,6 +238,20 @@ HELP: attempt-all } } ; +HELP: retry +{ $values + { "quot" quotation } { "n" null } +} +{ $description "Tries the quotation up to " { $snippet "n" } " times until it returns true. Retries the quotation if an exception is thrown or if the quotation returns " { $link f } ". The quotation is expected to have side effects that may fail, such as generating a random name for a new file until successful." } +{ $examples + { $unchecked-example "USING: continuations math prettyprint ;" + "[ 5 random 0 = ] retry t" + "t" + } +} ; + +{ attempt-all retry } related-words + HELP: return { $description "Returns early from a quotation by reifying the continuation captured by " { $link with-return } " ; execution is resumed starting immediately after " { $link with-return } "." } ; diff --git a/core/continuations/continuations.factor b/core/continuations/continuations.factor index af8cda37c6..0f55009608 100644 --- a/core/continuations/continuations.factor +++ b/core/continuations/continuations.factor @@ -154,6 +154,8 @@ ERROR: attempt-all-error ; ] { } make peek swap [ rethrow ] when ] if ; inline +: retry ( quot: ( -- ? ) n -- ) swap [ drop ] prepose attempt-all ; inline + TUPLE: condition error restarts continuation ; C: condition ( error restarts cc -- condition ) diff --git a/core/effects/effects.factor b/core/effects/effects.factor index 0c082477c7..db6b2461b5 100644 --- a/core/effects/effects.factor +++ b/core/effects/effects.factor @@ -26,7 +26,7 @@ GENERIC: effect>string ( obj -- str ) M: string effect>string ; M: word effect>string name>> ; M: integer effect>string number>string ; -M: pair effect>string first2 [ effect>string ] bi@ ": " swap 3append ; +M: pair effect>string first2 [ effect>string ] bi@ ": " glue ; : stack-picture ( seq -- string ) dup integer? [ "object" ] when diff --git a/core/generic/generic.factor b/core/generic/generic.factor index 0cd5a35623..4eb39291a0 100644 --- a/core/generic/generic.factor +++ b/core/generic/generic.factor @@ -77,7 +77,7 @@ TUPLE: check-method class generic ; 3tri ; inline : method-word-name ( class word -- string ) - [ name>> ] bi@ "=>" swap 3append ; + [ name>> ] bi@ "=>" glue ; PREDICATE: method-body < word "method-generic" word-prop >boolean ; diff --git a/core/math/floats/floats-docs.factor b/core/math/floats/floats-docs.factor index a1ba16c68a..5549ef79e9 100644 --- a/core/math/floats/floats-docs.factor +++ b/core/math/floats/floats-docs.factor @@ -6,7 +6,7 @@ ARTICLE: "floats" "Floats" "Rational numbers represent " { $emphasis "exact" } " quantities. On the other hand, a floating point number is an " { $emphasis "approximation" } ". While rationals can grow to any required precision, floating point numbers are fixed-width, and manipulating them is usually faster than manipulating ratios or bignums (but slower than manipulating fixnums). Floating point numbers are often used to represent irrational numbers, which have no exact representation as a ratio of two integers." $nl "Introducing a floating point number in a computation forces the result to be expressed in floating point." -{ $example "5/4 1/2 + ." "7/4" } +{ $example "5/4 1/2 + ." "1+3/4" } { $example "5/4 0.5 + ." "1.75" } "Integers and rationals can be converted to floats:" { $subsection >float } diff --git a/core/math/parser/parser.factor b/core/math/parser/parser.factor index 8fc6e6dd9e..ac6c5e9790 100644 --- a/core/math/parser/parser.factor +++ b/core/math/parser/parser.factor @@ -128,7 +128,7 @@ M: ratio >base [ [ numerator (>base) ] [ denominator (>base) ] bi - "/" swap 3append + "/" glue ] bi* append negative? get [ CHAR: - prefix ] when ] with-radix ; diff --git a/core/sequences/sequences-docs.factor b/core/sequences/sequences-docs.factor index cc8daba8c0..08831579bb 100644 --- a/core/sequences/sequences-docs.factor +++ b/core/sequences/sequences-docs.factor @@ -714,6 +714,26 @@ HELP: 3append } } ; +HELP: surround +{ $values { "seq1" sequence } { "seq2" sequence } { "seq3" sequence } { "newseq" sequence } } +{ $description "Outputs a new sequence with " { $snippet "seq1" } " inserted between " { $snippet "seq2" } " and " { $snippet "seq3" } "." } +{ $examples + { $example "USING: sequences prettyprint ;" + "\"sssssh\" \"(\" \")\" surround ." + "\"(sssssh)\"" + } +} ; + +HELP: glue +{ $values { "seq1" sequence } { "seq2" sequence } { "seq3" sequence } { "newseq" sequence } } +{ $description "Outputs a new sequence with " { $snippet "seq3" } " inserted between " { $snippet "seq1" } " and " { $snippet "seq2" } "." } +{ $examples + { $example "USING: sequences prettyprint ;" + "\"a\" \"b\" \",\" glue ." + "\"a,b\"" + } +} ; + HELP: subseq { $values { "from" "a non-negative integer" } { "to" "a non-negative integer" } { "seq" sequence } { "subseq" "a new sequence" } } { $description "Outputs a new sequence consisting of all elements starting from and including " { $snippet "from" } ", and up to but not including " { $snippet "to" } "." } @@ -1348,6 +1368,8 @@ ARTICLE: "sequences-appending" "Appending sequences" { $subsection append } { $subsection prepend } { $subsection 3append } +{ $subsection surround } +{ $subsection glue } { $subsection concat } { $subsection join } "A pair of words useful for aligning strings:" diff --git a/core/sequences/sequences-tests.factor b/core/sequences/sequences-tests.factor index e27f2410b3..0d795d453a 100644 --- a/core/sequences/sequences-tests.factor +++ b/core/sequences/sequences-tests.factor @@ -268,3 +268,6 @@ M: bogus-hashcode hashcode* 2drop 0 >bignum ; [ { 1 3 "X" 5 7 } ] [ "X" 2 { 1 3 5 7 } insert-nth ] unit-test [ V{ 0 2 } ] [ "a" { "a" "b" "a" } indices ] unit-test + +[ "a,b" ] [ "a" "b" "," glue ] unit-test +[ "(abc)" ] [ "abc" "(" ")" surround ] unit-test diff --git a/core/sequences/sequences.factor b/core/sequences/sequences.factor index 118969bd3c..3461266081 100644 --- a/core/sequences/sequences.factor +++ b/core/sequences/sequences.factor @@ -317,6 +317,10 @@ PRIVATE> : 3append ( seq1 seq2 seq3 -- newseq ) pick 3append-as ; +: surround ( seq1 seq2 seq3 -- newseq ) swapd 3append ; inline + +: glue ( seq1 seq2 seq3 -- newseq ) swap 3append ; inline + : change-nth ( i seq quot -- ) [ [ nth ] dip call ] 3keep drop set-nth ; inline diff --git a/extra/benchmark/knucleotide/knucleotide.factor b/extra/benchmark/knucleotide/knucleotide.factor index 6bd2d69cfa..7b8e2d34c9 100644 --- a/extra/benchmark/knucleotide/knucleotide.factor +++ b/extra/benchmark/knucleotide/knucleotide.factor @@ -9,7 +9,7 @@ IN: benchmark.knucleotide "." split1 rot over length over < [ CHAR: 0 pad-right ] - [ head ] if "." swap 3append ; + [ head ] if "." glue ; : discard-lines ( -- ) readln diff --git a/extra/bitfields/bitfields.factor b/extra/bitfields/bitfields.factor index 5eb41cd943..90e588be48 100755 --- a/extra/bitfields/bitfields.factor +++ b/extra/bitfields/bitfields.factor @@ -80,7 +80,7 @@ M: check< summary drop "Number exceeds upper bound" ; [ ":" split1 string>number [ dup length ] unless* ] { } map>assoc ; : define-slots ( prefix names quots -- ) - >r [ "-" swap 3append create-in ] with map r> + >r [ "-" glue create-in ] with map r> [ define ] 2each ; : define-accessors ( classname slots -- ) diff --git a/extra/combinators/lib/lib.factor b/extra/combinators/lib/lib.factor index 0ae86c48c4..ac8c3d11d8 100755 --- a/extra/combinators/lib/lib.factor +++ b/extra/combinators/lib/lib.factor @@ -135,9 +135,6 @@ MACRO: multikeep ( word out-indexes -- ... ) r> [ drop \ r> , ] each ] [ ] make ; -: retry ( quot n -- ) - [ drop ] rot compose attempt-all ; inline - : do-while ( pred body tail -- ) [ tuck 2slip ] dip while ; inline diff --git a/extra/dns/dns.factor b/extra/dns/dns.factor index 214b45ce0c..be3ba40ac0 100644 --- a/extra/dns/dns.factor +++ b/extra/dns/dns.factor @@ -285,7 +285,7 @@ SYMBOLS: NO-ERROR FORMAT-ERROR SERVER-FAILURE NAME-ERROR NOT-IMPLEMENTED [ get-label ] [ skip-label get-name ] 2bi - "." swap 3append + "." glue ] } } diff --git a/extra/hardware-info/windows/ce/ce.factor b/extra/hardware-info/windows/ce/ce.factor index c61a3c8b8a..6537661b3e 100755 --- a/extra/hardware-info/windows/ce/ce.factor +++ b/extra/hardware-info/windows/ce/ce.factor @@ -5,7 +5,7 @@ IN: hardware-info.windows.ce : memory-status ( -- MEMORYSTATUS ) "MEMORYSTATUS" "MEMORYSTATUS" heap-size over set-MEMORYSTATUS-dwLength - [ GlobalMemoryStatus ] keep ; + dup GlobalMemoryStatus ; M: wince cpus ( -- n ) 1 ; diff --git a/extra/hardware-info/windows/nt/nt.factor b/extra/hardware-info/windows/nt/nt.factor index 51af5c5949..6215566f11 100755 --- a/extra/hardware-info/windows/nt/nt.factor +++ b/extra/hardware-info/windows/nt/nt.factor @@ -3,16 +3,13 @@ kernel libc math namespaces hardware-info.backend windows windows.advapi32 windows.kernel32 system ; IN: hardware-info.windows.nt -: system-info ( -- SYSTEM_INFO ) - "SYSTEM_INFO" [ GetSystemInfo ] keep ; - M: winnt cpus ( -- n ) system-info SYSTEM_INFO-dwNumberOfProcessors ; : memory-status ( -- MEMORYSTATUSEX ) "MEMORYSTATUSEX" "MEMORYSTATUSEX" heap-size over set-MEMORYSTATUSEX-dwLength - [ GlobalMemoryStatusEx ] keep swap zero? [ win32-error ] when ; + dup GlobalMemoryStatusEx win32-error=0/f ; M: winnt memory-load ( -- n ) memory-status MEMORYSTATUSEX-dwMemoryLoad ; @@ -35,21 +32,12 @@ M: winnt total-virtual-mem ( -- n ) M: winnt available-virtual-mem ( -- n ) memory-status MEMORYSTATUSEX-ullAvailVirtual ; -: pull-win32-string ( alien -- string ) - [ utf16n alien>string ] keep free ; - : computer-name ( -- string ) - MAX_COMPUTERNAME_LENGTH 1+ [ malloc ] keep - dupd GetComputerName zero? [ - free win32-error f - ] [ - pull-win32-string - ] if ; + MAX_COMPUTERNAME_LENGTH 1+ + [ dup ] keep + GetComputerName win32-error=0/f alien>native-string ; : username ( -- string ) - UNLEN 1+ [ malloc ] keep - dupd GetUserName zero? [ - free win32-error f - ] [ - pull-win32-string - ] if ; + UNLEN 1+ + [ dup ] keep + GetUserName win32-error=0/f alien>native-string ; diff --git a/extra/hardware-info/windows/windows.factor b/extra/hardware-info/windows/windows.factor index 3aa6824ff6..d3ebe87501 100755 --- a/extra/hardware-info/windows/windows.factor +++ b/extra/hardware-info/windows/windows.factor @@ -21,7 +21,7 @@ IN: hardware-info.windows : os-version ( -- os-version ) "OSVERSIONINFO" "OSVERSIONINFO" heap-size over set-OSVERSIONINFO-dwOSVersionInfoSize - [ GetVersionEx ] keep swap zero? [ win32-error ] when ; + dup GetVersionEx win32-error=0/f ; : windows-major ( -- n ) os-version OSVERSIONINFO-dwMajorVersion ; @@ -36,7 +36,7 @@ IN: hardware-info.windows os-version OSVERSIONINFO-dwPlatformId ; : windows-service-pack ( -- string ) - os-version OSVERSIONINFO-szCSDVersion utf16n alien>string ; + os-version OSVERSIONINFO-szCSDVersion alien>native-string ; : feature-present? ( n -- ? ) IsProcessorFeaturePresent zero? not ; @@ -51,8 +51,8 @@ IN: hardware-info.windows "ushort" ; : get-directory ( word -- str ) - >r MAX_UNICODE_PATH [ ] keep dupd r> - execute win32-error=0/f utf16n alien>string ; inline + [ MAX_UNICODE_PATH [ ] keep dupd ] dip + execute win32-error=0/f alien>native-string ; inline : windows-directory ( -- str ) \ GetWindowsDirectory get-directory ; diff --git a/extra/irc/gitbot/gitbot.factor b/extra/irc/gitbot/gitbot.factor index 93ccb2b407..3b7694a347 100644 --- a/extra/irc/gitbot/gitbot.factor +++ b/extra/irc/gitbot/gitbot.factor @@ -31,7 +31,7 @@ M: object handle-message drop ; "git-log" , "--no-merges" , "--pretty=format:%h %an: %s" , - ".." swap 3append , + ".." glue , ] { } make latin1 [ input-stream get lines ] with-process-reader ; diff --git a/extra/math/floating-point/floating-point-tests.factor b/extra/math/floating-point/floating-point-tests.factor index 7f3a87f9a5..9e5b5c67aa 100644 --- a/extra/math/floating-point/floating-point-tests.factor +++ b/extra/math/floating-point/floating-point-tests.factor @@ -1,7 +1,15 @@ ! Copyright (C) 2008 Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. -USING: tools.test math.floating-point math.constants kernel ; +USING: tools.test math.floating-point math.constants kernel +math.constants fry sequences kernel math ; IN: math.floating-point.tests [ t ] [ pi >double< >double pi = ] unit-test [ t ] [ -1.0 >double< >double -1.0 = ] unit-test + +[ t ] [ 1/0. infinity? ] unit-test +[ t ] [ -1/0. infinity? ] unit-test +[ f ] [ 0/0. infinity? ] unit-test +[ f ] [ 10. infinity? ] unit-test +[ f ] [ -10. infinity? ] unit-test +[ f ] [ 0. infinity? ] unit-test diff --git a/extra/math/floating-point/floating-point.factor b/extra/math/floating-point/floating-point.factor index 0d224bfc9d..522f149bc1 100644 --- a/extra/math/floating-point/floating-point.factor +++ b/extra/math/floating-point/floating-point.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2008 Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. USING: kernel math sequences prettyprint math.parser io -math.functions math.bitwise ; +math.functions math.bitwise combinators.short-circuit ; IN: math.floating-point : (double-sign) ( bits -- n ) -63 shift ; inline @@ -37,3 +37,10 @@ IN: math.floating-point (double-mantissa-bits) >bin 52 CHAR: 0 pad-left 11 [ bl ] times print ] tri ; + +: infinity? ( double -- ? ) + double>bits + { + [ (double-exponent-bits) 11 on-bits = ] + [ (double-mantissa-bits) 0 = ] + } 1&& ; diff --git a/extra/math/text/english/english.factor b/extra/math/text/english/english.factor index 58dab74cdb..41f19b9b07 100755 --- a/extra/math/text/english/english.factor +++ b/extra/math/text/english/english.factor @@ -56,7 +56,7 @@ SYMBOL: and-needed? : text-with-scale ( index seq -- str ) [ nth 3digits>text ] [ drop scale-numbers ] 2bi - [ " " swap 3append ] unless-empty ; + [ " " glue ] unless-empty ; : append-with-conjunction ( str1 str2 -- newstr ) over length zero? [ diff --git a/extra/money/money.factor b/extra/money/money.factor index b7da97ca06..553c473cce 100644 --- a/extra/money/money.factor +++ b/extra/money/money.factor @@ -12,7 +12,7 @@ CHAR: $ \ currency-token set-global : (money>string) ( dollars cents -- string ) [ number>string ] bi@ [ 3 group "," join ] - [ 2 CHAR: 0 pad-left ] bi* "." swap 3append ; + [ 2 CHAR: 0 pad-left ] bi* "." glue ; : money>string ( object -- string ) dollars/cents (money>string) currency-token get prefix ; diff --git a/extra/printf/printf.factor b/extra/printf/printf.factor index 0120891e12..ac02efba69 100644 --- a/extra/printf/printf.factor +++ b/extra/printf/printf.factor @@ -28,7 +28,7 @@ IN: printf [ 0 ] [ string>number ] if-empty ; : pad-digits ( string digits -- string' ) - [ "." split1 ] dip [ CHAR: 0 pad-right ] [ head-slice ] bi "." swap 3append ; + [ "." split1 ] dip [ CHAR: 0 pad-right ] [ head-slice ] bi "." glue ; : max-digits ( n digits -- n' ) 10 swap ^ [ * round ] keep / ; diff --git a/extra/project-euler/002/002-tests.factor b/extra/project-euler/002/002-tests.factor index bb02518580..46015bee3e 100644 --- a/extra/project-euler/002/002-tests.factor +++ b/extra/project-euler/002/002-tests.factor @@ -3,3 +3,4 @@ IN: project-euler.002.tests [ 4613732 ] [ euler002 ] unit-test [ 4613732 ] [ euler002a ] unit-test +[ 4613732 ] [ euler002b ] unit-test diff --git a/extra/project-euler/002/002.factor b/extra/project-euler/002/002.factor index fae535cba9..da20c874b5 100644 --- a/extra/project-euler/002/002.factor +++ b/extra/project-euler/002/002.factor @@ -1,4 +1,4 @@ -! Copyright (c) 2007 Aaron Schaefer, Alexander Solovyov. +! Copyright (c) 2007, 2008 Aaron Schaefer, Alexander Solovyov, Vishal Talwar. ! See http://factorcode.org/license.txt for BSD license. USING: kernel math sequences shuffle ; IN: project-euler.002 @@ -50,4 +50,31 @@ PRIVATE> ! [ euler002a ] 100 ave-time ! 0 ms ave run time - 0.2 SD (100 trials) -MAIN: euler002a + + [ + 3drop + ] [ + [ ?retotal next-fibs ] dip (sum-even-fibs-below) + ] if ; + +PRIVATE> + +: sum-even-fibs-below ( max -- sum ) + [ 0 0 1 ] dip (sum-even-fibs-below) ; + +: euler002b ( -- answer ) + 4000000 sum-even-fibs-below ; + +! [ euler002b ] 100 ave-time +! 0 ms ave run time - 0.0 SD (100 trials) + +MAIN: euler002b diff --git a/extra/project-euler/050/050-tests.factor b/extra/project-euler/050/050-tests.factor new file mode 100644 index 0000000000..2bd5482f7e --- /dev/null +++ b/extra/project-euler/050/050-tests.factor @@ -0,0 +1,6 @@ +USING: project-euler.050 project-euler.050.private tools.test ; +IN: project-euler.050.tests + +[ 41 ] [ 100 solve ] unit-test +[ 953 ] [ 1000 solve ] unit-test +[ 997651 ] [ euler050 ] unit-test diff --git a/extra/project-euler/050/050.factor b/extra/project-euler/050/050.factor new file mode 100644 index 0000000000..f8ce68d173 --- /dev/null +++ b/extra/project-euler/050/050.factor @@ -0,0 +1,90 @@ +! Copyright (c) 2008 Aaron Schaefer. +! See http://factorcode.org/license.txt for BSD license. +USING: arrays kernel locals math math.primes sequences ; +IN: project-euler.050 + +! http://projecteuler.net/index.php?section=problems&id=50 + +! DESCRIPTION +! ----------- + +! The prime 41, can be written as the sum of six consecutive primes: + +! 41 = 2 + 3 + 5 + 7 + 11 + 13 + +! This is the longest sum of consecutive primes that adds to a prime below +! one-hundred. + +! The longest sum of consecutive primes below one-thousand that adds to a +! prime, contains 21 terms, and is equal to 953. + +! Which prime, below one-million, can be written as the sum of the most +! consecutive primes? + + +! SOLUTION +! -------- + +! 1) Create an sequence of all primes under 1000000. +! 2) Start summing elements in the sequence until the next number would put you +! over 1000000. +! 3) Check if that sum is prime, if not, subtract the last number added. +! 4) Repeat step 3 until you get a prime number, and store it along with the +! how many consecutive numbers from the original sequence it took to get there. +! 5) Drop the first number from the sequence of primes, and do steps 2-4 again +! 6) Compare the longest chain from the first run with the second run, and store +! the longer of the two. +! 7) If the sequence of primes is still longer than the longest chain, then +! repeat steps 5-7...otherwise, you've found the longest sum of consecutive +! primes! + + ] find + [ swapd - ] [ drop seq length swap ] if* ; + +: pop-until-prime ( seq sum -- seq prime ) + over length 0 > [ + [ unclip-last-slice ] dip swap - + dup prime? [ pop-until-prime ] unless + ] [ + 2drop { } 0 + ] if ; + +! a pair is { length of chain, prime the chain sums to } + +: longest-prime ( seq limit -- pair ) + dupd sum-upto dup prime? [ + 2array nip + ] [ + [ head-slice ] dip pop-until-prime + [ length ] dip 2array + ] if ; + +: longest ( pair pair -- longest ) + 2dup [ first ] bi@ > [ drop ] [ nip ] if ; + +: continue? ( pair seq -- ? ) + [ first ] [ length 1- ] bi* < ; + +: (find-longest) ( best seq limit -- best ) + [ longest-prime longest ] 2keep 2over continue? [ + [ rest-slice ] dip (find-longest) + ] [ 2drop ] if ; + +: find-longest ( seq limit -- best ) + { 1 2 } -rot (find-longest) ; + +: solve ( n -- answer ) + [ primes-upto ] keep find-longest second ; + +PRIVATE> + +: euler050 ( -- answer ) + 1000000 solve ; + +! [ euler050 ] 100 ave-time +! 291 ms run / 20.6 ms GC ave time - 100 trials + +MAIN: euler050 diff --git a/extra/project-euler/ave-time/ave-time.factor b/extra/project-euler/ave-time/ave-time.factor index f176bbc7d2..a7762836f1 100644 --- a/extra/project-euler/ave-time/ave-time.factor +++ b/extra/project-euler/ave-time/ave-time.factor @@ -1,21 +1,24 @@ -! Copyright (c) 2007 Aaron Schaefer. +! Copyright (c) 2007, 2008 Aaron Schaefer. ! See http://factorcode.org/license.txt for BSD license. USING: continuations fry io kernel make math math.functions math.parser math.statistics memory tools.time ; IN: project-euler.ave-time +: nth-place ( x n -- y ) + 10 swap ^ [ * round >integer ] keep /f ; + : collect-benchmarks ( quot n -- seq ) [ [ datastack ] - [ '[ _ gc benchmark , ] tuck '[ _ _ with-datastack drop ] ] + [ + '[ _ gc benchmark 1000 / , ] tuck + '[ _ _ with-datastack drop ] + ] [ 1- ] tri* swap times call ] { } make ; inline -: nth-place ( x n -- y ) - 10 swap ^ [ * round ] keep / ; - : ave-time ( quot n -- ) [ collect-benchmarks ] keep swap - [ std 2 nth-place ] [ mean round ] bi [ + [ std 2 nth-place ] [ mean round >integer ] bi [ # " ms ave run time - " % # " SD (" % # " trials)" % ] "" make print flush ; inline diff --git a/extra/sequences/lib/lib.factor b/extra/sequences/lib/lib.factor index 0674b8d9d2..72944c09b4 100755 --- a/extra/sequences/lib/lib.factor +++ b/extra/sequences/lib/lib.factor @@ -23,11 +23,11 @@ IN: sequences.lib ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : each-percent ( seq quot -- ) - >r - dup length - dup [ / ] curry - [ 1+ ] prepose - r> compose + [ + dup length + dup [ / ] curry + [ 1+ ] prepose + ] dip compose 2each ; inline ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -68,7 +68,7 @@ IN: sequences.lib : minmax ( seq -- min max ) #! find the min and max of a seq in one pass - 1/0. -1/0. rot [ tuck max >r min r> ] each ; + 1/0. -1/0. rot [ tuck max [ min ] dip ] each ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -78,7 +78,7 @@ IN: sequences.lib : (monotonic-split) ( seq quot -- newseq ) [ - >r dup unclip suffix r> + [ dup unclip suffix ] dip v, [ pick ,, call [ v, ] unless ] curry 2each ,v ] { } make ; @@ -88,7 +88,7 @@ IN: sequences.lib ERROR: element-not-found ; : split-around ( seq quot -- before elem after ) dupd find over [ element-not-found ] unless - >r cut rest r> swap ; inline + [ cut rest ] dip swap ; inline : map-until ( seq quot pred -- newseq ) '[ [ @ dup @ [ drop t ] [ , f ] if ] find 2drop ] { } make ; @@ -115,14 +115,14 @@ ERROR: element-not-found ; PRIVATE> : exact-strings ( alphabet length -- seqs ) - >r dup length r> exact-number-strings map-alphabet ; + [ dup length ] dip exact-number-strings map-alphabet ; : strings ( alphabet length -- seqs ) - >r dup length r> number-strings map-alphabet ; + [ dup length ] dip number-strings map-alphabet ; : switches ( seq1 seq -- subseq ) ! seq1 is a sequence of ones and zeroes - >r [ length ] keep [ nth 1 = ] curry filter r> + [ [ length ] keep [ nth 1 = ] curry filter ] dip [ nth ] curry { } map-as ; : power-set ( seq -- subsets ) @@ -147,7 +147,3 @@ PRIVATE> dup length 1 (a,b] [ dup random pick exchange ] each ; : enumerate ( seq -- seq' ) >alist ; - -: splice ( left-seq right-seq seq -- newseq ) swap 3append ; - -: surround ( seq left-seq right-seq -- newseq ) swapd 3append ; diff --git a/extra/webapps/blogs/blogs.factor b/extra/webapps/blogs/blogs.factor index e035090fb0..c16450bb25 100644 --- a/extra/webapps/blogs/blogs.factor +++ b/extra/webapps/blogs/blogs.factor @@ -50,7 +50,7 @@ M: entity feed-entry-date date>> ; TUPLE: post < entity title comments ; M: post feed-entry-title - [ author>> ] [ title>> ] bi ": " swap 3append ; + [ author>> ] [ title>> ] bi ": " glue ; M: post entity-url id>> view-post-url ;