]> gitweb.factorcode.org Git - factor.git/commitdiff
Merge branch 'master' of git://factorcode.org/git/factor
authorSlava Pestov <slava@factorcode.org>
Fri, 21 Aug 2009 23:48:44 +0000 (18:48 -0500)
committerSlava Pestov <slava@factorcode.org>
Fri, 21 Aug 2009 23:48:44 +0000 (18:48 -0500)
549 files changed:
basis/alarms/alarms-tests.factor
basis/alarms/alarms.factor
basis/alien/c-types/c-types-tests.factor
basis/alien/complex/complex.factor
basis/alien/complex/functor/functor-tests.factor [deleted file]
basis/alien/destructors/destructors-tests.factor [deleted file]
basis/alien/fortran/fortran.factor
basis/alien/libraries/libraries-tests.factor
basis/alien/structs/structs-tests.factor
basis/alien/syntax/syntax.factor
basis/ascii/ascii-tests.factor
basis/base64/base64.factor
basis/biassocs/biassocs-tests.factor
basis/biassocs/biassocs.factor
basis/binary-search/binary-search-tests.factor
basis/bit-arrays/bit-arrays.factor
basis/bit-sets/bit-sets-tests.factor
basis/bit-vectors/bit-vectors-tests.factor
basis/bitstreams/bitstreams-tests.factor
basis/bitstreams/bitstreams.factor
basis/bootstrap/compiler/compiler.factor
basis/bootstrap/image/image-tests.factor
basis/bootstrap/image/image.factor
basis/bootstrap/image/upload/upload.factor
basis/bootstrap/math/math.factor
basis/bootstrap/tools/tools.factor
basis/boxes/boxes-tests.factor
basis/byte-arrays/hex/hex.factor
basis/cache/cache-tests.factor [deleted file]
basis/cache/cache.factor
basis/cairo/cairo-tests.factor
basis/calendar/calendar-docs.factor
basis/calendar/calendar.factor
basis/calendar/format/format.factor
basis/channels/examples/examples.factor
basis/checksums/fnv1/fnv1.factor
basis/checksums/md5/md5-tests.factor
basis/circular/circular-tests.factor
basis/circular/circular.factor
basis/cocoa/callbacks/callbacks.factor
basis/cocoa/cocoa-tests.factor
basis/cocoa/messages/messages.factor
basis/cocoa/plists/plists-tests.factor
basis/colors/hsv/hsv-tests.factor
basis/columns/columns-tests.factor
basis/combinators/short-circuit/smart/smart-tests.factor
basis/combinators/short-circuit/smart/smart.factor
basis/combinators/smart/smart-docs.factor
basis/combinators/smart/smart-tests.factor
basis/compiler/cfg/alias-analysis/alias-analysis-tests.factor [deleted file]
basis/compiler/cfg/alias-analysis/alias-analysis.factor
basis/compiler/cfg/builder/builder-tests.factor
basis/compiler/cfg/cfg-tests.factor [deleted file]
basis/compiler/cfg/dataflow-analysis/dataflow-analysis.factor
basis/compiler/cfg/def-use/def-use-tests.factor
basis/compiler/cfg/dominance/dominance-tests.factor
basis/compiler/cfg/gc-checks/gc-checks-tests.factor
basis/compiler/cfg/intrinsics/allot/allot.factor
basis/compiler/cfg/linear-scan/resolve/resolve-tests.factor
basis/compiler/cfg/linear-scan/resolve/resolve.factor
basis/compiler/cfg/linearization/linearization-tests.factor [deleted file]
basis/compiler/cfg/liveness/liveness.factor
basis/compiler/cfg/loop-detection/loop-detection-tests.factor
basis/compiler/cfg/loop-detection/loop-detection.factor
basis/compiler/cfg/optimizer/optimizer-tests.factor [deleted file]
basis/compiler/cfg/representations/preferred/preferred-tests.factor [deleted file]
basis/compiler/cfg/stacks/finalize/finalize.factor
basis/compiler/cfg/stacks/global/global.factor
basis/compiler/cfg/stacks/local/local.factor
basis/compiler/cfg/stacks/stacks-tests.factor [deleted file]
basis/compiler/cfg/stacks/uninitialized/uninitialized-tests.factor
basis/compiler/cfg/stacks/uninitialized/uninitialized.factor
basis/compiler/cfg/two-operand/two-operand-tests.factor
basis/compiler/cfg/utilities/utilities.factor
basis/compiler/cfg/write-barrier/authors.txt [new file with mode: 0644]
basis/compiler/cfg/write-barrier/write-barrier-tests.factor
basis/compiler/cfg/write-barrier/write-barrier.factor
basis/compiler/codegen/codegen-tests.factor
basis/compiler/compiler.factor [changed mode: 0644->0755]
basis/compiler/tests/alien.factor
basis/compiler/tests/call-effect.factor
basis/compiler/tests/float.factor
basis/compiler/tests/generic.factor
basis/compiler/tests/optimizer.factor
basis/compiler/tests/peg-regression-2.factor
basis/compiler/tests/pic-problem-1.factor
basis/compiler/tests/redefine0.factor
basis/compiler/tests/redefine15.factor
basis/compiler/tests/redefine16.factor
basis/compiler/tests/redefine17.factor
basis/compiler/tests/redefine2.factor
basis/compiler/tests/redefine3.factor
basis/compiler/tests/redefine4.factor
basis/compiler/tests/reload.factor
basis/compiler/tests/stack-trace.factor
basis/compiler/tests/tuples.factor
basis/compiler/tree/builder/builder-tests.factor
basis/compiler/tree/checker/checker-tests.factor [deleted file]
basis/compiler/tree/cleanup/cleanup-tests.factor
basis/compiler/tree/combinators/combinators-tests.factor
basis/compiler/tree/dead-code/branches/branches.factor
basis/compiler/tree/debugger/debugger-tests.factor
basis/compiler/tree/debugger/debugger.factor
basis/compiler/tree/def-use/def-use.factor
basis/compiler/tree/def-use/simplified/simplified-tests.factor
basis/compiler/tree/def-use/simplified/simplified.factor
basis/compiler/tree/escape-analysis/check/check-tests.factor
basis/compiler/tree/escape-analysis/escape-analysis-tests.factor
basis/compiler/tree/escape-analysis/recursive/recursive-tests.factor
basis/compiler/tree/finalization/finalization.factor [changed mode: 0644->0755]
basis/compiler/tree/modular-arithmetic/modular-arithmetic-tests.factor
basis/compiler/tree/modular-arithmetic/modular-arithmetic.factor
basis/compiler/tree/normalization/normalization-tests.factor
basis/compiler/tree/optimizer/optimizer-tests.factor [deleted file]
basis/compiler/tree/propagation/call-effect/call-effect.factor
basis/compiler/tree/propagation/copy/copy-tests.factor
basis/compiler/tree/propagation/info/info.factor
basis/compiler/tree/propagation/inlining/inlining.factor
basis/compiler/tree/propagation/known-words/known-words.factor
basis/compiler/tree/propagation/propagation-tests.factor
basis/compiler/tree/propagation/propagation.factor
basis/compiler/tree/propagation/recursive/recursive-tests.factor
basis/compiler/tree/propagation/simple/simple.factor
basis/compiler/tree/propagation/slots/slots.factor
basis/compiler/tree/propagation/transforms/transforms.factor
basis/compiler/tree/recursive/recursive-tests.factor
basis/compiler/tree/tuple-unboxing/tuple-unboxing-tests.factor
basis/compression/huffman/huffman.factor
basis/compression/inflate/inflate.factor
basis/compression/lzw/lzw-tests.factor [deleted file]
basis/concurrency/combinators/combinators-tests.factor
basis/concurrency/count-downs/count-downs.factor
basis/concurrency/distributed/distributed-tests.factor
basis/concurrency/exchangers/exchangers-tests.factor
basis/concurrency/flags/flags-tests.factor
basis/concurrency/futures/futures-tests.factor
basis/concurrency/locks/locks-tests.factor
basis/concurrency/locks/locks.factor
basis/concurrency/mailboxes/mailboxes-tests.factor
basis/concurrency/mailboxes/mailboxes.factor
basis/concurrency/promises/promises-tests.factor
basis/concurrency/semaphores/semaphores.factor
basis/cords/cords-tests.factor
basis/core-foundation/numbers/numbers-tests.factor [deleted file]
basis/core-foundation/run-loop/run-loop.factor
basis/core-foundation/utilities/utilities-tests.factor [deleted file]
basis/core-graphics/types/types-tests.factor [deleted file]
basis/core-text/fonts/fonts-tests.factor [deleted file]
basis/core-text/utilities/utilities-tests.factor [deleted file]
basis/cpu/ppc/assembler/assembler-tests.factor
basis/cpu/ppc/bootstrap.factor
basis/cpu/ppc/ppc.factor
basis/cpu/x86/64/64.factor
basis/cpu/x86/bootstrap.factor
basis/cpu/x86/features/features-tests.factor
basis/cpu/x86/x86.factor
basis/db/postgresql/postgresql.factor
basis/db/queries/queries.factor
basis/db/tuples/tuples-tests.factor
basis/debugger/debugger-tests.factor
basis/debugger/debugger.factor
basis/debugger/unix/unix.factor
basis/definitions/icons/icons-tests.factor [deleted file]
basis/delegate/delegate-tests.factor
basis/disjoint-sets/disjoint-sets-tests.factor
basis/disjoint-sets/disjoint-sets.factor
basis/documents/documents-tests.factor
basis/documents/documents.factor
basis/documents/elements/elements.factor
basis/editors/macvim/macvim.factor
basis/eval/eval-tests.factor
basis/farkup/farkup.factor
basis/formatting/formatting-tests.factor
basis/formatting/formatting.factor
basis/fry/fry-tests.factor
basis/fry/fry.factor
basis/functors/functors-tests.factor
basis/furnace/auth/auth-tests.factor [deleted file]
basis/furnace/auth/features/edit-profile/edit-profile-tests.factor [deleted file]
basis/furnace/auth/features/recover-password/recover-password-tests.factor [deleted file]
basis/furnace/auth/features/registration/registration-tests.factor [deleted file]
basis/furnace/auth/login/login-tests.factor [deleted file]
basis/furnace/auth/login/permits/permits.factor
basis/furnace/auth/providers/assoc/assoc-tests.factor
basis/furnace/auth/providers/assoc/assoc.factor
basis/furnace/auth/providers/db/db-tests.factor
basis/furnace/db/db-tests.factor [deleted file]
basis/furnace/furnace-tests.factor
basis/furnace/sessions/sessions-tests.factor
basis/game-input/game-input-tests.factor
basis/game-input/game-input.factor
basis/game-input/iokit/iokit.factor
basis/generalizations/generalizations.factor
basis/globs/globs-tests.factor
basis/grouping/grouping.factor
basis/heaps/heaps.factor
basis/help/apropos/apropos-tests.factor
basis/help/crossref/crossref-tests.factor
basis/help/handbook/handbook-tests.factor
basis/help/handbook/handbook.factor
basis/help/help-tests.factor
basis/help/html/html-tests.factor
basis/help/vocabs/vocabs-tests.factor
basis/hints/hints.factor
basis/html/components/components-tests.factor
basis/html/forms/forms-tests.factor
basis/html/forms/forms.factor
basis/html/templates/fhtml/fhtml.factor
basis/http/client/client-tests.factor
basis/http/client/post-data/post-data-tests.factor [deleted file]
basis/http/parsers/parsers-tests.factor
basis/http/server/redirection/redirection-tests.factor
basis/http/server/static/static-tests.factor
basis/images/jpeg/jpeg.factor
basis/interval-maps/interval-maps.factor
basis/inverse/inverse-tests.factor
basis/inverse/inverse.factor
basis/io/backend/unix/multiplexers/select/select.factor
basis/io/backend/windows/privileges/privileges-tests.factor
basis/io/backend/windows/windows.factor
basis/io/encodings/ascii/ascii.factor
basis/io/files/info/windows/windows.factor
basis/io/files/links/links.factor
basis/io/files/links/unix/unix-tests.factor
basis/io/files/windows/windows.factor
basis/io/launcher/windows/nt/nt-tests.factor
basis/io/launcher/windows/nt/nt.factor
basis/io/launcher/windows/nt/test/input.txt [new file with mode: 0755]
basis/io/launcher/windows/windows.factor
basis/io/monitors/recursive/recursive-tests.factor
basis/io/pipes/pipes.factor
basis/io/sockets/secure/openssl/openssl.factor
basis/io/sockets/unix/unix.factor
basis/lcs/lcs.factor
basis/linked-assocs/linked-assocs-tests.factor
basis/lists/lazy/lazy.factor
basis/lists/lists-tests.factor
basis/lists/lists.factor
basis/literals/literals-docs.factor
basis/locals/locals-docs.factor
basis/locals/locals-tests.factor
basis/logging/server/server.factor
basis/math/bits/bits.factor
basis/math/bitwise/bitwise-tests.factor
basis/math/combinatorics/combinatorics-docs.factor
basis/math/complex/complex.factor
basis/math/functions/functions-docs.factor
basis/math/functions/functions.factor
basis/math/intervals/intervals-docs.factor
basis/math/intervals/intervals-tests.factor
basis/math/intervals/intervals.factor
basis/math/matrices/elimination/elimination.factor
basis/math/primes/erato/erato.factor
basis/math/primes/factors/factors.factor
basis/math/ranges/ranges.factor
basis/math/ratios/ratios-tests.factor
basis/math/ratios/ratios.factor
basis/memoize/memoize-tests.factor
basis/mime/multipart/multipart.factor
basis/models/arrow/arrow-tests.factor
basis/models/models.factor
basis/models/product/product-tests.factor
basis/multiline/multiline-docs.factor
basis/multiline/multiline-tests.factor
basis/multiline/multiline.factor
basis/opengl/gl/extensions/extensions.factor
basis/peg/parsers/parsers.factor
basis/peg/peg.factor
basis/persistent/hashtables/config/config.factor
basis/persistent/hashtables/hashtables.factor
basis/persistent/hashtables/nodes/bitmap/bitmap.factor
basis/persistent/vectors/vectors.factor
basis/porter-stemmer/porter-stemmer.factor
basis/prettyprint/backend/backend.factor
basis/prettyprint/prettyprint.factor
basis/prettyprint/sections/sections.factor
basis/quoted-printable/quoted-printable.factor
basis/random/dummy/dummy.factor
basis/random/mersenne-twister/mersenne-twister.factor
basis/random/random.factor
basis/regexp/ast/ast.factor
basis/regexp/compiler/compiler.factor
basis/regexp/regexp.factor
basis/see/see.factor
basis/sequences/complex/complex.factor
basis/serialize/serialize.factor
basis/sorting/functor/functor.factor
basis/sorting/insertion/insertion.factor
basis/specialized-arrays/direct/functor/functor.factor
basis/specialized-arrays/functor/functor.factor
basis/splitting/monotonic/monotonic.factor
basis/stack-checker/backend/backend.factor
basis/stack-checker/known-words/known-words.factor
basis/suffix-arrays/suffix-arrays.factor
basis/tools/annotations/annotations-tests.factor
basis/tools/completion/completion.factor
basis/tools/deprecation/authors.txt [new file with mode: 0644]
basis/tools/deprecation/deprecation-docs.factor [new file with mode: 0644]
basis/tools/deprecation/deprecation.factor [new file with mode: 0644]
basis/tools/deprecation/summary.txt [new file with mode: 0644]
basis/tuple-arrays/tuple-arrays.factor
basis/ui/backend/windows/windows.factor
basis/ui/gadgets/editors/editors.factor
basis/ui/gadgets/frames/frames.factor
basis/ui/gadgets/gadgets-tests.factor
basis/ui/gadgets/gadgets.factor
basis/ui/gadgets/line-support/line-support.factor
basis/ui/gadgets/tables/tables.factor
basis/ui/pens/gradient/gradient.factor
basis/ui/text/uniscribe/uniscribe.factor
basis/ui/tools/error-list/error-list-docs.factor
basis/ui/tools/error-list/error-list.factor
basis/ui/tools/error-list/icons/deprecation-note.tiff [new file with mode: 0644]
basis/ui/tools/listener/history/history.factor
basis/ui/tools/listener/listener.factor
basis/ui/traverse/traverse.factor
basis/ui/ui.factor
basis/unicode/breaks/breaks.factor
basis/unicode/normalize/normalize-tests.factor
basis/unicode/normalize/normalize.factor
basis/unix/groups/groups.factor
basis/unix/process/process.factor
basis/unrolled-lists/unrolled-lists.factor
basis/urls/encoding/encoding.factor
basis/values/values-tests.factor
basis/vectors/functor/functor.factor
basis/vlists/vlists.factor
basis/windows/com/wrapper/wrapper.factor
basis/windows/dragdrop-listener/dragdrop-listener.factor
basis/windows/errors/errors.factor
basis/windows/ole32/ole32.factor
basis/windows/uniscribe/uniscribe.factor
basis/xml/syntax/syntax.factor
basis/xml/tokenize/tokenize.factor
basis/xmode/marker/marker.factor
basis/xmode/marker/state/state.factor
build-support/factor.sh
core/alien/alien.factor
core/arrays/arrays.factor
core/assocs/assocs-tests.factor
core/assocs/assocs.factor
core/bootstrap/syntax-docs.factor [deleted file]
core/bootstrap/syntax.factor
core/byte-arrays/byte-arrays-tests.factor
core/byte-arrays/byte-arrays.factor
core/byte-vectors/byte-vectors-tests.factor
core/byte-vectors/byte-vectors.factor
core/checksums/checksums-tests.factor [deleted file]
core/classes/algebra/algebra.factor
core/classes/builtin/builtin-tests.factor
core/classes/builtin/builtin.factor
core/classes/classes-tests.factor
core/classes/tuple/parser/parser-tests.factor
core/classes/tuple/parser/parser.factor
core/classes/tuple/tuple.factor
core/effects/effects-tests.factor
core/effects/parser/parser.factor
core/generic/math/math-tests.factor
core/generic/single/single-tests.factor
core/generic/single/single.factor
core/growable/growable.factor
core/hashtables/hashtables-tests.factor
core/hashtables/hashtables.factor
core/io/backend/backend-tests.factor
core/io/encodings/utf8/utf8.factor
core/io/streams/byte-array/byte-array-tests.factor
core/io/streams/memory/memory.factor
core/kernel/kernel.factor
core/layouts/layouts-tests.factor
core/layouts/layouts.factor
core/lexer/lexer.factor
core/math/floats/floats-docs.factor
core/math/floats/floats.factor
core/math/integers/integers.factor
core/math/math-docs.factor
core/math/math.factor
core/math/order/order.factor
core/math/parser/parser-tests.factor
core/math/parser/parser.factor
core/sbufs/sbufs.factor
core/sequences/sequences-docs.factor
core/sequences/sequences.factor
core/slots/slots-tests.factor
core/slots/slots.factor
core/splitting/splitting.factor
core/strings/strings.factor
core/syntax/syntax-docs.factor
core/syntax/syntax.factor
core/vectors/vectors.factor
core/words/words-docs.factor
core/words/words-tests.factor
core/words/words.factor
extra/adsoda/adsoda.factor
extra/adsoda/combinators/combinators.factor
extra/adsoda/solution2/solution2.factor
extra/annotations/annotations-tests.factor
extra/benchmark/beust2/beust2.factor
extra/benchmark/chameneos-redux/authors.txt [new file with mode: 0644]
extra/benchmark/chameneos-redux/chameneos-redux.factor [new file with mode: 0644]
extra/benchmark/fannkuch/fannkuch.factor
extra/benchmark/fasta/fasta.factor
extra/benchmark/fib4/fib4.factor
extra/benchmark/fib6/fib6.factor
extra/benchmark/gc1/gc1.factor
extra/benchmark/knucleotide/knucleotide.factor
extra/benchmark/mandel/colors/colors.factor
extra/benchmark/nbody/nbody.factor
extra/benchmark/nsieve-bits/nsieve-bits.factor
extra/benchmark/nsieve-bytes/nsieve-bytes.factor
extra/benchmark/nsieve/nsieve.factor
extra/benchmark/partial-sums/partial-sums.factor
extra/benchmark/recursive/recursive.factor
extra/benchmark/tuple-arrays/tuple-arrays.factor
extra/benchmark/yuv-to-rgb/yuv-to-rgb.factor
extra/bunny/bunny.factor
extra/central/central-tests.factor
extra/classes/c-types/c-types-docs.factor [new file with mode: 0644]
extra/classes/c-types/c-types.factor [new file with mode: 0644]
extra/classes/struct/prettyprint/prettyprint.factor [new file with mode: 0644]
extra/classes/struct/struct-docs.factor [new file with mode: 0644]
extra/classes/struct/struct-tests.factor [new file with mode: 0644]
extra/classes/struct/struct.factor [new file with mode: 0644]
extra/coroutines/coroutines-tests.factor
extra/crypto/barrett/barrett.factor
extra/crypto/passwd-md5/passwd-md5.factor
extra/crypto/rsa/rsa.factor
extra/ctags/etags/etags.factor
extra/cursors/cursors.factor
extra/descriptive/descriptive-tests.factor
extra/dns/misc/misc.factor
extra/dns/server/server.factor
extra/ecdsa/ecdsa.factor
extra/game-loop/game-loop.factor
extra/hashcash/hashcash.factor
extra/html/parser/analyzer/analyzer.factor
extra/id3/id3.factor
extra/irc/client/internals/internals.factor
extra/jamshred/tunnel/tunnel.factor
extra/koszul/koszul.factor
extra/math/analysis/analysis.factor
extra/math/dual/dual.factor
extra/math/finance/finance.factor
extra/math/primes/lists/lists.factor
extra/math/text/english/english.factor
extra/math/text/french/french.factor
extra/math/text/utils/utils-docs.factor [changed mode: 0644->0755]
extra/math/text/utils/utils-tests.factor [changed mode: 0644->0755]
extra/math/text/utils/utils.factor [changed mode: 0644->0755]
extra/memory/piles/authors.txt [new file with mode: 0644]
extra/memory/piles/piles-docs.factor [new file with mode: 0644]
extra/memory/piles/piles-tests.factor [new file with mode: 0644]
extra/memory/piles/piles.factor [new file with mode: 0644]
extra/memory/piles/summary.txt [new file with mode: 0644]
extra/memory/pools/authors.txt [new file with mode: 0644]
extra/memory/pools/pools-docs.factor [new file with mode: 0644]
extra/memory/pools/pools-tests.factor [new file with mode: 0644]
extra/memory/pools/pools.factor [new file with mode: 0644]
extra/memory/pools/summary.txt [new file with mode: 0644]
extra/monads/monads-tests.factor
extra/money/money.factor
extra/multi-methods/authors.txt [new file with mode: 0755]
extra/multi-methods/multi-methods.factor [new file with mode: 0755]
extra/multi-methods/summary.txt [new file with mode: 0755]
extra/multi-methods/tags.txt [new file with mode: 0644]
extra/multi-methods/tests/canonicalize.factor [new file with mode: 0644]
extra/multi-methods/tests/definitions.factor [new file with mode: 0644]
extra/multi-methods/tests/legacy.factor [new file with mode: 0644]
extra/multi-methods/tests/syntax.factor [new file with mode: 0644]
extra/multi-methods/tests/topological-sort.factor [new file with mode: 0644]
extra/opengl/demo-support/demo-support.factor
extra/parser-combinators/parser-combinators.factor
extra/peg-lexer/peg-lexer.factor
extra/prettyprint/callables/authors.txt [new file with mode: 0644]
extra/prettyprint/callables/callables-docs.factor [new file with mode: 0644]
extra/prettyprint/callables/callables-tests.factor [new file with mode: 0644]
extra/prettyprint/callables/callables.factor [new file with mode: 0644]
extra/prettyprint/callables/summary.txt [new file with mode: 0644]
extra/project-euler/001/001.factor
extra/project-euler/012/012.factor
extra/project-euler/014/014.factor
extra/project-euler/022/022.factor
extra/project-euler/025/025.factor
extra/project-euler/026/026.factor
extra/project-euler/027/027.factor
extra/project-euler/030/030.factor
extra/project-euler/035/035.factor
extra/project-euler/038/038.factor
extra/project-euler/039/039.factor
extra/project-euler/040/040.factor
extra/project-euler/042/042.factor
extra/project-euler/043/043.factor
extra/project-euler/044/044.factor
extra/project-euler/045/045.factor
extra/project-euler/046/046.factor
extra/project-euler/047/047.factor
extra/project-euler/048/048.factor
extra/project-euler/049/049.factor
extra/project-euler/050/050.factor
extra/project-euler/052/052.factor
extra/project-euler/055/055.factor
extra/project-euler/058/058.factor
extra/project-euler/069/069.factor
extra/project-euler/075/075.factor
extra/project-euler/076/076.factor
extra/project-euler/092/092.factor
extra/project-euler/097/097.factor
extra/project-euler/099/099.factor
extra/project-euler/100/100.factor
extra/project-euler/116/116.factor
extra/project-euler/148/148.factor
extra/project-euler/150/150.factor
extra/project-euler/151/151-tests.factor [new file with mode: 0644]
extra/project-euler/151/151.factor
extra/project-euler/169/169.factor
extra/project-euler/175/175.factor
extra/project-euler/186/186.factor
extra/project-euler/190/190.factor
extra/project-euler/203/203.factor
extra/project-euler/215/215.factor
extra/project-euler/ave-time/ave-time.factor
extra/project-euler/common/common.factor
extra/rpn/authors.txt [new file with mode: 0644]
extra/rpn/rpn.factor [new file with mode: 0644]
extra/rpn/summary.txt [new file with mode: 0644]
extra/rpn/tags.txt [new file with mode: 0644]
extra/sequence-parser/sequence-parser.factor
extra/sequences/product/product.factor
extra/slides/slides.factor
extra/smalltalk/compiler/compiler.factor
extra/spider/spider.factor
extra/sudoku/sudoku.factor
extra/svg/svg.factor
extra/system-info/windows/nt/nt.factor
extra/terrain/terrain.factor
extra/tetris/game/game.factor
extra/tetris/tetromino/tetromino.factor
extra/trees/trees.factor
extra/ui/gadgets/lists/lists.factor
extra/wordtimer/wordtimer.factor
misc/vim/syntax/factor.vim
unmaintained/multi-methods/authors.txt [deleted file]
unmaintained/multi-methods/multi-methods.factor [deleted file]
unmaintained/multi-methods/summary.txt [deleted file]
unmaintained/multi-methods/tags.txt [deleted file]
unmaintained/multi-methods/tests/canonicalize.factor [deleted file]
unmaintained/multi-methods/tests/definitions.factor [deleted file]
unmaintained/multi-methods/tests/legacy.factor [deleted file]
unmaintained/multi-methods/tests/syntax.factor [deleted file]
unmaintained/multi-methods/tests/topological-sort.factor [deleted file]

index 7c64680a834b297b197c73d1502de3538fcb68cd..2379e3e80d809baba9cd08424a94a6955f28c67a 100644 (file)
@@ -1,6 +1,6 @@
-IN: alarms.tests\r
 USING: alarms alarms.private kernel calendar sequences\r
 tools.test threads concurrency.count-downs ;\r
+IN: alarms.tests\r
 \r
 [ ] [\r
     1 <count-down>\r
index f9fdce806f5f606bd1ef5532e19ab42f8ac3694c..9943d39ad194a6d0efe5d356d3873afa6099ed94 100644 (file)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2005, 2008 Slava Pestov, Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors arrays calendar combinators generic init
-kernel math namespaces sequences heaps boxes threads
-quotations assocs math.order ;
+USING: accessors assocs boxes calendar
+combinators.short-circuit fry heaps init kernel math.order
+namespaces quotations threads ;
 IN: alarms
 
 TUPLE: alarm
@@ -21,21 +21,21 @@ SYMBOL: alarm-thread
 
 ERROR: bad-alarm-frequency frequency ;
 : check-alarm ( frequency/f -- frequency/f )
-    dup [ duration? ] [ not ] bi or [ bad-alarm-frequency ] unless ;
+    dup { [ duration? ] [ not ] } 1|| [ bad-alarm-frequency ] unless ;
 
 : <alarm> ( quot time frequency -- alarm )
     check-alarm <box> alarm boa ;
 
 : register-alarm ( alarm -- )
-    dup dup time>> alarms get-global heap-push*
-    swap entry>> >box
+    [ dup time>> alarms get-global heap-push* ]
+    [ entry>> >box ] bi
     notify-alarm-thread ;
 
 : alarm-expired? ( alarm now -- ? )
     [ time>> ] dip before=? ;
 
 : reschedule-alarm ( alarm -- )
-    dup [ swap interval>> time+ now max ] change-time register-alarm ;
+    dup '[ _ interval>> time+ now max ] change-time register-alarm ;
 
 : call-alarm ( alarm -- )
     [ entry>> box> drop ]
index ea9e881fd4d9e9c9f9a3c42c7af6c2c174e3acee..0de26aad20e2309331301c141c5c54404c37cd25 100644 (file)
@@ -1,6 +1,6 @@
-IN: alien.c-types.tests
 USING: alien alien.syntax alien.c-types kernel tools.test
 sequences system libc alien.strings io.encodings.utf8 ;
+IN: alien.c-types.tests
 
 CONSTANT: xyz 123
 
index c80ead73f0bf701d6173abf0ccd234681572713b..b0229358d1f1893b6cffc5b92fab3b34f506cb18 100644 (file)
@@ -10,4 +10,4 @@ IN: alien.complex
 ! This overrides the fact that small structures are never returned
 ! in registers on NetBSD, Linux and Solaris running on 32-bit x86.
 "complex-float" c-type t >>return-in-registers? drop
- >>
+>>
diff --git a/basis/alien/complex/functor/functor-tests.factor b/basis/alien/complex/functor/functor-tests.factor
deleted file mode 100644 (file)
index c2df22b..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-! Copyright (C) 2009 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: tools.test alien.complex.functor ;
-IN: alien.complex.functor.tests
diff --git a/basis/alien/destructors/destructors-tests.factor b/basis/alien/destructors/destructors-tests.factor
deleted file mode 100644 (file)
index 4f43445..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-! Copyright (C) 2009 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: tools.test alien.destructors ;
-IN: alien.destructors.tests
index 15840dfd66d26d5c95be292b36a00fa276cecf8c..013c4d6f6a8c92a5e7fc8db76f971a492065602b 100644 (file)
@@ -357,10 +357,10 @@ M: character-type (<fortran-result>)
 
 : (shuffle-map) ( return parameters -- ret par )
     [
-        fortran-ret-type>c-type length swap "void" = [ 1+ ] unless
+        fortran-ret-type>c-type length swap "void" = [ 1 + ] unless
         letters swap head [ "ret" swap suffix ] map
     ] [
-        [ fortran-arg-type>c-type nip length 1+ ] map letters swap zip
+        [ fortran-arg-type>c-type nip length 1 + ] map letters swap zip
         [ first2 letters swap head [ "" 2sequence ] with map ] map concat
     ] bi* ;
 
index 13eb134ea9bc557865eceacdb18fec59e8619c81..f1dc228d83ed74cfa7edeca32cd6ccaf8779559d 100644 (file)
@@ -1,5 +1,5 @@
-IN: alien.libraries.tests
 USING: alien.libraries alien.syntax tools.test kernel ;
+IN: alien.libraries.tests
 
 [ f ] [ DLL" fadfasdfsada" dll-valid? ] unit-test
 
@@ -7,4 +7,4 @@ USING: alien.libraries alien.syntax tools.test kernel ;
 
 [ ] [ "doesnotexist" dlopen dlclose ] unit-test
 
-[ "fdasfsf" dll-valid? drop ] must-fail
\ No newline at end of file
+[ "fdasfsf" dll-valid? drop ] must-fail
index 231f1bd42876a1e4f842fc97e0cd5a7b816604ff..3f84377d5c8164a22e2ac4518b826d8620832132 100755 (executable)
@@ -1,6 +1,6 @@
-IN: alien.structs.tests
 USING: alien alien.syntax alien.c-types kernel tools.test
 sequences system libc words vocabs namespaces layouts ;
+IN: alien.structs.tests
 
 C-STRUCT: bar
     { "int" "x" }
index d479e6d498e5a37b46ab5326f07300c1b3d22223..b70aa3557c9f2afabc6665f7b92762914f36b397 100644 (file)
@@ -31,8 +31,10 @@ SYNTAX: C-ENUM:
     ";" parse-tokens
     [ [ create-in ] dip define-constant ] each-index ;
 
+ERROR: no-such-symbol name library ;
+
 : address-of ( name library -- value )
-    load-library dlsym [ "No such symbol" throw ] unless* ;
+    2dup load-library dlsym [ 2nip ] [ no-such-symbol ] if* ;
 
 SYNTAX: &:
     scan "c-library" get '[ _ _ address-of ] over push-all ;
index 6f39b32a0110c906865162ff2ce1895e0479df18..8551ba53efc7c6dc715b6f4f20c1ff1e2221774b 100644 (file)
@@ -10,7 +10,7 @@ IN: ascii.tests
 
 [ 4 ] [
     0 "There are Four Upper Case characters"
-    [ LETTER? [ 1+ ] when ] each
+    [ LETTER? [ 1 + ] when ] each
 ] unit-test
 
 [ t f ] [ CHAR: \s ascii? 400 ascii? ] unit-test
index 47147fa3066f90711f64dc5d6d1266f17b6c7fca..eb2c9193a374b35e61a33a2f510f4c2582eaf04e 100644 (file)
@@ -34,7 +34,7 @@ SYMBOL: column
 : write1-lines ( ch -- )
     write1
     column get [
-        1+ [ 76 = [ crlf ] when ]
+        1 + [ 76 = [ crlf ] when ]
         [ 76 mod column set ] bi
     ] when* ;
 
@@ -48,7 +48,7 @@ SYMBOL: column
 
 : encode-pad ( seq n -- )
     [ 3 0 pad-tail binary [ encode3 ] with-byte-writer ]
-    [ 1+ ] bi* head-slice 4 CHAR: = pad-tail write-lines ; inline
+    [ 1 + ] bi* head-slice 4 CHAR: = pad-tail write-lines ; inline
 
 : decode4 ( seq -- )
     [ 0 [ base64>ch swap 6 shift bitor ] reduce 3 >be ]
index f408cc82a8be1ffabd378af6814a78c11b65fa05..af10eb18e495d7653ba2137a302586aaf74edf3c 100644 (file)
@@ -1,5 +1,5 @@
+USING: biassocs assocs namespaces tools.test hashtables kernel ;
 IN: biassocs.tests
-USING: biassocs assocs namespaces tools.test ;
 
 <bihash> "h" set
 
@@ -29,4 +29,14 @@ H{ { "a" "A" } { "b" "B" } } "a" set
 
 [ "A" ] [ "a" "b" get at ] unit-test
 
-[ "a" ] [ "A" "b" get value-at ] unit-test
\ No newline at end of file
+[ "a" ] [ "A" "b" get value-at ] unit-test
+
+[ ] [ H{ { 1 2 } } >biassoc "h" set ] unit-test
+
+[ ] [ "h" get clone "g" set ] unit-test
+
+[ ] [ 3 4 "g" get set-at ] unit-test
+
+[ H{ { 1 2 } } ] [ "h" get >hashtable ] unit-test
+
+[ H{ { 1 2 } { 4 3 } } ] [ "g" get >hashtable ] unit-test
index 5956589ba56eefce12c97af5c7276426bff61652..7daa478f544f0d14a1143696d70312e746054b64 100644 (file)
@@ -43,4 +43,7 @@ M: biassoc new-assoc
 INSTANCE: biassoc assoc
 
 : >biassoc ( assoc -- biassoc )
-    T{ biassoc } assoc-clone-like ;
\ No newline at end of file
+    T{ biassoc } assoc-clone-like ;
+
+M: biassoc clone
+    [ from>> ] [ to>> ] bi [ clone ] bi@ biassoc boa ;
index 63d2697418b3c297ae78e5c894433d68059d0e67..f2ea7503f4851f8a8ac6bdb371a21237053d03ce 100644 (file)
@@ -1,5 +1,5 @@
-IN: binary-search.tests
 USING: binary-search math.order vectors kernel tools.test ;
+IN: binary-search.tests
 
 [ f ] [ 3 { } [ <=> ] with search drop ] unit-test
 [ 0 ] [ 3 { 3 } [ <=> ] with search drop ] unit-test
@@ -9,7 +9,7 @@ USING: binary-search math.order vectors kernel tools.test ;
 [ 4 ] [ 5.5 { 1 2 3 4 5 6 7 8 } [ <=> ] with search drop ] unit-test
 [ 10 ] [ 10 20 >vector [ <=> ] with search drop ] unit-test
 
-[ t ] [ "hello" { "alligrator" "cat" "fish" "hello" "ikarus" "java" } sorted-member? ] unit-test
-[ 3 ] [ "hey" { "alligrator" "cat" "fish" "hello" "ikarus" "java" } sorted-index ] unit-test
-[ f ] [ "hello" { "alligrator" "cat" "fish" "ikarus" "java" } sorted-member? ] unit-test
-[ f ] [ "zebra" { "alligrator" "cat" "fish" "ikarus" "java" } sorted-member? ] unit-test
+[ t ] [ "hello" { "alligator" "cat" "fish" "hello" "ikarus" "java" } sorted-member? ] unit-test
+[ 3 ] [ "hey" { "alligator" "cat" "fish" "hello" "ikarus" "java" } sorted-index ] unit-test
+[ f ] [ "hello" { "alligator" "cat" "fish" "ikarus" "java" } sorted-member? ] unit-test
+[ f ] [ "zebra" { "alligator" "cat" "fish" "ikarus" "java" } sorted-member? ] unit-test
index cdec87b61dc1f2f4a31689ea9e74fce89e560266..0b5a63a9068ebf78311d88485677e97c9fcb0734 100644 (file)
@@ -44,33 +44,33 @@ PRIVATE>
 : <bit-array> ( n -- bit-array )
     dup bits>bytes <byte-array> bit-array boa ; inline
 
-M: bit-array length length>> ;
+M: bit-array length length>> ; inline
 
 M: bit-array nth-unsafe
-    [ >fixnum ] [ underlying>> ] bi* byte/bit bit? ;
+    [ >fixnum ] [ underlying>> ] bi* byte/bit bit? ; inline
 
 M: bit-array set-nth-unsafe
     [ >fixnum ] [ underlying>> ] bi*
     [ byte/bit set-bit ] 2keep
-    swap n>byte set-alien-unsigned-1 ;
+    swap n>byte set-alien-unsigned-1 ; inline
 
 GENERIC: clear-bits ( bit-array -- )
 
-M: bit-array clear-bits 0 (set-bits) ;
+M: bit-array clear-bits 0 (set-bits) ; inline
 
 GENERIC: set-bits ( bit-array -- )
 
-M: bit-array set-bits -1 (set-bits) ;
+M: bit-array set-bits -1 (set-bits) ; inline
 
 M: bit-array clone
-    [ length>> ] [ underlying>> clone ] bi bit-array boa ;
+    [ length>> ] [ underlying>> clone ] bi bit-array boa ; inline
 
 : >bit-array ( seq -- bit-array )
     T{ bit-array f 0 B{ } } clone-like ; inline
 
-M: bit-array like drop dup bit-array? [ >bit-array ] unless ;
+M: bit-array like drop dup bit-array? [ >bit-array ] unless ; inline
 
-M: bit-array new-sequence drop <bit-array> ;
+M: bit-array new-sequence drop <bit-array> ; inline
 
 M: bit-array equal?
     over bit-array? [ [ underlying>> ] bi@ sequence= ] [ 2drop f ] if ;
@@ -81,7 +81,7 @@ M: bit-array resize
         resize-byte-array
     ] 2bi
     bit-array boa
-    dup clean-up ;
+    dup clean-up ; inline
 
 M: bit-array byte-length length 7 + -3 shift ;
 
@@ -91,10 +91,10 @@ SYNTAX: ?{ \ } [ >bit-array ] parse-literal ;
     dup 0 = [
         <bit-array>
     ] [
-        [ log2 1+ <bit-array> 0 ] keep
+        [ log2 1 + <bit-array> 0 ] keep
         [ dup 0 = ] [
             [ pick underlying>> pick set-alien-unsigned-1 ] keep
-            [ 1+ ] [ -8 shift ] bi*
+            [ 1 + ] [ -8 shift ] bi*
         ] until 2drop
     ] if ;
 
index e77bb43986adf1e29216ab148daccc03d7dff023..6a1366a1ea3a9956bffd889de5c2e9662d897cff 100644 (file)
@@ -1,5 +1,5 @@
-IN: bit-sets.tests
 USING: bit-sets tools.test bit-arrays ;
+IN: bit-sets.tests
 
 [ ?{ t f t f t f } ] [
     ?{ t f f f t f }
index 41efdbd0d22b491fda2eca30d89b61a5381deba0..5af44b59f7f30577e24a753a74c4565fe1f03689 100644 (file)
@@ -1,5 +1,5 @@
-IN: bit-vectors.tests\r
 USING: tools.test bit-vectors vectors sequences kernel math ;\r
+IN: bit-vectors.tests\r
 \r
 [ 0 ] [ 123 <bit-vector> length ] unit-test\r
 \r
index a5b1b43acd0995061099bdc37f5d4a341b3a817d..794faa6055fc399f5c6a092ca62872b0fc125880 100644 (file)
@@ -5,7 +5,6 @@ grouping compression.lzw multiline byte-arrays io.encodings.binary
 io.streams.byte-array ;
 IN: bitstreams.tests
 
-
 [ BIN: 1111111111 ]
 [
     B{ HEX: 0f HEX: ff HEX: ff HEX: ff } <msb0-bit-reader>
index 2aa0059542862372be8010dd7a721da64c20fec0..0eef54dc66c6ae2f6738d992c38da26d080216a1 100644 (file)
@@ -70,7 +70,7 @@ GENERIC: poke ( value n bitstream -- )
     [ get-abp + ] [ set-abp ] bi ; inline
     
 : (align) ( n m -- n' )
-    [ /mod 0 > [ 1+ ] when ] [ * ] bi ; inline
+    [ /mod 0 > [ 1 + ] when ] [ * ] bi ; inline
     
 : align ( n bitstream -- )
     [ get-abp swap (align) ] [ set-abp ] bi ; inline
index d0f71474526622e14774c12940260ecd80e5f357..e9187cc3b1e6d1d4ee4a7cd6e77fdf0677b83213 100755 (executable)
@@ -35,83 +35,87 @@ gc
 : compile-unoptimized ( words -- )
     [ optimized? not ] filter compile ;
 
-nl
-"Compiling..." write flush
+"debug-compiler" get [
+    
+    nl
+    "Compiling..." write flush
 
-! Compile a set of words ahead of the full compile.
-! This set of words was determined semi-empirically
-! using the profiler. It improves bootstrap time
-! significantly, because frequenly called words
-! which are also quick to compile are replaced by
-! compiled definitions as soon as possible.
-{
-    not ?
+    ! Compile a set of words ahead of the full compile.
+    ! This set of words was determined semi-empirically
+    ! using the profiler. It improves bootstrap time
+    ! significantly, because frequenly called words
+    ! which are also quick to compile are replaced by
+    ! compiled definitions as soon as possible.
+    {
+        not ?
 
-    2over roll -roll
+        2over roll -roll
 
-    array? hashtable? vector?
-    tuple? sbuf? tombstone?
-    curry? compose? callable?
-    quotation?
+        array? hashtable? vector?
+        tuple? sbuf? tombstone?
+        curry? compose? callable?
+        quotation?
 
-    curry compose uncurry
+        curry compose uncurry
 
-    array-nth set-array-nth length>>
+        array-nth set-array-nth length>>
 
-    wrap probe
+        wrap probe
 
-    namestack*
+        namestack*
 
-    layout-of
-} compile-unoptimized
+        layout-of
+    } compile-unoptimized
 
-"." write flush
+    "." write flush
 
-{
-    bitand bitor bitxor bitnot
-} compile-unoptimized
+    {
+        bitand bitor bitxor bitnot
+    } compile-unoptimized
 
-"." write flush
+    "." write flush
 
-{
-    + 1+ 1- 2/ < <= > >= shift
-} compile-unoptimized
+    {
+        + 2/ < <= > >= shift
+    } compile-unoptimized
 
-"." write flush
+    "." write flush
 
-{
-    new-sequence nth push pop last flip
-} compile-unoptimized
+    {
+        new-sequence nth push pop last flip
+    } compile-unoptimized
 
-"." write flush
+    "." write flush
 
-{
-    hashcode* = equal? assoc-stack (assoc-stack) get set
-} compile-unoptimized
+    {
+        hashcode* = equal? assoc-stack (assoc-stack) get set
+    } compile-unoptimized
 
-"." write flush
+    "." write flush
 
-{
-    memq? split harvest sift cut cut-slice start index clone
-    set-at reverse push-all class number>string string>number
-    like clone-like
-} compile-unoptimized
+    {
+        memq? split harvest sift cut cut-slice start index clone
+        set-at reverse push-all class number>string string>number
+        like clone-like
+    } compile-unoptimized
 
-"." write flush
+    "." write flush
 
-{
-    lines prefix suffix unclip new-assoc update
-    word-prop set-word-prop 1array 2array 3array ?nth
-} compile-unoptimized
+    {
+        lines prefix suffix unclip new-assoc update
+        word-prop set-word-prop 1array 2array 3array ?nth
+    } compile-unoptimized
 
-"." write flush
+    "." write flush
 
-{
-    malloc calloc free memcpy
-} compile-unoptimized
+    {
+        malloc calloc free memcpy
+    } compile-unoptimized
 
-"." write flush
+    "." write flush
 
-vocabs [ words compile-unoptimized "." write flush ] each
+    vocabs [ words compile-unoptimized "." write flush ] each
 
-" done" print flush
+    " done" print flush
+
+] unless
\ No newline at end of file
index e7070d3cf2435a11297966168b0399a88dc8a28e..c5c6460041ecdf495180307b9745b4758fcf317e 100644 (file)
@@ -1,6 +1,6 @@
-IN: bootstrap.image.tests
 USING: bootstrap.image bootstrap.image.private tools.test
 kernel math ;
+IN: bootstrap.image.tests
 
 [ f ] [ { 1 2 3 } [ 1 2 3 ] eql? ] unit-test
 
index d76588e4e461c4870d0106054278a1747554a96b..38cb5c12fe1156e38278e4e7b9fd3fb320189475 100644 (file)
@@ -234,7 +234,7 @@ GENERIC: ' ( obj -- ptr )
 
 : bignum-bits ( -- n ) bootstrap-cell-bits 2 - ;
 
-: bignum-radix ( -- n ) bignum-bits 2^ 1- ;
+: bignum-radix ( -- n ) bignum-bits 2^ 1 - ;
 
 : bignum>seq ( n -- seq )
     #! n is positive or zero.
@@ -244,7 +244,7 @@ GENERIC: ' ( obj -- ptr )
 
 : emit-bignum ( n -- )
     dup dup 0 < [ neg ] when bignum>seq
-    [ nip length 1+ emit-fixnum ]
+    [ nip length 1 + emit-fixnum ]
     [ drop 0 < 1 0 ? emit ]
     [ nip emit-seq ]
     2tri ;
index d70a253e5f46a90cc3231205e2f3061b17d9636a..7f25ce9c017d7c4f934dc404d96addd525728440 100644 (file)
@@ -9,9 +9,9 @@ IN: bootstrap.image.upload
 SYMBOL: upload-images-destination
 
 : destination ( -- dest )
-  upload-images-destination get
-  "slava@factorcode.org:/var/www/factorcode.org/newsite/images/latest/"
-  or ;
+    upload-images-destination get
+    "slava@factorcode.org:/var/www/factorcode.org/newsite/images/latest/"
+    or ;
 
 : checksums ( -- temp ) "checksums.txt" temp-file ;
 
index 27b2f6b181f79f322c8185af743261099237a9f5..3bab31daeb0501ef6176113f164c73fea92e3aa1 100644 (file)
@@ -2,4 +2,4 @@ USING: vocabs vocabs.loader kernel ;
 
 "math.ratios" require
 "math.floats" require
-"math.complex" require
\ No newline at end of file
+"math.complex" require
index 6017469925719195280d486a5543402dfae3974b..e5e7e869c87bcca3c5c063f623db4673799365cb 100644 (file)
@@ -14,6 +14,7 @@ IN: bootstrap.tools
     "tools.test"
     "tools.time"
     "tools.threads"
+    "tools.deprecation"
     "vocabs.hierarchy"
     "vocabs.refresh"
     "vocabs.refresh.monitor"
index 71fc1c9a7b04788dbf1d781a53e60dfde27bb4c2..3bcb735217f9a79e2295c0af32c919d56bb32171 100644 (file)
@@ -1,5 +1,5 @@
-IN: boxes.tests\r
 USING: boxes namespaces tools.test accessors ;\r
+IN: boxes.tests\r
 \r
 [ ] [ <box> "b" set ] unit-test\r
 \r
index f1b9a5230334de5c4bcf701327d13c68200842f6..5c381b7db0a07253de2d4d5367d102d5fcfb945e 100644 (file)
@@ -8,4 +8,3 @@ SYNTAX: HEX{
     [ blank? not ] filter
     2 group [ hex> ] B{ } map-as
     parsed ;
-
diff --git a/basis/cache/cache-tests.factor b/basis/cache/cache-tests.factor
deleted file mode 100644 (file)
index cbf4f64..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-! Copyright (C) 2009 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: tools.test cache ;
-IN: cache.tests
index f16461bf450b994375afd92262db8366686a2024..3dab1acac8c8f865e5211494e2ab0978e01ad6c7 100644 (file)
@@ -38,6 +38,6 @@ PRIVATE>
 
 : purge-cache ( cache -- )
     dup max-age>> '[
-        [ nip [ 1+ ] change-age age>> _ >= ] assoc-partition
+        [ nip [ 1 + ] change-age age>> _ >= ] assoc-partition
         [ values dispose-each ] dip
-    ] change-assoc drop ;
\ No newline at end of file
+    ] change-assoc drop ;
index bf7c468774814c92e87dc29a7d5674a7dc84870a..cb19259984e0a0d9ec9ab25217c94a7422e38c6a 100644 (file)
@@ -1,8 +1,8 @@
-IN: cairo.tests
 USING: cairo tools.test math.rectangles accessors ;
+IN: cairo.tests
 
 [ { 10 20 } ] [
     { 10 20 } [
         { 0 1 } { 3 4 } <rect> fill-rect
     ] make-bitmap-image dim>>
-] unit-test
\ No newline at end of file
+] unit-test
index b39a7c746409d84e87c3c78300be5d325e442824..71e052bb6cd12116180100ffe32697f9036221a3 100644 (file)
@@ -27,7 +27,7 @@ HELP: <date>
 } ;
 
 HELP: month-names
-{ $values { "array" array } }
+{ $values { "value" object } }
 { $description "Returns an array with the English names of all the months." }
 { $warning "Do not use this array for looking up a month name directly. Use month-name instead." } ;
 
index 4b58b1b496b825302690c82dca6bbd9312d9189f..a8bb60cbf36396f4098e37c23baf3b0b52a67d80 100644 (file)
@@ -34,25 +34,25 @@ C: <timestamp> timestamp
 : <date> ( year month day -- timestamp )
     0 0 0 gmt-offset-duration <timestamp> ;
 
-ERROR: not-a-month ;
+ERROR: not-a-month ;
 M: not-a-month summary
     drop "Months are indexed starting at 1" ;
 
 <PRIVATE
 
 : check-month ( n -- n )
-    dup zero? [ not-a-month ] when ;
+    [ not-a-month ] when-zero ;
 
 PRIVATE>
 
-: month-names ( -- array )
+CONSTANT: month-names 
     {
         "January" "February" "March" "April" "May" "June"
         "July" "August" "September" "October" "November" "December"
-    } ;
+    }
 
 : month-name ( n -- string )
-    check-month 1- month-names nth ;
+    check-month 1 - month-names nth ;
 
 CONSTANT: month-abbreviations
     {
@@ -61,7 +61,7 @@ CONSTANT: month-abbreviations
     }
 
 : month-abbreviation ( n -- string )
-    check-month 1- month-abbreviations nth ;
+    check-month 1 - month-abbreviations nth ;
 
 CONSTANT: day-counts { 0 31 28 31 30 31 30 31 31 30 31 30 31 }
 
@@ -113,7 +113,7 @@ CONSTANT: day-abbreviations3
     100 b * d + 4800 -
     m 10 /i + m 3 +
     12 m 10 /i * -
-    e 153 m * 2 + 5 /i - 1+ ;
+    e 153 m * 2 + 5 /i - 1 + ;
 
 GENERIC: easter ( obj -- obj' )
 
@@ -186,9 +186,6 @@ GENERIC: +second ( timestamp x -- timestamp )
     { [ day>> 29 = ] [ month>> 2 = ] [ leap-year? not ] } 1&&
     [ 3 >>month 1 >>day ] when ;
 
-: unless-zero ( n quot -- )
-    [ dup zero? [ drop ] ] dip if ; inline
-
 M: integer +year ( timestamp n -- timestamp )
     [ [ + ] curry change-year adjust-leap-year ] unless-zero ;
 
@@ -196,7 +193,7 @@ M: real +year ( timestamp n -- timestamp )
     [ float>whole-part swapd days-per-year * +day swap +year ] unless-zero ;
 
 : months/years ( n -- months years )
-    12 /rem dup zero? [ drop 1- 12 ] when swap ; inline
+    12 /rem [ 1 - 12 ] when-zero swap ; inline
 
 M: integer +month ( timestamp n -- timestamp )
     [ over month>> + months/years [ >>month ] dip +year ] unless-zero ;
@@ -371,10 +368,10 @@ M: duration time-
     #! http://web.textfiles.com/computers/formulas.txt
     #! good for any date since October 15, 1582
     [
-        dup 2 <= [ [ 1- ] [ 12 + ] bi* ] when
+        dup 2 <= [ [ 1 - ] [ 12 + ] bi* ] when
         [ dup [ 4 /i + ] [ 100 /i - ] [ 400 /i + ] tri ] dip
-        [ 1+ 3 * 5 /i + ] keep 2 * +
-    ] dip 1+ + 7 mod ;
+        [ 1 + 3 * 5 /i + ] keep 2 * +
+    ] dip 1 + + 7 mod ;
 
 GENERIC: days-in-year ( obj -- n )
 
@@ -395,7 +392,7 @@ M: timestamp days-in-year ( timestamp -- n ) year>> days-in-year ;
     year leap-year? [
         year month day <date>
         year 3 1 <date>
-        after=? [ 1+ ] when
+        after=? [ 1 + ] when
     ] when ;
 
 : day-of-year ( timestamp -- n )
index ad43cc2f1d6d17fd811c14c4fbfce6aa641f9e55..6aa4126ff920f913ea4a7cd3e7b986793020c122 100644 (file)
@@ -68,8 +68,8 @@ M: array month. ( pair -- )
     [ (days-in-month) day-abbreviations2 " " join print ] 2tri\r
     over "   " <repetition> concat write\r
     [\r
-        [ 1+ day. ] keep\r
-        1+ + 7 mod zero? [ nl ] [ bl ] if\r
+        [ 1 + day. ] keep\r
+        1 + + 7 mod zero? [ nl ] [ bl ] if\r
     ] with each nl ;\r
 \r
 M: timestamp month. ( timestamp -- )\r
@@ -78,7 +78,7 @@ M: timestamp month. ( timestamp -- )
 GENERIC: year. ( obj -- )\r
 \r
 M: integer year. ( n -- )\r
-    12 [ 1+ 2array month. nl ] with each ;\r
+    12 [ 1 + 2array month. nl ] with each ;\r
 \r
 M: timestamp year. ( timestamp -- )\r
     year>> year. ;\r
@@ -162,7 +162,7 @@ M: timestamp year. ( timestamp -- )
 \r
 : read-rfc3339-seconds ( s -- s' ch )\r
     "+-Z" read-until [\r
-        [ string>number ] [ length 10 swap ^ ] bi / +\r
+        [ string>number ] [ length 10^ ] bi / +\r
     ] dip ;\r
 \r
 : (rfc3339>timestamp) ( -- timestamp )\r
@@ -201,7 +201,7 @@ ERROR: invalid-timestamp-format ;
         "," read-token day-abbreviations3 member? check-timestamp drop\r
         read1 CHAR: \s assert=\r
         read-sp checked-number >>day\r
-        read-sp month-abbreviations index 1+ check-timestamp >>month\r
+        read-sp month-abbreviations index 1 + check-timestamp >>month\r
         read-sp checked-number >>year\r
         ":" read-token checked-number >>hour\r
         ":" read-token checked-number >>minute\r
@@ -220,7 +220,7 @@ ERROR: invalid-timestamp-format ;
         "," read-token check-day-name\r
         read1 CHAR: \s assert=\r
         "-" read-token checked-number >>day\r
-        "-" read-token month-abbreviations index 1+ check-timestamp >>month\r
+        "-" read-token month-abbreviations index 1 + check-timestamp >>month\r
         read-sp checked-number >>year\r
         ":" read-token checked-number >>hour\r
         ":" read-token checked-number >>minute\r
@@ -233,7 +233,7 @@ ERROR: invalid-timestamp-format ;
 : (cookie-string>timestamp-2) ( -- timestamp )\r
     timestamp new\r
         read-sp check-day-name\r
-        read-sp month-abbreviations index 1+ check-timestamp >>month\r
+        read-sp month-abbreviations index 1 + check-timestamp >>month\r
         read-sp checked-number >>day\r
         ":" read-token checked-number >>hour\r
         ":" read-token checked-number >>minute\r
index 1e51fb06d8f68106bef94558503014e69635edc8..99fa41cd400e7788dc76a2046ca124f7b3d05760 100644 (file)
@@ -7,7 +7,7 @@ locals sequences ;
 IN: channels.examples
 
 : (counter) ( channel n -- )
-    [ swap to ] 2keep 1+ (counter) ;
+    [ swap to ] 2keep 1 + (counter) ;
     
 : counter ( channel -- )
     2 (counter) ;    
index f221cefef2193ebd1079f9199908d1cc27666e26..5cc6b0242572fd512a4b32fdb58306578d637b5e 100644 (file)
@@ -1,9 +1,7 @@
 ! Copyright (C) 2009 Alaric Snell-Pym
 ! See http://factorcode.org/license.txt for BSD license.
-
 USING: checksums classes.singleton kernel math math.ranges
 math.vectors sequences ;
-
 IN: checksums.fnv1
 
 SINGLETON: fnv1-32
index b7f388c0029d104adf044db5a755545ea14fecf3..730c0b851662d93fef29e13475ed6b4d56299d50 100644 (file)
@@ -1,6 +1,8 @@
+! Copyright (C) 2009 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
 USING: byte-arrays checksums checksums.md5 io.encodings.binary
 io.streams.byte-array kernel math namespaces tools.test ;
-
+IN: checksums.md5.tests 
 
 [ "d41d8cd98f00b204e9800998ecf8427e" ] [ "" >byte-array md5 checksum-bytes hex-string ] unit-test
 [ "0cc175b9c0f1b6a831c399e269772661" ] [ "a" >byte-array md5 checksum-bytes hex-string ] unit-test
index b4a9d547f2edc888bde7efce60371f3f53616502..c3c4860f953a3e51b1f219f811ec4c015f561374 100644 (file)
@@ -2,6 +2,7 @@
 ! See http;//factorcode.org/license.txt for BSD license
 USING: arrays kernel tools.test sequences sequences.private
 circular strings ;
+IN: circular.tests
 
 [ 0 ] [ { 0 1 2 3 4 } <circular> 0 swap virtual@ drop ] unit-test
 [ 2 ] [ { 0 1 2 3 4 } <circular> 2 swap virtual@ drop ] unit-test
index 9995567ec899c93f047e0f07f97343cf34d6e737..b3be4651cd627799269edbefa72ac168f97718ba 100644 (file)
@@ -51,7 +51,7 @@ PRIVATE>
 
 : push-growing-circular ( elt circular -- )
     dup full? [ push-circular ]
-    [ [ 1+ ] change-length set-last ] if ;
+    [ [ 1 + ] change-length set-last ] if ;
 
 : <growing-circular> ( capacity -- growing-circular )
     { } new-sequence 0 0 growing-circular boa ;
index 4ed9d7de67bf3f78160fa82ac012f0c9d3396d53..a798eb15ba0cee9e917d744f1ad87a8aacec9ca5 100644 (file)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2005, 2006 Kevin Reid.
 ! See http://factorcode.org/license.txt for BSD license.
-IN: cocoa.callbacks
 USING: assocs kernel namespaces cocoa cocoa.classes
 cocoa.subclassing debugger ;
+IN: cocoa.callbacks
 
 SYMBOL: callbacks
 
index 4b5af2e39d3ce533aa8b24b0a7512df388b15edc..c657a5e6e896c82cc63cb5ffa0428e97c56b2c3c 100644 (file)
@@ -1,7 +1,7 @@
-IN: cocoa.tests
 USING: cocoa cocoa.messages cocoa.subclassing cocoa.types
 compiler kernel namespaces cocoa.classes tools.test memory
 compiler.units math core-graphics.types ;
+IN: cocoa.tests
 
 CLASS: {
     { +superclass+ "NSObject" }
index a3fa788f209986f9edb9d92b9fd63d0fcab7fa15..9da285f34c157980de5d51d3a57f3d4275467019 100644 (file)
@@ -172,7 +172,7 @@ ERROR: no-objc-type name ;
     [ ] [ no-objc-type ] ?if ;
 
 : (parse-objc-type) ( i string -- ctype )
-    [ [ 1+ ] dip ] [ nth ] 2bi {
+    [ [ 1 + ] dip ] [ nth ] 2bi {
         { [ dup "rnNoORV" member? ] [ drop (parse-objc-type) ] }
         { [ dup CHAR: ^ = ] [ 3drop "void*" ] }
         { [ dup CHAR: { = ] [ drop objc-struct-type ] }
index 4f74cd850acd65bd523dba682a8f8ec2e96f416d..e5d7dfd2399403a09201b54bff1cb3625bae6c2c 100644 (file)
@@ -1,7 +1,7 @@
-IN: cocoa.plists.tests
 USING: tools.test cocoa.plists colors kernel hashtables
 core-foundation.utilities core-foundation destructors
 assocs cocoa.enumeration ;
+IN: cocoa.plists.tests
 
 [
     [ V{ } ] [ H{ } >cf &CFRelease [ ] NSFastEnumeration-map ] unit-test
@@ -37,4 +37,4 @@ assocs cocoa.enumeration ;
     [ 3.5 ] [
         3.5 >cf &CFRelease plist>
     ] unit-test
-] with-destructors
\ No newline at end of file
+] with-destructors
index a825cacda8d2526a1e3707feccf2c1f5bbbe2582..278906ce0ea3b3ea2c27fc4eedd7075def8df3cd 100644 (file)
@@ -1,5 +1,5 @@
-IN: colors.hsv.tests
 USING: accessors kernel colors colors.hsv tools.test math ;
+IN: colors.hsv.tests
 
 : hsv>rgb ( h s v -- r g b )
     [ 360 * ] 2dip
@@ -25,4 +25,4 @@ USING: accessors kernel colors colors.hsv tools.test math ;
 [ 5/6 5/36 5/6 ] [ 5/6 5/6 5/6 hsv>rgb ] unit-test
 [ 1/6 0 1/6 ] [ 5/6 1 1/6 hsv>rgb ] unit-test
 
-[ 0.5 ] [ 180 0.1 0.2 0.5 <hsva> alpha>> ] unit-test
\ No newline at end of file
+[ 0.5 ] [ 180 0.1 0.2 0.5 <hsva> alpha>> ] unit-test
index 657b9e0a25b286b02beeedb512fadba230602ead..a53f5c11853fa3c9d0fdf7c22b6bfffcfee455d3 100644 (file)
@@ -1,5 +1,5 @@
-IN: columns.tests
 USING: columns sequences kernel namespaces arrays tools.test math ;
+IN: columns.tests
 
 ! Columns
 { { 1 2 3 } { 4 5 6 } { 7 8 9 } } [ clone ] map "seq" set
index 7ec4a0e6572a0818a39fcabc623d425e9f9957d5..c8cf8ffc1bb3afc37a2845421e52426e61359f7d 100644 (file)
@@ -1,32 +1,18 @@
-
 USING: kernel math tools.test combinators.short-circuit.smart ;
-
 IN: combinators.short-circuit.smart.tests
 
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-: must-be-t ( in -- ) [ t ] swap unit-test ;
-: must-be-f ( in -- ) [ f ] swap unit-test ;
-
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-[       { [ 1 ] [ 2 ] [ 3 ] }          &&  3 = ] must-be-t
-[ 3     { [ 0 > ] [ odd? ] [ 2 + ] }    &&  5 = ] must-be-t
-[ 10 20 { [ + 0 > ] [ - even? ] [ + ] } && 30 = ] must-be-t
-
-[       { [ 1 ] [ f ] [ 3 ] } &&  3 = ]          must-be-f
-[ 3     { [ 0 > ] [ even? ] [ 2 + ] } && ]       must-be-f
-[ 10 20 { [ + 0 > ] [ - odd? ] [ + ] } && 30 = ] must-be-f
-
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-[ { [ 10 0 < ] [ f ] [ "factor" ] } || "factor" = ] must-be-t
+[ t ] [       { [ 1 ] [ 2 ] [ 3 ] }          &&  3 = ] unit-test
+[ t ] [ 3     { [ 0 > ] [ odd? ] [ 2 + ] }    &&  5 = ] unit-test
+[ t ] [ 10 20 { [ + 0 > ] [ - even? ] [ + ] } && 30 = ] unit-test
 
-[ 10 { [ odd? ] [ 100 > ] [ 1 + ] } || 11 = ]       must-be-t
+[ f ] [       { [ 1 ] [ f ] [ 3 ] } &&  3 = ]          unit-test
+[ f ] [ 3     { [ 0 > ] [ even? ] [ 2 + ] } && ]       unit-test
+[ f ] [ 10 20 { [ + 0 > ] [ - odd? ] [ + ] } && 30 = ] unit-test
 
-[ 10 20 { [ + odd? ] [ + 100 > ] [ + ] } || 30 = ]  must-be-t
+[ t ] [ { [ 10 0 < ] [ f ] [ "factor" ] } || "factor" = ] unit-test
 
-[ { [ 10 0 < ] [ f ] [ 0 1 = ] } || ] must-be-f
+[ t ] [ 10 { [ odd? ] [ 100 > ] [ 1 + ] } || 11 = ]       unit-test
 
-! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+[ t ] [ 10 20 { [ + odd? ] [ + 100 > ] [ + ] } || 30 = ]  unit-test
 
+[ f ] [ { [ 10 0 < ] [ f ] [ 0 1 = ] } || ] unit-test
index b80e7294d15e064c926a36a09ff732c2cb1eaebe..7264a07917a1867fd933efc750f96ec5240741f5 100644 (file)
@@ -1,13 +1,15 @@
-USING: kernel sequences math stack-checker effects accessors macros
-fry combinators.short-circuit ;
+USING: kernel sequences math stack-checker effects accessors
+macros fry combinators.short-circuit ;
 IN: combinators.short-circuit.smart
 
 <PRIVATE
 
+ERROR: cannot-determine-arity ;
+
 : arity ( quots -- n )
     first infer
-    dup terminated?>> [ "Cannot determine arity" throw ] when
-    effect-height neg 1+ ;
+    dup terminated?>> [ cannot-determine-arity ] when
+    effect-height neg 1 + ;
 
 PRIVATE>
 
index d8ee89ef2d5d7ecea076936d5973261a09760f85..59b65d91cd2128f62497af370d46b4e31df4f894 100644 (file)
@@ -28,7 +28,7 @@ HELP: output>array
     { $example
         <" USING: combinators combinators.smart math prettyprint ;
 9 [
-    { [ 1- ] [ 1+ ] [ sq ] } cleave
+    { [ 1 - ] [ 1 + ] [ sq ] } cleave
 ] output>array .">
     "{ 8 10 81 }"
     }
@@ -71,7 +71,7 @@ HELP: sum-outputs
 { $examples
     { $example
         "USING: combinators.smart kernel math prettyprint ;"
-        "10 [ [ 1- ] [ 1+ ] bi ] sum-outputs ."
+        "10 [ [ 1 - ] [ 1 + ] bi ] sum-outputs ."
         "20"
     }
 } ;
index a18ef1f3b8804f69cefa6a3525e5904833e5474e..399b4dc36fe35feaf226288c2944ea555094265c 100644 (file)
@@ -4,7 +4,7 @@ USING: tools.test combinators.smart math kernel accessors ;
 IN: combinators.smart.tests
 
 : test-bi ( -- 9 11 )
-    10 [ 1- ] [ 1+ ] bi ;
+    10 [ 1 - ] [ 1 + ] bi ;
 
 [ [ test-bi ] output>array ] must-infer
 [ { 9 11 } ] [ [ test-bi ] output>array ] unit-test
@@ -46,4 +46,4 @@ IN: combinators.smart.tests
 
 [ { { 1 2 } { 3 4 } } ] [ nested-smart-combo-test ] unit-test
 
-[ 14 ] [ [ 1 2 3 ] [ sq ] [ + ] map-reduce-outputs ] unit-test
\ No newline at end of file
+[ 14 ] [ [ 1 2 3 ] [ sq ] [ + ] map-reduce-outputs ] unit-test
diff --git a/basis/compiler/cfg/alias-analysis/alias-analysis-tests.factor b/basis/compiler/cfg/alias-analysis/alias-analysis-tests.factor
deleted file mode 100644 (file)
index 79165f2..0000000
+++ /dev/null
@@ -1 +0,0 @@
-IN: compiler.cfg.alias-analysis.tests
index c3d2deeb023ae31fadbab1d43a880e8422fb83f9..526df79cb3018abd7eadfe5e6063d503eae4a48a 100644 (file)
@@ -144,7 +144,7 @@ ERROR: vreg-has-no-slots vreg ;
 SYMBOL: ac-counter
 
 : next-ac ( -- n )
-    ac-counter [ dup 1+ ] change ;
+    ac-counter [ dup 1 + ] change ;
 
 ! Alias class for objects which are loaded from the data stack
 ! or other object slots. We pessimistically assume that they
@@ -285,4 +285,4 @@ M: insn eliminate-dead-stores* ;
     eliminate-dead-stores ;
 
 : alias-analysis ( cfg -- cfg' )
-    [ alias-analysis-step ] local-optimization ;
\ No newline at end of file
+    [ alias-analysis-step ] local-optimization ;
index 09f670ac54c4b574c05d55fa4d92afa3030d8702..2c472bc0ff0d8e9fec792d6bfb4a37640f647272 100644 (file)
@@ -1,11 +1,11 @@
-IN: compiler.cfg.builder.tests
 USING: tools.test kernel sequences words sequences.private fry
 prettyprint alien alien.accessors math.private compiler.tree.builder
 compiler.tree.optimizer compiler.cfg.builder compiler.cfg.debugger
 compiler.cfg.optimizer compiler.cfg.predecessors compiler.cfg.checker
 compiler.cfg arrays locals byte-arrays kernel.private math
 slots.private vectors sbufs strings math.partial-dispatch
-strings.private ;
+strings.private accessors compiler.cfg.instructions ;
+IN: compiler.cfg.builder.tests
 
 ! Just ensure that various CFGs build correctly.
 : unit-test-cfg ( quot -- )
@@ -157,3 +157,26 @@ strings.private ;
     { pinned-c-ptr class } \ set-alien-cell '[ _ declare 10 _ execute ] unit-test-cfg
     { pinned-c-ptr class fixnum } \ set-alien-cell '[ _ declare _ execute ] unit-test-cfg
 ] each
+
+: contains-insn? ( quot insn-check -- ? )
+    [ test-mr [ instructions>> ] map ] dip
+    '[ _ any? ] any? ; inline
+
+[ t ] [ [ swap ] [ ##replace? ] contains-insn? ] unit-test
+
+[ f ] [ [ swap swap ] [ ##replace? ] contains-insn? ] unit-test
+
+[ t ] [
+    [ { fixnum byte-array fixnum } declare set-alien-unsigned-1 ]
+    [ ##set-alien-integer-1? ] contains-insn?
+] unit-test
+
+[ t ] [
+    [ { fixnum byte-array fixnum } declare [ dup * dup * ] 2dip set-alien-unsigned-1 ]
+    [ ##set-alien-integer-1? ] contains-insn?
+] unit-test
+
+[ f ] [
+    [ { byte-array fixnum } declare set-alien-unsigned-1 ]
+    [ ##set-alien-integer-1? ] contains-insn?
+] unit-test
\ No newline at end of file
diff --git a/basis/compiler/cfg/cfg-tests.factor b/basis/compiler/cfg/cfg-tests.factor
deleted file mode 100644 (file)
index e69de29..0000000
index 62043fb413aaf5dcbeab23d0955b3cf4af670684..dde44fd15ddcfe8306242491e040274f2fa06c0e 100644 (file)
@@ -5,7 +5,7 @@ namespaces functors compiler.cfg.rpo compiler.cfg.utilities
 compiler.cfg.predecessors compiler.cfg ;
 IN: compiler.cfg.dataflow-analysis
 
-GENERIC: join-sets ( sets dfa -- set )
+GENERIC: join-sets ( sets bb dfa -- set )
 GENERIC: transfer-set ( in-set bb dfa -- out-set )
 GENERIC: block-order ( cfg dfa -- bbs )
 GENERIC: successors ( bb dfa -- seq )
@@ -23,7 +23,11 @@ GENERIC# compute-in-set 2 ( bb out-sets dfa -- set )
 M: kill-block compute-in-set 3drop f ;
 
 M:: basic-block compute-in-set ( bb out-sets dfa -- set )
-    bb dfa predecessors [ out-sets at ] map dfa join-sets ;
+    ! Only consider initialized sets.
+    bb dfa predecessors
+    [ out-sets key? ] filter
+    [ out-sets at ] map
+    bb dfa join-sets ;
 
 :: update-in-set ( bb in-sets out-sets dfa -- ? )
     bb out-sets dfa compute-in-set
@@ -56,7 +60,7 @@ M:: basic-block compute-out-set ( bb in-sets dfa -- set )
     in-sets
     out-sets ; inline
 
-M: dataflow-analysis join-sets drop assoc-refine ;
+M: dataflow-analysis join-sets 2drop assoc-refine ;
 
 FUNCTOR: define-analysis ( name -- )
 
index 21978d0f9bed79dc5521748166766be58d4be21a..a4f0819397bfe701d6e39a23dbf02bf0f3ba4196 100644 (file)
@@ -8,6 +8,7 @@ compiler.cfg
 compiler.cfg.debugger
 compiler.cfg.instructions
 compiler.cfg.registers ;
+IN: compiler.cfg.def-use.tests
 
 V{
     T{ ##peek f 0 D 0 }
index 81d573a4e21a2a141999867fd5af6a6acd1111b3..b24e51abfb923942597b7bebd95c9c96c81575e6 100644 (file)
@@ -1,7 +1,7 @@
-IN: compiler.cfg.dominance.tests
 USING: tools.test sequences vectors namespaces kernel accessors assocs sets
 math.ranges arrays compiler.cfg compiler.cfg.dominance compiler.cfg.debugger
 compiler.cfg.predecessors ;
+IN: compiler.cfg.dominance.tests
 
 : test-dominance ( -- )
     cfg new 0 get >>entry
index 9059713e2176aebddf56cc6c7dfe8566005091e4..5580de9a478b1af64839ea6ac40aca7431b31845 100644 (file)
@@ -1,8 +1,8 @@
-IN: compiler.cfg.gc-checks.tests
 USING: compiler.cfg.gc-checks compiler.cfg.debugger
 compiler.cfg.registers compiler.cfg.instructions compiler.cfg
 compiler.cfg.predecessors cpu.architecture tools.test kernel vectors
 namespaces accessors sequences ;
+IN: compiler.cfg.gc-checks.tests
 
 : test-gc-checks ( -- )
     H{ } clone representations set
@@ -23,4 +23,4 @@ V{
 
 [ ] [ test-gc-checks ] unit-test
 
-[ V{ D 0 D 2 } ] [ 1 get instructions>> first uninitialized-locs>> ] unit-test
\ No newline at end of file
+[ V{ D 0 D 2 } ] [ 1 get instructions>> first uninitialized-locs>> ] unit-test
index 8afd9f80ca29fcedb989bdedfdeeddb5afdf12d9..d4aa2750c002ccab82d6314da37591ac24539dc0 100644 (file)
@@ -8,11 +8,11 @@ compiler.cfg.utilities compiler.cfg.builder.blocks ;
 IN: compiler.cfg.intrinsics.allot
 
 : ##set-slots ( regs obj class -- )
-    '[ _ swap 1+ _ tag-number ##set-slot-imm ] each-index ;
+    '[ _ swap 1 + _ tag-number ##set-slot-imm ] each-index ;
 
 : emit-simple-allot ( node -- )
     [ in-d>> length ] [ node-output-infos first class>> ] bi
-    [ drop ds-load ] [ [ 1+ cells ] dip ^^allot ] [ nip ] 2tri
+    [ drop ds-load ] [ [ 1 + cells ] dip ^^allot ] [ nip ] 2tri
     [ ##set-slots ] [ [ drop ] [ ds-push ] [ drop ] tri* ] 3bi ;
 
 : tuple-slot-regs ( layout -- vregs )
index b1a8223026014da2e9b642d5d36946e663c49b3d..47c1f0ae76e673c6bc0b211708494cd933bf33e7 100644 (file)
@@ -1,9 +1,9 @@
-IN: compiler.cfg.linear-scan.resolve.tests
 USING: compiler.cfg.linear-scan.resolve tools.test kernel namespaces
 accessors
 compiler.cfg
 compiler.cfg.instructions cpu.architecture make sequences
 compiler.cfg.linear-scan.allocation.state ;
+IN: compiler.cfg.linear-scan.resolve.tests
 
 [
     {
@@ -64,4 +64,4 @@ H{ } clone spill-temps set
             T{ _reload { dst 0 } { rep int-rep } { n 8 } }
         }
     } member?
-] unit-test
\ No newline at end of file
+] unit-test
index b45e2c959733ea8d789e8f884d3b361489338bff..15dff234488c684cc069a72fd703557bd4781cf3 100644 (file)
@@ -65,7 +65,7 @@ SYMBOL: temp
 
 : perform-mappings ( bb to mappings -- )
     dup empty? [ 3drop ] [
-        mapping-instructions <simple-block> insert-basic-block
+        mapping-instructions insert-simple-basic-block
         cfg get cfg-changed drop
     ] if ;
 
diff --git a/basis/compiler/cfg/linearization/linearization-tests.factor b/basis/compiler/cfg/linearization/linearization-tests.factor
deleted file mode 100644 (file)
index fe8b4fd..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-IN: compiler.cfg.linearization.tests
-USING: compiler.cfg.linearization tools.test ;
-
-
index 6c67769a45858b0580e68c792a569b79f8af7a08..a10b48cc0ce034332acc1dbda673ca6d11290b59 100644 (file)
@@ -28,4 +28,4 @@ M: live-analysis transfer-set
     drop instructions>> transfer-liveness ;
 
 M: live-analysis join-sets
-    drop assoc-combine ;
\ No newline at end of file
+    2drop assoc-combine ;
index d525f91ed3e7822883c88a4d2107fa82b5c09c84..80203c65e4b8a3b841554721acb77511bb2bb8bb 100644 (file)
@@ -1,8 +1,8 @@
-IN: compiler.cfg.loop-detection.tests
 USING: compiler.cfg compiler.cfg.loop-detection
 compiler.cfg.predecessors
 compiler.cfg.debugger
 tools.test kernel namespaces accessors ;
+IN: compiler.cfg.loop-detection.tests
 
 V{ } 0 test-bb
 V{ } 1 test-bb
index dc70656c081f74584a21f2a05a97483e4ab49d76..73b99ee132144643ffe3b203b867625d9e18d36d 100644 (file)
@@ -6,10 +6,10 @@ IN: compiler.cfg.loop-detection
 
 TUPLE: natural-loop header index ends blocks ;
 
-<PRIVATE
-
 SYMBOL: loops
 
+<PRIVATE
+
 : <natural-loop> ( header index -- loop )
     H{ } clone H{ } clone natural-loop boa ;
 
@@ -80,4 +80,4 @@ PRIVATE>
 
 : needs-loops ( cfg -- cfg' )
     needs-predecessors
-    dup loops-valid?>> [ detect-loops t >>loops-valid? ] unless ;
\ No newline at end of file
+    dup loops-valid?>> [ detect-loops t >>loops-valid? ] unless ;
diff --git a/basis/compiler/cfg/optimizer/optimizer-tests.factor b/basis/compiler/cfg/optimizer/optimizer-tests.factor
deleted file mode 100755 (executable)
index e69de29..0000000
diff --git a/basis/compiler/cfg/representations/preferred/preferred-tests.factor b/basis/compiler/cfg/representations/preferred/preferred-tests.factor
deleted file mode 100644 (file)
index e69de29..0000000
index ca81c69bc0a6fc2db01e90dcdf4114828f571045..f1f7880c901ed17739a0b51a887ea5653836cb0f 100644 (file)
@@ -45,7 +45,7 @@ ERROR: bad-peek dst loc ;
     ! computing anything.
     2dup [ kill-block? ] both? [ 2drop ] [
         2dup [ [ insert-replaces ] [ insert-peeks ] 2bi ] V{ } make
-        [ 2drop ] [ <simple-block> insert-basic-block ] if-empty
+        [ 2drop ] [ insert-simple-basic-block ] if-empty
     ] if ;
 
 : visit-block ( bb -- )
@@ -56,4 +56,4 @@ ERROR: bad-peek dst loc ;
 
     dup [ visit-block ] each-basic-block
 
-    cfg-changed ;
\ No newline at end of file
+    cfg-changed ;
index c0ca385d906f7321c1d6b7ce44ae2daca7c098cb..30a999064ad1f6ce46e31edde7a68fe241b62728 100644 (file)
@@ -21,7 +21,7 @@ BACKWARD-ANALYSIS: live
 
 M: live-analysis transfer-set drop transfer-peeked-locs ;
 
-M: live-analysis join-sets drop assoc-combine ;
+M: live-analysis join-sets 2drop assoc-combine ;
 
 ! A stack location is available at a location if all paths from
 ! the entry block to the location load the location into a
@@ -56,4 +56,4 @@ M: dead-analysis transfer-set
         [ compute-dead-sets ]
         [ compute-avail-sets ]
         [ ]
-    } cleave ;
\ No newline at end of file
+    } cleave ;
index 4878dbe3ab6b338ffd48624b014b3bd01c54031c..30a2c4c13f2fe43e48450c293857d068bb03fc84 100644 (file)
@@ -69,18 +69,11 @@ M: rs-loc translate-local-loc n>> current-height get r>> - <rs-loc> ;
 
 : peek-loc ( loc -- vreg )
     translate-local-loc
-    dup local-replace-set get key? [ dup local-peek-set get conjoin ] unless
-    dup replace-mapping get at [ ] [ loc>vreg ] ?if ;
+    dup replace-mapping get at
+    [ ] [ dup local-peek-set get conjoin loc>vreg ] ?if ;
 
 : replace-loc ( vreg loc -- )
-    translate-local-loc
-    2dup loc>vreg =
-    [ nip replace-mapping get delete-at ]
-    [
-        [ local-replace-set get conjoin ]
-        [ replace-mapping get set-at ]
-        bi
-    ] if ;
+    translate-local-loc replace-mapping get set-at ;
 
 : compute-local-kill-set ( -- assoc )
     basic-block get current-height get
@@ -90,13 +83,17 @@ M: rs-loc translate-local-loc n>> current-height get r>> - <rs-loc> ;
 
 : begin-local-analysis ( -- )
     H{ } clone local-peek-set set
-    H{ } clone local-replace-set set
     H{ } clone replace-mapping set
     current-height get
     [ 0 >>emit-d 0 >>emit-r drop ]
     [ [ d>> ] [ r>> ] bi basic-block get record-stack-heights ] bi ;
 
+: remove-redundant-replaces ( -- )
+    replace-mapping get [ [ loc>vreg ] dip = not ] assoc-filter
+    [ replace-mapping set ] [ keys unique local-replace-set set ] bi ;
+
 : end-local-analysis ( -- )
+    remove-redundant-replaces
     emit-changes
     basic-block get {
         [ [ local-peek-set get ] dip peek-sets get set-at ]
diff --git a/basis/compiler/cfg/stacks/stacks-tests.factor b/basis/compiler/cfg/stacks/stacks-tests.factor
deleted file mode 100644 (file)
index e69de29..0000000
index 9c8a41f2c4fba5abac216484b4ec713d1f11d9b5..61c3cd67d1ffc5a309b1026d22867c74c37d47bb 100644 (file)
@@ -1,8 +1,8 @@
-IN: compiler.cfg.stacks.uninitialized.tests
 USING: compiler.cfg.stacks.uninitialized compiler.cfg.debugger
 compiler.cfg.registers compiler.cfg.instructions compiler.cfg
 compiler.cfg.predecessors cpu.architecture tools.test kernel vectors
 namespaces accessors sequences ;
+IN: compiler.cfg.stacks.uninitialized.tests
 
 : test-uninitialized ( -- )
     cfg new 0 get >>entry
index 97211eb8e8824cddbf09ba87379a9b2d2ebf686c..ce0e98de5f3095eee23a89feb8784011c5285225 100644 (file)
@@ -65,7 +65,7 @@ M: uninitialized-analysis transfer-set ( pair bb analysis -- pair' )
     drop [ prepare ] dip visit-block finish ;
 
 M: uninitialized-analysis join-sets ( sets analysis -- pair )
-    drop sift [ f ] [ [ ] [ [ (join-sets) ] 2map ] map-reduce ] if-empty ;
+    2drop sift [ f ] [ [ ] [ [ (join-sets) ] 2map ] map-reduce ] if-empty ;
 
 : uninitialized-locs ( bb -- locs )
     uninitialized-in dup [
@@ -73,4 +73,4 @@ M: uninitialized-analysis join-sets ( sets analysis -- pair )
         [ [ <ds-loc> ] (uninitialized-locs) ]
         [ [ <rs-loc> ] (uninitialized-locs) ]
         bi* append
-    ] when ;
\ No newline at end of file
+    ] when ;
index 2e26151d04127f2cb8174838d783d3a9a5cfce01..09d88a29598c676fe569f66f3eac837821ee239a 100644 (file)
@@ -1,6 +1,6 @@
-IN: compiler.cfg.two-operand.tests
 USING: kernel compiler.cfg.two-operand compiler.cfg.instructions
 compiler.cfg.registers cpu.architecture namespaces tools.test ;
+IN: compiler.cfg.two-operand.tests
 
 3 vreg-counter set-global
 
index 6d68bca4b9fd9d907754b5b9187cd0bc968b3be6..bb61a6393905a2c5c4c5c701ae66151445a0dab9 100644 (file)
@@ -3,7 +3,7 @@
 USING: accessors assocs combinators combinators.short-circuit
 cpu.architecture kernel layouts locals make math namespaces sequences
 sets vectors fry compiler.cfg compiler.cfg.instructions
-compiler.cfg.rpo ;
+compiler.cfg.rpo arrays ;
 IN: compiler.cfg.utilities
 
 PREDICATE: kill-block < basic-block
@@ -37,16 +37,16 @@ SYMBOL: visited
 : skip-empty-blocks ( bb -- bb' )
     H{ } clone visited [ (skip-empty-blocks) ] with-variable ;
 
-:: insert-basic-block ( from to bb -- )
-    bb from 1vector >>predecessors drop
+:: insert-basic-block ( froms to bb -- )
+    bb froms V{ } like >>predecessors drop
     bb to 1vector >>successors drop
-    to predecessors>> [ dup from eq? [ drop bb ] when ] change-each
-    from successors>> [ dup to eq? [ drop bb ] when ] change-each ;
+    to predecessors>> [ dup froms memq? [ drop bb ] when ] change-each
+    froms [ successors>> [ dup to eq? [ drop bb ] when ] change-each ] each ;
 
 : add-instructions ( bb quot -- )
     [ instructions>> building ] dip '[
         building get pop
-        @
+        [ @ ] dip
         ,
     ] with-variable ; inline
 
@@ -56,6 +56,9 @@ SYMBOL: visited
     \ ##branch new-insn over push
     >>instructions ;
 
+: insert-simple-basic-block ( from to insns -- )
+    [ 1vector ] 2dip <simple-block> insert-basic-block ;
+
 : has-phis? ( bb -- ? )
     instructions>> first ##phi? ;
 
diff --git a/basis/compiler/cfg/write-barrier/authors.txt b/basis/compiler/cfg/write-barrier/authors.txt
new file mode 100644 (file)
index 0000000..a44f8d7
--- /dev/null
@@ -0,0 +1,2 @@
+Slava Pestov
+Daniel Ehrenberg
index c09f404d4c17db8831550cf700de9dda9642e8c7..a73451042da42fd9b60c0a4fa4e002e7bc4109cb 100644 (file)
@@ -1,7 +1,16 @@
-USING: compiler.cfg.write-barrier compiler.cfg.instructions
-compiler.cfg.registers compiler.cfg.debugger cpu.architecture
-arrays tools.test vectors compiler.cfg kernel accessors
-compiler.cfg.utilities ;
+! Copyright (C) 2008, 2009 Slava Pestov, Daniel Ehrenberg.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors arrays assocs compiler.cfg
+compiler.cfg.alias-analysis compiler.cfg.block-joining
+compiler.cfg.branch-splitting compiler.cfg.copy-prop
+compiler.cfg.dce compiler.cfg.debugger
+compiler.cfg.instructions compiler.cfg.loop-detection
+compiler.cfg.registers compiler.cfg.ssa.construction
+compiler.cfg.tco compiler.cfg.useless-conditionals
+compiler.cfg.utilities compiler.cfg.value-numbering
+compiler.cfg.write-barrier cpu.architecture kernel
+kernel.private math namespaces sequences sequences.private
+tools.test vectors ;
 IN: compiler.cfg.write-barrier.tests
 
 : test-write-barrier ( insns -- insns )
@@ -70,3 +79,112 @@ IN: compiler.cfg.write-barrier.tests
         T{ ##write-barrier f 19 30 3 }
     } test-write-barrier
 ] unit-test
+
+V{
+    T{ ##set-slot-imm f 2 1 3 4 }
+    T{ ##write-barrier f 1 2 3 }
+} 1 test-bb
+V{
+    T{ ##set-slot-imm f 2 1 3 4 }
+    T{ ##write-barrier f 1 2 3 }
+} 2 test-bb
+1 get 2 get 1vector >>successors drop
+cfg new 1 get >>entry 0 set
+
+[ ] [ 0 [ eliminate-write-barriers ] change ] unit-test
+[ V{
+    T{ ##set-slot-imm f 2 1 3 4 }
+    T{ ##write-barrier f 1 2 3 }
+} ] [ 1 get instructions>> ] unit-test
+[ V{
+    T{ ##set-slot-imm f 2 1 3 4 }
+} ] [ 2 get instructions>> ] unit-test
+
+V{
+    T{ ##allot f 1 }
+} 1 test-bb
+V{
+    T{ ##set-slot-imm f 2 1 3 4 }
+    T{ ##write-barrier f 1 2 3 }
+} 2 test-bb
+1 get 2 get 1vector >>successors drop
+cfg new 1 get >>entry 0 set
+
+[ ] [ 0 [ eliminate-write-barriers ] change ] unit-test
+[ V{
+    T{ ##allot f 1 }
+} ] [ 1 get instructions>> ] unit-test
+[ V{
+    T{ ##set-slot-imm f 2 1 3 4 }
+} ] [ 2 get instructions>> ] unit-test
+
+V{
+    T{ ##set-slot-imm f 2 1 3 4 }
+    T{ ##write-barrier f 1 2 3 }
+} 1 test-bb
+V{
+    T{ ##allot }
+    T{ ##set-slot-imm f 2 1 3 4 }
+    T{ ##write-barrier f 1 2 3 }
+} 2 test-bb
+1 get 2 get 1vector >>successors drop
+cfg new 1 get >>entry 0 set
+
+[ ] [ 0 [ eliminate-write-barriers ] change ] unit-test
+[ V{
+    T{ ##set-slot-imm f 2 1 3 4 }
+    T{ ##write-barrier f 1 2 3 }
+} ] [ 1 get instructions>> ] unit-test
+[ V{
+    T{ ##allot }
+    T{ ##set-slot-imm f 2 1 3 4 }
+    T{ ##write-barrier f 1 2 3 }
+} ] [ 2 get instructions>> ] unit-test
+
+V{
+    T{ ##set-slot-imm f 2 1 3 4 }
+    T{ ##write-barrier f 1 2 3 }
+} 1 test-bb
+V{
+    T{ ##allot }
+} 2 test-bb
+1 get 2 get 1vector >>successors drop
+V{
+    T{ ##set-slot-imm f 2 1 3 4 }
+    T{ ##write-barrier f 1 2 3 }
+} 3 test-bb
+2 get 3 get 1vector >>successors drop
+cfg new 1 get >>entry 0 set
+[ ] [ 0 [ eliminate-write-barriers ] change ] unit-test
+[ V{
+    T{ ##set-slot-imm f 2 1 3 4 }
+    T{ ##write-barrier f 1 2 3 }
+} ] [ 1 get instructions>> ] unit-test
+[ V{ T{ ##allot } } ] [ 2 get instructions>> ] unit-test
+[ V{
+    T{ ##set-slot-imm f 2 1 3 4 }
+    T{ ##write-barrier f 1 2 3 }
+} ] [ 3 get instructions>> ] unit-test
+
+: reverse-here' ( seq -- )
+    { array } declare
+    [ length 2/ iota ] [ length ] [ ] tri
+    [ [ over - 1 - ] dip exchange-unsafe ] 2curry each ;
+
+: write-barrier-stats ( word -- cfg )
+    test-cfg first [
+        optimize-tail-calls
+        delete-useless-conditionals
+        split-branches
+        join-blocks
+        construct-ssa
+        alias-analysis
+        value-numbering
+        copy-propagation
+        eliminate-dead-code
+        eliminate-write-barriers
+    ] with-cfg
+    post-order>> write-barriers
+    [ [ loop-nesting-at ] [ length ] bi* ] assoc-map ;
+
+[ { { 0 1 } } ] [ \ reverse-here' write-barrier-stats ] unit-test
index 2f32a4ca81a0931906656e2c2203f0ce73103263..97b0c27af118615abab6b705655a1599ae7d4637 100644 (file)
@@ -1,7 +1,16 @@
-! Copyright (C) 2008, 2009 Slava Pestov.
+! Copyright (C) 2008, 2009 Slava Pestov, Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel accessors namespaces assocs sets sequences
-compiler.cfg compiler.cfg.instructions compiler.cfg.rpo ;
+fry combinators.short-circuit locals make arrays
+compiler.cfg
+compiler.cfg.dominance
+compiler.cfg.predecessors
+compiler.cfg.loop-detection
+compiler.cfg.rpo
+compiler.cfg.instructions 
+compiler.cfg.registers
+compiler.cfg.dataflow-analysis 
+compiler.cfg.utilities ;
 IN: compiler.cfg.write-barrier
 
 ! Eliminate redundant write barrier hits.
@@ -19,21 +28,112 @@ M: ##allot eliminate-write-barrier
     dst>> safe get conjoin t ;
 
 M: ##write-barrier eliminate-write-barrier
-    src>> dup [ safe get key? not ] [ mutated get key? ] bi and
+    src>> dup safe get key? not
     [ safe get conjoin t ] [ drop f ] if ;
 
-M: ##set-slot eliminate-write-barrier
+M: insn eliminate-write-barrier drop t ;
+
+! This doesn't actually benefit from being a dataflow analysis
+! might as well be dominator-based
+! Dealing with phi functions would help, though
+FORWARD-ANALYSIS: safe
+
+: has-allocation? ( bb -- ? )
+    instructions>> [ { [ ##allocation? ] [ ##call? ] } 1|| ] any? ;
+
+M: safe-analysis transfer-set
+    drop [ H{ } assoc-clone-like safe set ] dip
+    instructions>> [
+        eliminate-write-barrier drop
+    ] each safe get ;
+
+M: safe-analysis join-sets
+    drop has-allocation? [ drop H{ } clone ] [ assoc-refine ] if ;
+
+: write-barriers-step ( bb -- )
+    dup safe-in H{ } assoc-clone-like safe set
+    instructions>> [ eliminate-write-barrier ] filter-here ;
+
+GENERIC: remove-dead-barrier ( insn -- ? )
+
+M: ##write-barrier remove-dead-barrier
+    src>> mutated get key? ;
+
+M: ##set-slot remove-dead-barrier
     obj>> mutated get conjoin t ;
 
-M: ##set-slot-imm eliminate-write-barrier
+M: ##set-slot-imm remove-dead-barrier
     obj>> mutated get conjoin t ;
 
-M: insn eliminate-write-barrier drop t ;
+M: insn remove-dead-barrier drop t ;
 
-: write-barriers-step ( bb -- )
-    H{ } clone safe set
+: remove-dead-barriers ( bb -- )
     H{ } clone mutated set
-    instructions>> [ eliminate-write-barrier ] filter-here ;
+    instructions>> [ remove-dead-barrier ] filter-here ;
+
+! Availability of slot
+! Anticipation of this and set-slot would help too, maybe later
+FORWARD-ANALYSIS: slot
+
+UNION: access ##read ##write ;
+
+M: slot-analysis transfer-set
+    drop [ H{ } assoc-clone-like ] dip
+    instructions>> over '[
+        dup access? [
+            obj>> _ conjoin
+        ] [ drop ] if
+    ] each ;
+
+: slot-available? ( vreg bb -- ? )
+    slot-in key? ;
+
+: make-barriers ( vregs -- bb )
+    [ [ next-vreg next-vreg ##write-barrier ] each ] V{ } make <simple-block> ;
+
+: emit-barriers ( vregs loop -- )
+    swap [
+        [ [ header>> predecessors>> ] [ ends>> keys ] bi diff ]
+        [ header>> ] bi
+    ] [ make-barriers ] bi*
+    insert-basic-block ;
+
+: write-barriers ( bbs -- bb=>barriers )
+    [
+        dup instructions>>
+        [ ##write-barrier? ] filter
+        [ src>> ] map
+    ] { } map>assoc
+    [ nip empty? not ] assoc-filter ;
+
+: filter-dominant ( bb=>barriers bbs -- barriers )
+    '[ drop _ [ dominates? ] with all? ] assoc-filter
+    values concat prune ;
+
+: dominant-write-barriers ( loop -- vregs )
+    [ blocks>> values write-barriers ] [ ends>> keys ] bi filter-dominant ;
+
+: safe-loops ( -- loops )
+    loops get values
+    [ blocks>> keys [ has-allocation? not ] all? ] filter ;
+
+:: insert-extra-barriers ( cfg -- )
+    safe-loops [| loop |
+        cfg needs-dominance needs-predecessors drop
+        loop dominant-write-barriers
+        loop header>> '[ _ slot-available? ] filter
+        [ loop emit-barriers cfg cfg-changed drop ] unless-empty
+    ] each ;
+
+: contains-write-barrier? ( cfg -- ? )
+    post-order [ instructions>> [ ##write-barrier? ] any? ] any? ;
 
 : eliminate-write-barriers ( cfg -- cfg' )
-    dup [ write-barriers-step ] each-basic-block ;
+    dup contains-write-barrier? [
+        needs-loops
+        dup [ remove-dead-barriers ] each-basic-block
+        dup compute-slot-sets
+        dup insert-extra-barriers
+        dup compute-safe-sets
+        dup [ write-barriers-step ] each-basic-block
+    ] when ;
index 9c3817bad626457085bd64a8656a02cddb28e4b2..225577d0b949b9feb8db8a7d9ef9fe4d5973ffd2 100644 (file)
@@ -1,6 +1,6 @@
-IN: compiler.codegen.tests
 USING: compiler.codegen.fixup tools.test cpu.architecture math kernel make
 compiler.constants ;
+IN: compiler.codegen.tests
 
 [ ] [ [ ] with-fixup drop ] unit-test
 [ ] [ [ \ + %call ] with-fixup drop ] unit-test
old mode 100644 (file)
new mode 100755 (executable)
index 3b8d996..504acc7
@@ -120,7 +120,7 @@ M: predicate-engine-word no-compile? "owner-generic" word-prop no-compile? ;
     } cond ;
 
 : optimize? ( word -- ? )
-    { [ predicate-engine-word? ] [ single-generic? ] } 1|| not ;
+    single-generic? not ;
 
 : contains-breakpoints? ( -- ? )
     dependencies get keys [ "break?" word-prop ] any? ;
index 91215baf19dc401c35328ee9da5a1c0d7e9c110a..e3c5dee91746a6d2e3802d68f93d52a556173a25 100755 (executable)
@@ -395,7 +395,7 @@ FUNCTION: ulonglong ffi_test_38 ( ulonglong x, ulonglong y ) ;
 
 : callback-9 ( -- callback )
     "int" { "int" "int" "int" } "cdecl" [
-        + + 1+
+        + + 1 +
     ] alien-callback ;
 
 FUNCTION: void ffi_test_36_point_5 ( ) ;
@@ -599,4 +599,4 @@ FUNCTION: short ffi_test_48 ( bool-field-test x ) ;
 [ 123 ] [
     "bool-field-test" <c-object> 123 over set-bool-field-test-parents
     ffi_test_48
-] unit-test
\ No newline at end of file
+] unit-test
index a9fd313d646eddffcc0e87c04417a76c136432f4..f90897bc9bd34c4e1b5e682972f0cdc702838c43 100644 (file)
@@ -1,5 +1,5 @@
-IN: compiler.tests.call-effect
 USING: tools.test combinators generic.single sequences kernel ;
+IN: compiler.tests.call-effect
 
 : execute-ic-test ( a b -- c ) execute( a -- c ) ;
 
@@ -11,4 +11,4 @@ USING: tools.test combinators generic.single sequences kernel ;
 [ ] [ [ ] call-test ] unit-test
 [ ] [ f [ drop ] curry call-test ] unit-test
 [ ] [ [ ] [ ] compose call-test ] unit-test
-[ [ 1 2 3 ] call-test ] [ wrong-values? ] must-fail-with
\ No newline at end of file
+[ [ 1 2 3 ] call-test ] [ wrong-values? ] must-fail-with
index 7074b73845e46aacafbf77d71d5844840d33cd6f..138437543e8b15f782933e066114d9e253af67e5 100644 (file)
@@ -1,6 +1,6 @@
-IN: compiler.tests.float
 USING: compiler.units compiler kernel kernel.private memory math
 math.private tools.test math.floats.private ;
+IN: compiler.tests.float
 
 [ 5.0 ] [ [ 5.0 ] compile-call gc gc gc ] unit-test
 [ 2.0 3.0 ] [ 3.0 [ 2.0 swap ] compile-call ] unit-test
index 6b0ef2d4393d859b8107c1747071c3ab831cb947..30392f159844204da9c0c565c8fc12c4b215b13d 100644 (file)
@@ -1,5 +1,5 @@
-IN: compiler.tests.generic
 USING: tools.test math kernel compiler.units definitions ;
+IN: compiler.tests.generic
 
 GENERIC: bad ( -- )
 M: integer bad ;
@@ -8,4 +8,4 @@ M: object bad ;
 [ 0 bad ] must-fail
 [ "" bad ] must-fail
 
-[ ] [ [ \ bad forget ] with-compilation-unit ] unit-test
\ No newline at end of file
+[ ] [ [ \ bad forget ] with-compilation-unit ] unit-test
index 20fcff84409f6261e724ab91ceede9e04e9275b9..45ea841a739d47621fd2adf0c01cfca79fbb1b8f 100644 (file)
@@ -4,7 +4,7 @@ sbufs strings tools.test vectors words sequences.private
 quotations classes classes.algebra classes.tuple.private
 continuations growable namespaces hints alien.accessors
 compiler.tree.builder compiler.tree.optimizer sequences.deep
-compiler definitions ;
+compiler definitions generic.single ;
 IN: compiler.tests.optimizer
 
 GENERIC: xyz ( obj -- obj )
@@ -67,7 +67,7 @@ TUPLE: pred-test ;
 [ 3 ] [ t bad-kill-2 ] unit-test
 
 ! regression
-: (the-test) ( x -- y ) dup 0 > [ 1- (the-test) ] when ; inline recursive
+: (the-test) ( x -- y ) dup 0 > [ 1 - (the-test) ] when ; inline recursive
 : the-test ( -- x y ) 2 dup (the-test) ;
 
 [ 2 0 ] [ the-test ] unit-test
@@ -100,7 +100,7 @@ GENERIC: void-generic ( obj -- * )
 
 ! regression
 : branch-fold-regression-0 ( m -- n )
-    t [ ] [ 1+ branch-fold-regression-0 ] if ; inline recursive
+    t [ ] [ 1 + branch-fold-regression-0 ] if ; inline recursive
 
 : branch-fold-regression-1 ( -- m )
     10 branch-fold-regression-0 ;
@@ -348,12 +348,12 @@ TUPLE: some-tuple x ;
 
 [ T{ some-tuple f [ 3 ] } ] [ 3 allot-regression ] unit-test
 
-[ 1 ] [ B{ 0 0 0 0 } [ 0 alien-signed-4 1+ ] compile-call ] unit-test
-[ 1 ] [ B{ 0 0 0 0 } [ 0 alien-unsigned-4 1+ ] compile-call ] unit-test
-[ 1 ] [ B{ 0 0 0 0 0 0 0 0 } [ 0 alien-signed-8 1+ ] compile-call ] unit-test
-[ 1 ] [ B{ 0 0 0 0 0 0 0 0 } [ 0 alien-unsigned-8 1+ ] compile-call ] unit-test
-[ 1 ] [ B{ 0 0 0 0 0 0 0 0 } [ 0 alien-signed-cell 1+ ] compile-call ] unit-test
-[ 1 ] [ B{ 0 0 0 0 0 0 0 0 } [ 0 alien-unsigned-cell 1+ ] compile-call ] unit-test
+[ 1 ] [ B{ 0 0 0 0 } [ 0 alien-signed-4 1 + ] compile-call ] unit-test
+[ 1 ] [ B{ 0 0 0 0 } [ 0 alien-unsigned-4 1 + ] compile-call ] unit-test
+[ 1 ] [ B{ 0 0 0 0 0 0 0 0 } [ 0 alien-signed-8 1 + ] compile-call ] unit-test
+[ 1 ] [ B{ 0 0 0 0 0 0 0 0 } [ 0 alien-unsigned-8 1 + ] compile-call ] unit-test
+[ 1 ] [ B{ 0 0 0 0 0 0 0 0 } [ 0 alien-signed-cell 1 + ] compile-call ] unit-test
+[ 1 ] [ B{ 0 0 0 0 0 0 0 0 } [ 0 alien-unsigned-cell 1 + ] compile-call ] unit-test
 
 : deep-find-test ( seq -- ? ) [ 5 = ] deep-find ;
 
@@ -382,7 +382,7 @@ DEFER: loop-bbb
 ! Type inference issue
 [ 4 3 ] [
     1 >bignum 2 >bignum
-    [ { bignum integer } declare [ shift ] keep 1+ ] compile-call
+    [ { bignum integer } declare [ shift ] keep 1 + ] compile-call
 ] unit-test
 
 : broken-declaration ( -- ) \ + declare ;
@@ -422,4 +422,7 @@ M: object bad-dispatch-position-test* ;
         \ bad-dispatch-position-test forget
         \ bad-dispatch-position-test* forget
     ] with-compilation-unit
-] unit-test
\ No newline at end of file
+] unit-test
+
+! Not sure if I want to fix this...
+! [ t [ [ f ] [ 3 ] if >fixnum ] compile-call ] [ no-method? ] must-fail-with
\ No newline at end of file
index 7929d9e6f6c13b6f211fad969f604d419d725e34..cae57e5bd9a3914b6745ba6c8f114a6a6cbc25bc 100644 (file)
@@ -1,5 +1,5 @@
-IN: compiler.tests.peg-regression-2
 USING: peg.ebnf strings tools.test ;
+IN: compiler.tests.peg-regression-2
 
 GENERIC: <times> ( times -- term' )
 M: string <times> ;
index 4adf0b36b93dd04dff53d3f62a662844df2b9be5..4da83f53e4a0b9d50d167fd30b8ccb4a6f2b6565 100644 (file)
@@ -1,5 +1,5 @@
-IN: compiler.tests.pic-problem-1
 USING: kernel sequences prettyprint memory tools.test ;
+IN: compiler.tests.pic-problem-1
 
 TUPLE: x ;
 
@@ -11,4 +11,4 @@ INSTANCE: x sequence
 
 CONSTANT: blah T{ x }
 
-[ T{ x } ] [ blah ] unit-test
\ No newline at end of file
+[ T{ x } ] [ blah ] unit-test
index 3d7a05a74b8ae274403f5bd29ced99fd9ea5b4c9..4de6d952c8fce6156067fc8e2c929aff49314614 100644 (file)
@@ -1,6 +1,6 @@
-IN: compiler.tests.redefine0
 USING: tools.test eval compiler compiler.errors compiler.units definitions kernel math
 namespaces macros assocs ;
+IN: compiler.tests.redefine0
 
 ! Test ripple-up behavior
 : test-1 ( -- a ) 3 ;
index 33aa080bacb4955fa4762323b865f6cb8a6fde8f..54066c690d41f4c8244ef4df35ad0e4a39565e48 100644 (file)
@@ -11,7 +11,7 @@ DEFER: word-1
 
 : word-3 ( a -- b ) 1 + ;
 
-: word-4 ( a -- b c ) 0 swap word-3 swap 1+ ;
+: word-4 ( a -- b c ) 0 swap word-3 swap 1 + ;
 
 [ 1 1 ] [ 0 word-4 ] unit-test
 
index 3bef30f9f1bc15b6d06e5684ee9154f05e8f5b90..ac879a7c75799b23477dfa9f4acb0c3ed0a3c7ba 100644 (file)
@@ -1,6 +1,6 @@
-IN: compiler.tests.redefine16
 USING: eval tools.test definitions words compiler.units
 quotations stack-checker ;
+IN: compiler.tests.redefine16
 
 [ ] [ [ "blah" "compiler.tests.redefine16" lookup forget ] with-compilation-unit ] unit-test
 
index 4ed3e36f4dff23466dd753671e35239451e8d627..5a1c33ad27849ddfdb0a3677b2001665672c8a99 100644 (file)
@@ -1,6 +1,6 @@
-IN: compiler.tests.redefine17
 USING: tools.test classes.mixin compiler.units arrays kernel.private
 strings sequences vocabs definitions kernel ;
+IN: compiler.tests.redefine17
 
 << "compiler.tests.redefine17" words forget-all >>
 
index 9112a1e1afb439bf6b173e236785a9a19555ae4d..b6a46fc0df520487bc11dc67848303eb95e1a5f5 100644 (file)
@@ -1,7 +1,7 @@
-IN: compiler.tests.redefine2
 USING: compiler compiler.units tools.test math parser kernel
 sequences sequences.private classes.mixin generic definitions
 arrays words assocs eval words.symbol ;
+IN: compiler.tests.redefine2
 
 DEFER: redefine2-test
 
index 0a5eb8457918921af36e133abc398780af86ddca..67added49d9b53647545b01332539ebf65a8bf3f 100644 (file)
@@ -1,15 +1,15 @@
-IN: compiler.tests.redefine3
 USING: accessors compiler compiler.units tools.test math parser
 kernel sequences sequences.private classes.mixin generic
 definitions arrays words assocs eval ;
+IN: compiler.tests.redefine3
 
 GENERIC: sheeple ( obj -- x )
 
-M: object sheeple drop "sheeple" ;
+M: object sheeple drop "sheeple" ; inline
 
 MIXIN: empty-mixin
 
-M: empty-mixin sheeple drop "wake up" ;
+M: empty-mixin sheeple drop "wake up" ; inline
 
 : sheeple-test ( -- string ) { } sheeple ;
 
index 2320f64af60a6da4ddbad5d66cd2795bd803a198..cc74e5a783c03ffeaa7470f9f8373b33b0c9fe46 100644 (file)
@@ -1,5 +1,5 @@
-IN: compiler.tests.redefine4
 USING: io.streams.string kernel tools.test eval ;
+IN: compiler.tests.redefine4
 
 : declaration-test-1 ( -- a ) 3 ; flushable
 
index 62c7c31bc2bd3975a6750ec2f4209d0659aedcaf..3bbfca876b175a1750a9df61b3dea1fe2467d78b 100644 (file)
@@ -1,5 +1,5 @@
-IN: compiler.tests.reload
 USE: vocabs.loader
+IN: compiler.tests.reload
 
 ! "parser" reload
 ! "sequences" reload
index 1cb11571ef7fa833712c08c55f4cc96d646b6f52..20a5cc867c8bbde4f77a13d6ad28c3b05e6ef73b 100755 (executable)
@@ -1,7 +1,7 @@
-IN: compiler.tests.stack-trace
 USING: compiler tools.test namespaces sequences
 kernel.private kernel math continuations continuations.private
 words splitting grouping sorting accessors ;
+IN: compiler.tests.stack-trace
 
 : symbolic-stack-trace ( -- newseq )
     error-continuation get call>> callstack>array
@@ -13,7 +13,7 @@ words splitting grouping sorting accessors ;
 [ baz ] [ 3 = ] must-fail-with
 [ t ] [
     symbolic-stack-trace
-    [ word? ] filter
+    2 head*
     { baz bar foo } tail?
 ] unit-test
 
@@ -24,7 +24,7 @@ words splitting grouping sorting accessors ;
 [ t ] [
     [ { 1 "hi" } bleh ] ignore-errors \ + stack-trace-any?
 ] unit-test
-    
+
 [ t f ] [
     [ { "hi" } bleh ] ignore-errors
     \ + stack-trace-any?
index fc249d99db30fa1b36b6fa33df68d1954a451928..3d6301249f41ee44be25b1eb97f9e08450b4f94d 100644 (file)
@@ -1,5 +1,5 @@
-IN: compiler.tests.tuples
 USING: kernel tools.test compiler.units compiler ;
+IN: compiler.tests.tuples
 
 TUPLE: color red green blue ;
 
index f3a2b99db623fe223c07f70277a92e4e5e421fe5..8359334550aa904d89ada27c877336ac15342ba9 100755 (executable)
@@ -1,6 +1,6 @@
-IN: compiler.tree.builder.tests
 USING: compiler.tree.builder tools.test sequences kernel
 compiler.tree stack-checker stack-checker.errors ;
+IN: compiler.tree.builder.tests
 
 : inline-recursive ( -- ) inline-recursive ; inline recursive
 
diff --git a/basis/compiler/tree/checker/checker-tests.factor b/basis/compiler/tree/checker/checker-tests.factor
deleted file mode 100644 (file)
index d9591e7..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-IN: compiler.tree.checker.tests
-USING: compiler.tree.checker tools.test ;
-
-
index 228a4e3efb003bc8a46008189364b03bfc80d85f..faf69686702c78adec3493422e10c30a42b252e4 100755 (executable)
@@ -1,4 +1,3 @@
-IN: compiler.tree.cleanup.tests
 USING: tools.test kernel.private kernel arrays sequences
 math.private math generic words quotations alien alien.c-types
 strings sbufs sequences.private slots.private combinators
@@ -17,6 +16,7 @@ compiler.tree.propagation
 compiler.tree.propagation.info
 compiler.tree.checker
 compiler.tree.debugger ;
+IN: compiler.tree.cleanup.tests
 
 [ t ] [ [ [ 1 ] [ 2 ] if ] cleaned-up-tree [ #if? ] contains-node? ] unit-test
 
@@ -41,13 +41,13 @@ compiler.tree.debugger ;
 
 GENERIC: mynot ( x -- y )
 
-M: f mynot drop t ;
+M: f mynot drop t ; inline
 
-M: object mynot drop f ;
+M: object mynot drop f ; inline
 
 GENERIC: detect-f ( x -- y )
 
-M: f detect-f ;
+M: f detect-f ; inline
 
 [ t ] [
     [ dup [ mynot ] [ ] if detect-f ] \ detect-f inlined?
@@ -55,9 +55,9 @@ M: f detect-f ;
 
 GENERIC: xyz ( n -- n )
 
-M: integer xyz ;
+M: integer xyz ; inline
 
-M: object xyz ;
+M: object xyz ; inline
 
 [ t ] [
     [ { integer } declare xyz ] \ xyz inlined?
@@ -88,7 +88,7 @@ M: object xyz ;
     2over dup xyz drop >= [
         3drop
     ] [
-        [ swap [ call 1+ ] dip ] keep (i-repeat)
+        [ swap [ call 1 + ] dip ] keep (i-repeat)
     ] if ; inline recursive
 
 : i-repeat ( n quot -- ) [ { integer } declare ] dip 0 -rot (i-repeat) ; inline
@@ -115,10 +115,6 @@ M: object xyz ;
     [ { fixnum } declare [ ] times ] \ >= inlined?
 ] unit-test
 
-[ t ] [
-    [ { fixnum } declare [ ] times ] \ 1+ inlined?
-] unit-test
-
 [ t ] [
     [ { fixnum } declare [ ] times ] \ + inlined?
 ] unit-test
@@ -172,19 +168,6 @@ M: object xyz ;
     [ { array-capacity } declare 1 fixnum- ] \ fixnum- inlined?
 ] unit-test
 
-[ t ] [
-    [ 5000 [ 5000 [ ] times ] times ] \ 1+ inlined?
-] unit-test
-
-[ t ] [
-    [ 5000 [ [ ] times ] each ] \ 1+ inlined?
-] unit-test
-
-[ t ] [
-    [ 5000 0 [ dup 2 - swap [ 2drop ] curry each ] reduce ]
-    \ 1+ inlined?
-] unit-test
-
 GENERIC: annotate-entry-test-1 ( x -- )
 
 M: fixnum annotate-entry-test-1 drop ;
@@ -193,7 +176,7 @@ M: fixnum annotate-entry-test-1 drop ;
     2dup >= [
         2drop
     ] [
-        [ dup annotate-entry-test-1 1+ ] dip (annotate-entry-test-2)
+        [ dup annotate-entry-test-1 1 + ] dip (annotate-entry-test-2)
     ] if ; inline recursive
 
 : annotate-entry-test-2 ( from to -- obj ) 0 -rot (annotate-entry-test-2) ; inline
@@ -305,10 +288,6 @@ cell-bits 32 = [
     ] \ + inlined?
 ] unit-test
 
-[ t ] [
-    [ 1000 iota [ 1+ ] map ] { 1+ fixnum+ } inlined?
-] unit-test
-
 : rec ( a -- b )
     dup 0 > [ 1 - rec ] when ; inline recursive
 
@@ -467,7 +446,7 @@ cell-bits 32 = [
 : buffalo-wings ( i seq -- )
     2dup < [
         2dup chicken-fingers
-        [ 1+ ] dip buffalo-wings
+        [ 1 + ] dip buffalo-wings
     ] [
         2drop
     ] if ; inline recursive
@@ -486,7 +465,7 @@ cell-bits 32 = [
 : ribs ( i seq -- )
     2dup < [
         steak
-        [ 1+ ] dip ribs
+        [ 1 + ] dip ribs
     ] [
         2drop
     ] if ; inline recursive
@@ -543,4 +522,4 @@ cell-bits 32 = [
         [ 12 swap nth ] keep
         14 ndrop
     ] cleaned-up-tree nodes>quot
-] unit-test
\ No newline at end of file
+] unit-test
index d012b5f6583f50dcc5fa519ef199cab1161d117b..305ba5b2b50687ef5724fe67cbf356bcfcb1d29f 100644 (file)
@@ -1,5 +1,5 @@
-IN: compiler.tree.combinators.tests
 USING: compiler.tree.combinators tools.test kernel ;
+IN: compiler.tree.combinators.tests
 
 { 1 0 } [ [ drop ] each-node ] must-infer-as
 { 1 1 } [ [ ] map-nodes ] must-infer-as
index fd1b2d5adb4cbfe7b1208ae410356a6a69932c1d..f09593824eb1babe838684bdaf56cd83e000d92a 100644 (file)
@@ -3,8 +3,7 @@
 USING: sequences namespaces kernel accessors assocs sets fry
 arrays combinators columns stack-checker.backend
 stack-checker.branches compiler.tree compiler.tree.combinators
-compiler.tree.dead-code.liveness compiler.tree.dead-code.simple
-;
+compiler.tree.dead-code.liveness compiler.tree.dead-code.simple ;
 IN: compiler.tree.dead-code.branches
 
 M: #if mark-live-values* look-at-inputs ;
index 9bacd51be14eb8c731d2b165118910447b002d62..3cdbbf594436217af2d7447fc348b856cd63f9ce 100644 (file)
@@ -1,5 +1,5 @@
-IN: compiler.tree.debugger.tests
 USING: compiler.tree.debugger tools.test sorting sequences io math.order ;
+IN: compiler.tree.debugger.tests
 
 [ [ <=> ] sort ] optimized.
-[ <reversed> [ print ] each ] optimizer-report.
\ No newline at end of file
+[ <reversed> [ print ] each ] optimizer-report.
index 6f313320d036fe7e97b440a9e198d17c57cd9985..4bf4cf88f02bb4efb92c0cd341d9977c12dff984 100644 (file)
@@ -11,6 +11,8 @@ compiler.tree.normalization
 compiler.tree.cleanup
 compiler.tree.propagation
 compiler.tree.propagation.info
+compiler.tree.escape-analysis
+compiler.tree.tuple-unboxing
 compiler.tree.def-use
 compiler.tree.builder
 compiler.tree.optimizer
@@ -154,7 +156,7 @@ SYMBOL: node-count
         H{ } clone intrinsics-called set
 
         0 swap [
-            [ 1+ ] dip
+            [ 1 + ] dip
             dup #call? [
                 word>> {
                     { [ dup "intrinsic" word-prop ] [ intrinsics-called ] }
@@ -209,6 +211,8 @@ SYMBOL: node-count
         normalize
         propagate
         cleanup
+        escape-analysis
+        unbox-tuples
         apply-identities
         compute-def-use
         remove-dead-code
index 21e79eb6c4cda2e9adf84bc717c83f38291123a4..872b6131c9bd453a9efa315aef58726f288adb7b 100644 (file)
@@ -21,7 +21,7 @@ TUPLE: definition value node uses ;
 ERROR: no-def-error value ;
 
 : def-of ( value -- definition )
-    dup def-use get at* [ nip ] [ no-def-error ] if ;
+    def-use get ?at [ no-def-error ] unless ;
 
 ERROR: multiple-defs-error ;
 
index a1a768d42956870e6d3eb29aa4f62876d7d78e5f..72c7e4c60c61f240ff3276c725aac7e6c0d05689 100644 (file)
@@ -1,6 +1,6 @@
 USING: kernel tools.test compiler.tree compiler.tree.builder
-compiler.tree.def-use compiler.tree.def-use.simplified accessors
-sequences sorting classes ;
+compiler.tree.recursive compiler.tree.def-use
+compiler.tree.def-use.simplified accessors sequences sorting classes ;
 IN: compiler.tree.def-use.simplified
 
 [ { #call #return } ] [
@@ -8,3 +8,17 @@ IN: compiler.tree.def-use.simplified
     first out-d>> first actually-used-by
     [ node>> class ] map natural-sort
 ] unit-test
+
+: word-1 ( a -- b ) dup [ word-1 ] when ; inline recursive
+
+[ { #introduce } ] [
+    [ word-1 ] build-tree analyze-recursive compute-def-use
+    last in-d>> first actually-defined-by
+    [ node>> class ] map natural-sort
+] unit-test
+
+[ { #if #return } ] [
+    [ word-1 ] build-tree analyze-recursive compute-def-use
+    first out-d>> first actually-used-by
+    [ node>> class ] map natural-sort
+] unit-test
\ No newline at end of file
index 9b2a2038da5a26512cce9a56aa09183fb7aaffba..c2fb74c97e285d2616414e67740fb082c23a85ee 100644 (file)
@@ -1,7 +1,7 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: sequences kernel fry vectors
-compiler.tree compiler.tree.def-use ;
+USING: sequences kernel fry vectors accessors namespaces assocs sets
+stack-checker.branches compiler.tree compiler.tree.def-use ;
 IN: compiler.tree.def-use.simplified
 
 ! Simplified def-use follows chains of copies.
@@ -9,32 +9,85 @@ IN: compiler.tree.def-use.simplified
 ! A 'real' usage is a usage of a value that is not a #renaming.
 TUPLE: real-usage value node ;
 
+<PRIVATE
+
+SYMBOLS: visited accum ;
+
+: if-not-visited ( value quot -- )
+    over visited get key?
+    [ 2drop ] [ over visited get conjoin call ] if ; inline
+
+: with-simplified-def-use ( quot -- real-usages )
+    [
+        H{ } clone visited set
+        H{ } clone accum set
+        call
+        accum get keys
+    ] with-scope ; inline
+
+PRIVATE>
+
 ! Def
-GENERIC: actually-defined-by* ( value node -- real-usage )
+GENERIC: actually-defined-by* ( value node -- )
 
-: actually-defined-by ( value -- real-usage )
-    dup defined-by actually-defined-by* ;
+: (actually-defined-by) ( value -- )
+    [ dup defined-by actually-defined-by* ] if-not-visited ;
 
 M: #renaming actually-defined-by*
-    inputs/outputs swap [ index ] dip nth actually-defined-by ;
+    inputs/outputs swap [ index ] dip nth (actually-defined-by) ;
+
+M: #call-recursive actually-defined-by*
+    [ out-d>> index ] [ label>> return>> in-d>> nth ] bi
+    (actually-defined-by) ;
 
-M: #return-recursive actually-defined-by* real-usage boa ;
+M: #enter-recursive actually-defined-by*
+    [ out-d>> index ] keep
+    [ in-d>> nth (actually-defined-by) ]
+    [ label>> calls>> [ node>> in-d>> nth (actually-defined-by) ] with each ] 2bi ;
 
-M: node actually-defined-by* real-usage boa ;
+M: #phi actually-defined-by*
+    [ out-d>> index ] [ phi-in-d>> ] bi
+    [
+        nth dup +bottom+ eq?
+        [ drop ] [ (actually-defined-by) ] if
+    ] with each ;
+
+M: node actually-defined-by*
+    real-usage boa accum get conjoin ;
+
+: actually-defined-by ( value -- real-usages )
+    [ (actually-defined-by) ] with-simplified-def-use ;
 
 ! Use
-GENERIC# actually-used-by* 1 ( value node accum -- )
+GENERIC: actually-used-by* ( value node -- )
 
-: (actually-used-by) ( value accum -- )
-    [ [ used-by ] keep ] dip '[ _ swap _ actually-used-by* ] each ;
+: (actually-used-by) ( value -- )
+    [ dup used-by [ actually-used-by* ] with each ] if-not-visited ;
 
 M: #renaming actually-used-by*
-    [ inputs/outputs [ indices ] dip nths ] dip
-    '[ _ (actually-used-by) ] each ;
+    inputs/outputs [ indices ] dip nths
+    [ (actually-used-by) ] each ;
+
+M: #return-recursive actually-used-by*
+    [ in-d>> index ] keep
+    [ out-d>> nth (actually-used-by) ]
+    [ label>> calls>> [ node>> out-d>> nth (actually-used-by) ] with each ] 2bi ;
+
+M: #call-recursive actually-used-by*
+    [ in-d>> index ] [ label>> enter-out>> nth ] bi
+    (actually-used-by) ;
+
+M: #enter-recursive actually-used-by*
+    [ in-d>> index ] [ out-d>> nth ] bi (actually-used-by) ;
+
+M: #phi actually-used-by*
+    [ phi-in-d>> [ index ] with map-find drop ] [ out-d>> nth ] bi
+    (actually-used-by) ;
 
-M: #return-recursive actually-used-by* [ real-usage boa ] dip push ;
+M: #recursive actually-used-by* 2drop ;
 
-M: node actually-used-by* [ real-usage boa ] dip push ;
+M: node actually-used-by*
+    real-usage boa accum get conjoin ;
 
 : actually-used-by ( value -- real-usages )
-    10 <vector> [ (actually-used-by) ] keep ;
+    [ (actually-used-by) ] with-simplified-def-use ;
index 075e20eb23c987157f79ecd4c801ebeb6dea9e4e..bd91dd53e889bd9c74e7dfdc865b473becdaad3f 100644 (file)
@@ -1,7 +1,7 @@
-IN: compiler.tree.escape-analysis.check.tests
 USING: compiler.tree.escape-analysis.check tools.test accessors kernel
 kernel.private math compiler.tree.builder compiler.tree.normalization
 compiler.tree.propagation compiler.tree.cleanup ;
+IN: compiler.tree.escape-analysis.check.tests
 
 : test-checker ( quot -- ? )
     build-tree normalize propagate cleanup run-escape-analysis? ;
@@ -24,4 +24,4 @@ compiler.tree.propagation compiler.tree.cleanup ;
 [ f ] [
     [ swap 1 2 ? ]
     test-checker
-] unit-test
\ No newline at end of file
+] unit-test
index be6b2863f0991b0384e11b69a0d1675fe37b9a9c..debb66b8d42044589aee98489e6d00b849b95a39 100644 (file)
@@ -1,4 +1,3 @@
-IN: compiler.tree.escape-analysis.tests
 USING: compiler.tree.escape-analysis
 compiler.tree.escape-analysis.allocations compiler.tree.builder
 compiler.tree.recursive compiler.tree.normalization
@@ -10,11 +9,12 @@ classes.tuple namespaces
 compiler.tree.propagation.info stack-checker.errors
 compiler.tree.checker
 kernel.private vectors ;
+IN: compiler.tree.escape-analysis.tests
 
 GENERIC: count-unboxed-allocations* ( m node -- n )
 
 : (count-unboxed-allocations) ( m node -- n )
-    out-d>> first escaping-allocation? [ 1+ ] unless ;
+    out-d>> first escaping-allocation? [ 1 + ] unless ;
 
 M: #call count-unboxed-allocations*
     dup immutable-tuple-boa?
@@ -25,7 +25,7 @@ M: #push count-unboxed-allocations*
     [ (count-unboxed-allocations) ] [ drop ] if ;
 
 M: #introduce count-unboxed-allocations*
-    out-d>> [ escaping-allocation? [ 1+ ] unless ] each ;
+    out-d>> [ escaping-allocation? [ 1 + ] unless ] each ;
 
 M: node count-unboxed-allocations* drop ;
 
@@ -212,10 +212,10 @@ C: <ro-box> ro-box
     dup i>> 1 <= [
         drop 1 <ro-box>
     ] [
-        i>> 1- <ro-box>
+        i>> 1 - <ro-box>
         dup tuple-fib
         swap
-        i>> 1- <ro-box>
+        i>> 1 - <ro-box>
         tuple-fib
         swap i>> swap i>> + <ro-box>
     ] if ; inline recursive
@@ -225,7 +225,7 @@ C: <ro-box> ro-box
 [ 3 ] [ [ <ro-box> tuple-fib ] count-unboxed-allocations ] unit-test
 
 : tuple-fib' ( m -- n )
-    dup 1 <= [ 1- tuple-fib' i>> ] when <ro-box> ; inline recursive
+    dup 1 <= [ 1 - tuple-fib' i>> ] when <ro-box> ; inline recursive
 
 [ 0 ] [ [ tuple-fib' ] count-unboxed-allocations ] unit-test
 
@@ -233,10 +233,10 @@ C: <ro-box> ro-box
     dup i>> 1 <= [
         drop 1 <ro-box>
     ] [
-        i>> 1- <ro-box>
+        i>> 1 - <ro-box>
         dup bad-tuple-fib-1
         swap
-        i>> 1- <ro-box>
+        i>> 1 - <ro-box>
         bad-tuple-fib-1 dup .
         swap i>> swap i>> + <ro-box>
     ] if ; inline recursive
@@ -248,10 +248,10 @@ C: <ro-box> ro-box
     dup i>> 1 <= [
         drop 1 <ro-box>
     ] [
-        i>> 1- <ro-box>
+        i>> 1 - <ro-box>
         dup bad-tuple-fib-2
         swap
-        i>> 1- <ro-box>
+        i>> 1 - <ro-box>
         bad-tuple-fib-2
         swap i>> swap i>> + <ro-box>
     ] if ; inline recursive
@@ -262,9 +262,9 @@ C: <ro-box> ro-box
     dup 1 <= [
         drop 1 <ro-box>
     ] [
-        1- dup tuple-fib-2
+        1 - dup tuple-fib-2
         swap
-        1- tuple-fib-2
+        1 - tuple-fib-2
         swap i>> swap i>> + <ro-box>
     ] if ; inline recursive
 
@@ -274,9 +274,9 @@ C: <ro-box> ro-box
     dup 1 <= [
         drop 1 <ro-box>
     ] [
-        1- dup tuple-fib-3
+        1 - dup tuple-fib-3
         swap
-        1- tuple-fib-3 dup .
+        1 - tuple-fib-3 dup .
         swap i>> swap i>> + <ro-box>
     ] if ; inline recursive
 
@@ -286,9 +286,9 @@ C: <ro-box> ro-box
     dup 1 <= [
         drop 1 <ro-box>
     ] [
-        1- dup bad-tuple-fib-3
+        1 - dup bad-tuple-fib-3
         swap
-        1- bad-tuple-fib-3
+        1 - bad-tuple-fib-3
         2drop f
     ] if ; inline recursive
 
@@ -344,4 +344,4 @@ TUPLE: empty-tuple ;
 [ 0 ] [
     [ { vector } declare length>> ]
     count-unboxed-allocations
-] unit-test
\ No newline at end of file
+] unit-test
index 033d5b01ccaddf0aa9e295362b6d8fe69a2dfd0a..c26f3ddefc02a26a7f779ed1c69aea5829d04649 100644 (file)
@@ -1,7 +1,7 @@
-IN: compiler.tree.escape-analysis.recursive.tests
 USING: kernel tools.test namespaces sequences
 compiler.tree.escape-analysis.recursive
 compiler.tree.escape-analysis.allocations ;
+IN: compiler.tree.escape-analysis.recursive.tests
 
 H{ } clone allocations set
 <escaping-values> escaping-values set
old mode 100644 (file)
new mode 100755 (executable)
index 9b278dd..fca35a5
@@ -1,8 +1,8 @@
 ! Copyright (C) 2008, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel accessors sequences words memoize combinators
-classes classes.builtin classes.tuple math.partial-dispatch
-fry assocs combinators.short-circuit
+classes classes.builtin classes.tuple classes.singleton
+math.partial-dispatch fry assocs combinators.short-circuit
 compiler.tree
 compiler.tree.combinators
 compiler.tree.propagation.info
@@ -45,6 +45,7 @@ M: predicate finalize-word
     "predicating" word-prop {
         { [ dup builtin-class? ] [ drop word>> cached-expansion ] }
         { [ dup tuple-class? ] [ drop word>> def>> splice-final ] }
+        { [ dup singleton-class? ] [ drop word>> def>> splice-final ] }
         [ drop ]
     } cond ;
 
index a9415adbd706db161bbf87d092dcce989762a1d3..42e7f421bfc04073ae014c6abd8d45aa6e931840 100644 (file)
@@ -1,12 +1,11 @@
 ! Copyright (C) 2008, 2009 Slava Pestov, Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
-IN: compiler.tree.modular-arithmetic.tests
 USING: kernel kernel.private tools.test math math.partial-dispatch
-math.private accessors slots.private sequences sequences.private strings sbufs
-compiler.tree.builder
-compiler.tree.normalization
-compiler.tree.debugger
-alien.accessors layouts combinators byte-arrays ;
+prettyprint math.private accessors slots.private sequences
+sequences.private strings sbufs compiler.tree.builder
+compiler.tree.normalization compiler.tree.debugger alien.accessors
+layouts combinators byte-arrays arrays ;
+IN: compiler.tree.modular-arithmetic.tests
 
 : test-modular-arithmetic ( quot -- quot' )
     cleaned-up-tree nodes>quot ;
@@ -93,8 +92,6 @@ TUPLE: declared-fixnum { x fixnum } ;
     [ { string sbuf } declare ] \ push-all def>> append \ >fixnum inlined?
 ] unit-test
 
-
-
 [ t ] [
     [
         { integer } declare [ 256 mod ] map
@@ -137,9 +134,14 @@ TUPLE: declared-fixnum { x fixnum } ;
     ] { mod fixnum-mod rem } inlined?
 ] unit-test
 
-[ [ >fixnum 255 fixnum-bitand ] ]
+[ [ >fixnum 255 >R R> fixnum-bitand ] ]
 [ [ >integer 256 rem ] test-modular-arithmetic ] unit-test
 
+[ t ] [
+    [ { fixnum fixnum } declare + [ 1 + >fixnum ] [ 2 + >fixnum ] bi ]
+    { >fixnum } inlined?
+] unit-test
+
 [ [ "COMPLEX SHUFFLE" fixnum+fast "COMPLEX SHUFFLE" set-alien-unsigned-1 ] ]
 [ [ [ { fixnum fixnum } declare + ] 2dip set-alien-unsigned-1 ] test-modular-arithmetic ] unit-test
 
@@ -175,4 +177,116 @@ cell {
 [ t ] [
     [ 0 10 <byte-array> 10 [ 1 pick 0 + >fixnum pick set-nth-unsafe [ 1 + >fixnum ] dip ] times ]
     { >fixnum } inlined?
+] unit-test
+
+[ f ] [ [ + >fixnum ] { >fixnum } inlined? ] unit-test
+
+[ t ] [
+    [ >integer [ >fixnum ] [ >fixnum ] bi ]
+    { >integer } inlined?
+] unit-test
+
+[ f ] [
+    [ >integer [ >fixnum ] [ >fixnum ] bi ]
+    { >fixnum } inlined?
+] unit-test
+
+[ t ] [
+    [ >integer [ 2 + >fixnum ] [ 3 + >fixnum ] bi ]
+    { >integer } inlined?
+] unit-test
+
+[ f ] [
+    [ >integer [ 2 + >fixnum ] [ 3 + >fixnum ] bi ]
+    { >fixnum } inlined?
+] unit-test
+
+[ t ] [
+    [ >integer [ >fixnum ] [ >fixnum ] bi ]
+    { >integer } inlined?
+] unit-test
+
+[ f ] [
+    [ >bignum [ >fixnum ] [ >fixnum ] bi ]
+    { >fixnum } inlined?
+] unit-test
+
+[ t ] [
+    [ >bignum [ >fixnum ] [ >fixnum ] bi ]
+    { >bignum } inlined?
+] unit-test
+
+[ f ] [
+    [ [ { fixnum } declare 2 fixnum+ ] dip [ >fixnum 2 - ] [ ] if ]
+    { fixnum+ } inlined?
+] unit-test
+
+[ t ] [
+    [ { fixnum boolean } declare [ 1 + ] [ "HI" throw ] if >fixnum ]
+    { fixnum+ >fixnum } inlined?
+] unit-test
+
+[ t ] [
+    [ { fixnum boolean } declare [ 1 + ] [ drop 5 ] if >fixnum ]
+    { fixnum+ >fixnum } inlined?
+] unit-test
+
+[ t ] [
+    [ { fixnum boolean } declare [ 1 + ] [ 2 + ] if >fixnum ]
+    { fixnum+ >fixnum } inlined?
+] unit-test
+
+[ [ [ 1 ] [ 4 ] if ] ] [
+    [ [ 1.5 ] [ 4 ] if >fixnum ] test-modular-arithmetic
+] unit-test
+
+[ [ [ 1 ] [ 2 ] if ] ] [
+    [ [ 1.5 ] [ 2.3 ] if >fixnum ] test-modular-arithmetic
+] unit-test
+
+[ f ] [
+    [ { fixnum fixnum boolean } declare [ [ 3 * ] [ 1 + ] dip ] [ [ 4 - ] [ 2 + ] dip ] if >fixnum ]
+    { fixnum+ >fixnum } inlined?
+] unit-test
+
+[ t ] [
+    [ 0 1000 [ 1 + dup >fixnum . ] times drop ]
+    { fixnum+ >fixnum } inlined?
+] unit-test
+
+[ t ] [
+    [ { fixnum } declare 3 + [ 1000 ] dip [ >fixnum . ] curry times ]
+    { fixnum+ >fixnum } inlined?
+] unit-test
+
+[ t ] [
+    [ 0 1000 [ 1 + ] times >fixnum ]
+    { fixnum+ >fixnum } inlined?
+] unit-test
+
+[ f ] [
+    [ f >fixnum ]
+    { >fixnum } inlined?
+] unit-test
+
+[ f ] [
+    [ [ >fixnum ] 2dip set-alien-unsigned-1 ]
+    { >fixnum } inlined?
+] unit-test
+
+[ t ] [
+    [ { fixnum } declare 123 >bignum bitand >fixnum ]
+    { >bignum fixnum>bignum bignum-bitand } inlined?
+] unit-test
+
+! Shifts
+[ t ] [
+    [
+        [ 0 ] 2dip { array } declare [
+            hashcode* >fixnum swap [
+                [ -2 shift ] [ 5 shift ] bi
+                + +
+            ] keep bitxor >fixnum
+        ] with each
+    ] { + bignum+ fixnum-shift bitxor bignum-bitxor } inlined?
 ] unit-test
\ No newline at end of file
index 148286faba029fe7dd80ee10320a690e14ff12bd..8ca80ccbae1ed74a44a607181dcce98a9ff7417a 100644 (file)
@@ -1,10 +1,11 @@
 ! Copyright (C) 2008, 2009 Slava Pestov, Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: math math.partial-dispatch namespaces sequences sets
-accessors assocs words kernel memoize fry combinators
-combinators.short-circuit layouts alien.accessors
+USING: math math.intervals math.private math.partial-dispatch
+namespaces sequences sets accessors assocs words kernel memoize fry
+combinators combinators.short-circuit layouts alien.accessors
 compiler.tree
 compiler.tree.combinators
+compiler.tree.propagation.info
 compiler.tree.def-use
 compiler.tree.def-use.simplified
 compiler.tree.late-optimizations ;
@@ -19,17 +20,24 @@ IN: compiler.tree.modular-arithmetic
 !    ==>
 !        [ >fixnum ] bi@ fixnum+fast
 
+! Words where the low-order bits of the output only depends on the
+! low-order bits of the input. If the output is only used for its
+! low-order bits, then the word can be converted into a form that is
+! cheaper to compute.
 { + - * bitand bitor bitxor } [
     [
         t "modular-arithmetic" set-word-prop
     ] each-integer-derived-op
 ] each
 
-{ bitand bitor bitxor bitnot }
+{ bitand bitor bitxor bitnot >integer >bignum fixnum>bignum }
 [ t "modular-arithmetic" set-word-prop ] each
 
+! Words that only use the low-order bits of their input. If the input
+! is a modular arithmetic word, then the input can be converted into
+! a form that is cheaper to compute.
 {
-    >fixnum
+    >fixnum bignum>fixnum float>fixnum
     set-alien-unsigned-1 set-alien-signed-1
     set-alien-unsigned-2 set-alien-signed-2
 }
@@ -38,80 +46,156 @@ cell 8 = [
 ] when
 [ t "low-order" set-word-prop ] each
 
-SYMBOL: modularize-values
+! Values which only have their low-order bits used. This set starts out
+! big and is gradually refined.
+SYMBOL: modular-values
 
 : modular-value? ( value -- ? )
-    modularize-values get key? ;
+    modular-values get key? ;
 
-: modularize-value ( value -- ) modularize-values get conjoin ;
+: modular-value ( value -- )
+    modular-values get conjoin ;
 
-GENERIC: maybe-modularize* ( value node -- )
+! Values which are known to be fixnums.
+SYMBOL: fixnum-values
 
-: maybe-modularize ( value -- )
-    actually-defined-by [ value>> ] [ node>> ] bi
-    over actually-used-by length 1 = [
-        maybe-modularize*
-    ] [ 2drop ] if ;
+: fixnum-value? ( value -- ? )
+    fixnum-values get key? ;
 
-M: #call maybe-modularize*
-    dup word>> "modular-arithmetic" word-prop [
-        [ modularize-value ]
-        [ in-d>> [ maybe-modularize ] each ] bi*
-    ] [ 2drop ] if ;
+: fixnum-value ( value -- )
+    fixnum-values get conjoin ;
 
-M: node maybe-modularize* 2drop ;
+GENERIC: compute-modular-candidates* ( node -- )
 
-GENERIC: compute-modularized-values* ( node -- )
+M: #push compute-modular-candidates*
+    [ out-d>> first ] [ literal>> ] bi
+    real? [ [ modular-value ] [ fixnum-value ] bi ] [ drop ] if ;
 
-M: #call compute-modularized-values*
-    dup word>> "low-order" word-prop
-    [ in-d>> first maybe-modularize ] [ drop ] if ;
+: small-shift? ( interval -- ? )
+    0 cell-bits tag-bits get - 1 - [a,b] interval-subset? ;
 
-M: node compute-modularized-values* drop ;
+: modular-word? ( #call -- ? )
+    dup word>> { shift fixnum-shift bignum-shift } memq?
+    [ node-input-infos second interval>> small-shift? ]
+    [ word>> "modular-arithmetic" word-prop ]
+    if ;
 
-: compute-modularized-values ( nodes -- )
-    [ compute-modularized-values* ] each-node ;
+: output-candidate ( #call -- )
+    out-d>> first [ modular-value ] [ fixnum-value ] bi ;
+
+: low-order-word? ( #call -- ? )
+    word>> "low-order" word-prop ;
+
+: input-candidiate ( #call -- )
+    in-d>> first modular-value ;
+
+M: #call compute-modular-candidates*
+    {
+        { [ dup modular-word? ] [ output-candidate ] }
+        { [ dup low-order-word? ] [ input-candidiate ] }
+        [ drop ]
+    } cond ;
+
+M: node compute-modular-candidates*
+    drop ;
+
+: compute-modular-candidates ( nodes -- )
+    H{ } clone modular-values set
+    H{ } clone fixnum-values set
+    [ compute-modular-candidates* ] each-node ;
+
+GENERIC: only-reads-low-order? ( node -- ? )
+
+: output-modular? ( #call -- ? )
+    out-d>> first modular-values get key? ;
+
+M: #call only-reads-low-order?
+    {
+        [ low-order-word? ]
+        [ { [ modular-word? ] [ output-modular? ] } 1&& ]
+    } 1|| ;
+
+M: node only-reads-low-order? drop f ;
+
+SYMBOL: changed?
+
+: only-used-as-low-order? ( value -- ? )
+    actually-used-by [ node>> only-reads-low-order? ] all? ;
+
+: (compute-modular-values) ( -- )
+    modular-values get keys [
+        dup only-used-as-low-order?
+        [ drop ] [ modular-values get delete-at changed? on ] if
+    ] each ;
+
+: compute-modular-values ( -- )
+    [ changed? off (compute-modular-values) changed? get ] loop ;
 
 GENERIC: optimize-modular-arithmetic* ( node -- nodes )
 
+M: #push optimize-modular-arithmetic*
+    dup [ out-d>> first modular-value? ] [ literal>> real? ] bi and
+    [ [ >fixnum ] change-literal ] when ;
+
 : redundant->fixnum? ( #call -- ? )
-    in-d>> first actually-defined-by value>> modular-value? ;
+    in-d>> first actually-defined-by
+    [ value>> { [ modular-value? ] [ fixnum-value? ] } 1&& ] all? ;
 
 : optimize->fixnum ( #call -- nodes )
     dup redundant->fixnum? [ drop f ] when ;
 
+: should-be->fixnum? ( #call -- ? )
+    out-d>> first modular-value? ;
+
 : optimize->integer ( #call -- nodes )
-    dup out-d>> first actually-used-by dup length 1 = [
-        first node>> { [ #call? ] [ word>> \ >fixnum eq? ] } 1&&
-        [ drop { } ] when
-    ] [ drop ] if ;
+    dup should-be->fixnum? [ \ >fixnum >>word ] when ;
 
 MEMO: fixnum-coercion ( flags -- nodes )
+    ! flags indicate which input parameters are already known to be fixnums,
+    ! and don't need a coercion as a result.
     [ [ ] [ >fixnum ] ? ] map '[ _ spread ] splice-quot ;
 
+: modular-value-info ( #call -- alist )
+    [ in-d>> ] [ out-d>> ] bi append
+    fixnum <class-info> '[ _ ] { } map>assoc ;
+
 : optimize-modular-op ( #call -- nodes )
     dup out-d>> first modular-value? [
         [ in-d>> ] [ word>> integer-op-input-classes ] [ ] tri
         [
             [
-                [ actually-defined-by value>> modular-value? ]
+                [ actually-defined-by [ value>> modular-value? ] all? ]
                 [ fixnum eq? ]
                 bi* or
             ] 2map fixnum-coercion
         ] [ [ modular-variant ] change-word ] bi* suffix
     ] when ;
 
+: optimize-low-order-op ( #call -- nodes )
+    dup in-d>> first actually-defined-by [ value>> fixnum-value? ] all? [
+        [ ] [ in-d>> first ] [ info>> ] tri
+        [ drop fixnum <class-info> ] change-at
+    ] when ;
+
+: like->fixnum? ( #call -- ? )
+    word>> { >fixnum bignum>fixnum float>fixnum } memq? ;
+
+: like->integer? ( #call -- ? )
+    word>> { >integer >bignum fixnum>bignum } memq? ;
+
 M: #call optimize-modular-arithmetic*
-    dup word>> {
-        { [ dup \ >fixnum eq? ] [ drop optimize->fixnum ] }
-        { [ dup \ >integer eq? ] [ drop optimize->integer ] }
-        { [ dup "modular-arithmetic" word-prop ] [ drop optimize-modular-op ] }
-        [ drop ]
+    {
+        { [ dup like->fixnum? ] [ optimize->fixnum ] }
+        { [ dup like->integer? ] [ optimize->integer ] }
+        { [ dup modular-word? ] [ optimize-modular-op ] }
+        { [ dup low-order-word? ] [ optimize-low-order-op ] }
+        [ ]
     } cond ;
 
 M: node optimize-modular-arithmetic* ;
 
 : optimize-modular-arithmetic ( nodes -- nodes' )
-    H{ } clone modularize-values set
-    dup compute-modularized-values
-    [ optimize-modular-arithmetic* ] map-nodes ;
+    dup compute-modular-candidates compute-modular-values
+    modular-values get assoc-empty? [
+        [ optimize-modular-arithmetic* ] map-nodes
+    ] unless ;
index 3b4574effe4b1751e91e2ff52c5e0363f06b97c3..19669c22399e4493081616ff771674301b8d78bb 100644 (file)
@@ -1,10 +1,10 @@
-IN: compiler.tree.normalization.tests
 USING: compiler.tree.builder compiler.tree.recursive
 compiler.tree.normalization
 compiler.tree.normalization.introductions
 compiler.tree.normalization.renaming
 compiler.tree compiler.tree.checker
 sequences accessors tools.test kernel math ;
+IN: compiler.tree.normalization.tests
 
 [ 3 ] [ [ 3drop 1 2 3 ] build-tree count-introductions ] unit-test
 
diff --git a/basis/compiler/tree/optimizer/optimizer-tests.factor b/basis/compiler/tree/optimizer/optimizer-tests.factor
deleted file mode 100644 (file)
index 5d05947..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-USING: compiler.tree.optimizer tools.test ;
-IN: compiler.tree.optimizer.tests
-
-
index ec2a4b1ece4edbaae8f3aee9a26c870c7ed347a5..cdbeabe532d6b3920bdcd3ac0e8586be2f8c86af 100644 (file)
@@ -35,7 +35,7 @@ M: +unknown+ curry-effect ;
 
 M: effect curry-effect
     [ in>> length ] [ out>> length ] [ terminated?>> ] tri
-    pick 0 = [ [ 1+ ] dip ] [ [ 1- ] 2dip ] if
+    pick 0 = [ [ 1 + ] dip ] [ [ 1 - ] 2dip ] if
     effect boa ;
 
 M: curry cached-effect
@@ -153,7 +153,7 @@ ERROR: uninferable ;
 
 : (value>quot) ( value-info -- quot )
     dup class>> {
-        { \ quotation [ literal>> dup remember-inlining '[ drop @ ] ] }
+        { \ quotation [ literal>> dup add-to-history '[ drop @ ] ] }
         { \ curry [
             slots>> third (value>quot)
             '[ [ obj>> ] [ quot>> @ ] bi ]
index a99c2a2447c7a83a225ff33c54dacb4baf6eb708..b546e56e4ba2462746d1b7b694f9589f0563b6f7 100644 (file)
@@ -1,6 +1,6 @@
-IN: compiler.tree.propagation.copy.tests
 USING: compiler.tree.propagation.copy tools.test namespaces kernel
 assocs ;
+IN: compiler.tree.propagation.copy.tests
 
 H{ } clone copies set
 
index cae8d6cde684571091108db0aa00983e275554fc..0a04b48160c12af21a908a36b7471c72431ec761 100644 (file)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: assocs classes classes.algebra classes.tuple
 classes.tuple.private kernel accessors math math.intervals namespaces
-sequences sequences.private words combinators
+sequences sequences.private words combinators memoize
 combinators.short-circuit byte-arrays strings arrays layouts
 cpu.architecture compiler.tree.propagation.copy ;
 IN: compiler.tree.propagation.info
@@ -78,21 +78,37 @@ UNION: fixed-length array byte-array string ;
 : empty-set? ( info -- ? )
     {
         [ class>> null-class? ]
-        [ [ class>> real class<= ] [ interval>> empty-interval eq? ] bi and ]
+        [ [ interval>> empty-interval eq? ] [ class>> real class<= ] bi and ]
     } 1|| ;
 
-: min-value ( class -- n ) fixnum eq? [ most-negative-fixnum ] [ -1/0. ] if ;
+: min-value ( class -- n )
+    {
+        { fixnum [ most-negative-fixnum ] }
+        { array-capacity [ 0 ] }
+        [ drop -1/0. ]
+    } case ;
 
-: max-value ( class -- n ) fixnum eq? [ most-positive-fixnum ] [ 1/0. ] if ;
+: max-value ( class -- n )
+    {
+        { fixnum [ most-positive-fixnum ] }
+        { array-capacity [ max-array-capacity ] }
+        [ drop 1/0. ]
+    } case ;
 
-: class-interval ( class -- i ) fixnum eq? [ fixnum-interval ] [ full-interval ] if ;
+: class-interval ( class -- i )
+    {
+        { fixnum [ fixnum-interval ] }
+        { array-capacity [ array-capacity-interval ] }
+        [ drop full-interval ]
+    } case ;
 
 : wrap-interval ( interval class -- interval' )
     {
-        { fixnum [ interval->fixnum ] }
-        { array-capacity [ max-array-capacity [a,a] interval-rem ] }
+        { [ over empty-interval eq? ] [ drop ] }
+        { [ over full-interval eq? ] [ nip class-interval ] }
+        { [ 2dup class-interval interval-subset? not ] [ nip class-interval ] }
         [ drop ]
-    } case ;
+    } cond ;
 
 : init-interval ( info -- info )
     dup [ interval>> full-interval or ] [ class>> ] bi wrap-interval >>interval
index ef1326c81f02422cdbbf7b20cd7a0e1efc9e54cd..3836e0f3ba78451045326c50967eed41c914bda6 100755 (executable)
@@ -3,8 +3,8 @@
 USING: accessors kernel arrays sequences math math.order
 math.partial-dispatch generic generic.standard generic.single generic.math
 classes.algebra classes.union sets quotations assocs combinators
-words namespaces continuations classes fry combinators.smart hints
-locals
+combinators.short-circuit words namespaces continuations classes
+fry hints locals
 compiler.tree
 compiler.tree.builder
 compiler.tree.recursive
@@ -14,19 +14,6 @@ compiler.tree.propagation.info
 compiler.tree.propagation.nodes ;
 IN: compiler.tree.propagation.inlining
 
-! We count nodes up-front; if there are relatively few nodes,
-! we are more eager to inline
-SYMBOL: node-count
-
-: count-nodes ( nodes -- n )
-    0 swap [ drop 1+ ] each-node ;
-
-: compute-node-count ( nodes -- ) count-nodes node-count set ;
-
-! We try not to inline the same word too many times, to avoid
-! combinatorial explosion
-SYMBOL: inlining-count
-
 ! Splicing nodes
 : splicing-call ( #call word -- nodes )
     [ [ in-d>> ] [ out-d>> ] bi ] dip #call 1array ;
@@ -101,99 +88,28 @@ M: callable splicing-nodes splicing-body ;
     dupd inlining-math-partial eliminate-dispatch ;
 
 ! Method body inlining
-SYMBOL: recursive-calls
-DEFER: (flat-length)
-
-: word-flat-length ( word -- n )
-    {
-        ! special-case
-        { [ dup { dip 2dip 3dip } memq? ] [ drop 1 ] }
-        ! not inline
-        { [ dup inline? not ] [ drop 1 ] }
-        ! recursive and inline
-        { [ dup recursive-calls get key? ] [ drop 10 ] }
-        ! inline
-        [ [ recursive-calls get conjoin ] [ def>> (flat-length) ] bi ]
-    } cond ;
-
-: (flat-length) ( seq -- n )
-    [
-        {
-            { [ dup quotation? ] [ (flat-length) 2 + ] }
-            { [ dup array? ] [ (flat-length) ] }
-            { [ dup word? ] [ word-flat-length ] }
-            [ drop 0 ]
-        } cond
-    ] sigma ;
-
-: flat-length ( word -- n )
-    H{ } clone recursive-calls [
-        [ recursive-calls get conjoin ]
-        [ def>> (flat-length) 5 /i ]
-        bi
-    ] with-variable ;
-
-: classes-known? ( #call -- ? )
-    in-d>> [
-        value-info class>>
-        [ class-types length 1 = ]
-        [ union-class? not ]
-        bi and
-    ] any? ;
-
-: node-count-bias ( -- n )
-    45 node-count get [-] 8 /i ;
-
-: body-length-bias ( word -- n )
-    [ flat-length ] [ inlining-count get at 0 or ] bi
-    over 2 <= [ drop ] [ 2/ 1+ * ] if 24 swap [-] 4 /i ;
-
-: inlining-rank ( #call word -- n )
-    [
-        [ classes-known? 2 0 ? ]
-        [
-            [ body-length-bias ]
-            [ "specializer" word-prop 1 0 ? ]
-            [ method-body? 1 0 ? ]
-            tri
-            node-count-bias
-            loop-nesting get 0 or 2 *
-        ] bi*
-    ] sum-outputs ;
-
-: should-inline? ( #call word -- ? )
-    dup inline? [ 2drop t ] [ inlining-rank 5 >= ] if ;
-
 SYMBOL: history
 
 : already-inlined? ( obj -- ? ) history get memq? ;
 
 : add-to-history ( obj -- ) history [ swap suffix ] change ;
 
-: remember-inlining ( word -- )
-    [ inlining-count get inc-at ]
-    [ add-to-history ]
-    bi ;
-
 :: inline-word ( #call word -- ? )
     word already-inlined? [ f ] [
         #call word splicing-body [
             [
-                word remember-inlining
-                [ ] [ count-nodes ] [ (propagate) ] tri
+                word add-to-history
+                dup (propagate)
             ] with-scope
-            [ #call (>>body) ] [ node-count +@ ] bi* t
+            #call (>>body) t
         ] [ f ] if*
     ] if ;
 
-: inline-method-body ( #call word -- ? )
-    2dup should-inline? [ inline-word ] [ 2drop f ] if ;
-
 : always-inline-word? ( word -- ? )
     { curry compose } memq? ;
 
 : never-inline-word? ( word -- ? )
-    [ deferred? ] [ "default" word-prop ] [ \ call eq? ] tri or or ;
+    { [ deferred? ] [ "default" word-prop ] [ \ call eq? ] } 1|| ;
 
 : custom-inlining? ( word -- ? )
     "custom-inlining" word-prop ;
@@ -217,7 +133,7 @@ SYMBOL: history
         { [ dup always-inline-word? ] [ inline-word ] }
         { [ dup standard-generic? ] [ inline-standard-method ] }
         { [ dup math-generic? ] [ inline-math-method ] }
-        { [ dup method-body? ] [ inline-method-body ] }
+        { [ dup inline? ] [ inline-word ] }
         [ 2drop f ]
     } cond ;
 
index 8c4e81f41d8007398bf15eda9d73073b620b4364..3a20424e18f53cf9dd9a0e0aa39b081dc65a96e9 100644 (file)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel effects accessors math math.private
 math.integers.private math.partial-dispatch math.intervals
-math.parser math.order layouts words sequences sequences.private
+math.parser math.order math.functions layouts words sequences sequences.private
 arrays assocs classes classes.algebra combinators generic.math
 splitting fry locals classes.tuple alien.accessors
 classes.tuple.private slots.private definitions strings.private
@@ -32,14 +32,20 @@ IN: compiler.tree.propagation.known-words
 
 \ bitnot { integer } "input-classes" set-word-prop
 
-: ?change-interval ( info quot -- quot' )
-    over interval>> [ [ clone ] dip change-interval ] [ 2drop ] if ; inline
+: real-op ( info quot -- quot' )
+    [
+        dup class>> real classes-intersect?
+        [ clone ] [ drop real <class-info> ] if
+    ] dip
+    change-interval ; inline
 
 { bitnot fixnum-bitnot bignum-bitnot } [
-    [ [ interval-bitnot ] ?change-interval ] "outputs" set-word-prop
+    [ [ interval-bitnot ] real-op ] "outputs" set-word-prop
 ] each
 
-\ abs [ [ interval-abs ] ?change-interval ] "outputs" set-word-prop
+\ abs [ [ interval-abs ] real-op ] "outputs" set-word-prop
+
+\ absq [ [ interval-absq ] real-op ] "outputs" set-word-prop
 
 : math-closure ( class -- newclass )
     { fixnum bignum integer rational float real number object }
@@ -240,11 +246,11 @@ generic-comparison-ops [
     dup name>> {
         {
             [ "alien-signed-" ?head ]
-            [ string>number 8 * 1- 2^ dup neg swap 1- [a,b] ]
+            [ string>number 8 * 1 - 2^ dup neg swap 1 - [a,b] ]
         }
         {
             [ "alien-unsigned-" ?head ]
-            [ string>number 8 * 2^ 1- 0 swap [a,b] ]
+            [ string>number 8 * 2^ 1 - 0 swap [a,b] ]
         }
     } cond
     [ fits-in-fixnum? fixnum integer ? ] keep <class/interval-info>
index 59631d04c67c6b20b19673c741263fee9af69b33..511f87dd094b394e4caa8a7f5942981dbc988af4 100644 (file)
@@ -82,6 +82,8 @@ IN: compiler.tree.propagation.tests
 
 [ bignum ] [ [ { bignum bignum } declare bitxor ] final-math-class ] unit-test
 
+[ bignum ] [ [ { integer } declare 123 >bignum bitand ] final-math-class ] unit-test
+
 [ float ] [ [ { float float } declare mod ] final-math-class ] unit-test
 
 [ V{ fixnum } ] [ [ 255 bitand ] final-classes ] unit-test
@@ -157,6 +159,22 @@ IN: compiler.tree.propagation.tests
 
 [ V{ t } ] [ [ abs 40 mod 0 >= ] final-literals ] unit-test
 
+[ t ] [ [ abs ] final-info first interval>> [0,inf] = ] unit-test
+
+[ t ] [ [ absq ] final-info first interval>> [0,inf] = ] unit-test
+
+[ t ] [ [ { float } declare abs ] final-info first interval>> [0,inf] = ] unit-test
+
+[ t ] [ [ { float } declare absq ] final-info first interval>> [0,inf] = ] unit-test
+
+[ t ] [ [ { complex } declare abs ] final-info first interval>> [0,inf] = ] unit-test
+
+[ t ] [ [ { complex } declare absq ] final-info first interval>> [0,inf] = ] unit-test
+
+[ t ] [ [ [ - absq ] [ + ] 2map-reduce ] final-info first interval>> [0,inf] = ] unit-test
+
+[ t ] [ [ { double-array double-array } declare [ - absq ] [ + ] 2map-reduce ] final-info first interval>> [0,inf] = ] unit-test
+
 [ V{ string } ] [
     [ dup string? not [ "Oops" throw ] [ ] if ] final-classes
 ] unit-test
@@ -278,11 +296,11 @@ IN: compiler.tree.propagation.tests
 ] unit-test
 
 [ V{ fixnum } ] [
-    [ >fixnum dup 100 < [ 1+ ] [ "Oops" throw ] if ] final-classes
+    [ >fixnum dup 100 < [ 1 + ] [ "Oops" throw ] if ] final-classes
 ] unit-test
 
 [ V{ -1 } ] [
-    [ 0 dup 100 < not [ 1+ ] [ 1- ] if ] final-literals
+    [ 0 dup 100 < not [ 1 + ] [ 1 - ] if ] final-literals
 ] unit-test
 
 [ V{ 2 } ] [
@@ -444,6 +462,13 @@ TUPLE: mixed-mutable-immutable { x integer } { y sequence read-only } ;
     ] final-classes
 ] unit-test
 
+[ V{ f { } } ] [
+    [
+        T{ mixed-mutable-immutable f 3 { } }
+        [ x>> ] [ y>> ] bi
+    ] final-literals
+] unit-test
+
 ! Recursive propagation
 : recursive-test-1 ( a -- b ) recursive-test-1 ; inline recursive
 
@@ -472,7 +497,7 @@ TUPLE: mixed-mutable-immutable { x integer } { y sequence read-only } ;
 ] unit-test
 
 : recursive-test-4 ( i n -- )
-    2dup < [ [ 1+ ] dip recursive-test-4 ] [ 2drop ] if ; inline recursive
+    2dup < [ [ 1 + ] dip recursive-test-4 ] [ 2drop ] if ; inline recursive
 
 [ ] [ [ recursive-test-4 ] final-info drop ] unit-test
 
@@ -487,7 +512,7 @@ TUPLE: mixed-mutable-immutable { x integer } { y sequence read-only } ;
 [ V{ integer } ] [ [ { fixnum } declare recursive-test-6 ] final-classes ] unit-test
 
 : recursive-test-7 ( a -- b )
-    dup 10 < [ 1+ recursive-test-7 ] when ; inline recursive
+    dup 10 < [ 1 + recursive-test-7 ] when ; inline recursive
 
 [ V{ fixnum } ] [ [ 0 recursive-test-7 ] final-classes ] unit-test
 
@@ -502,8 +527,8 @@ TUPLE: mixed-mutable-immutable { x integer } { y sequence read-only } ;
 ] unit-test
 
 GENERIC: iterate ( obj -- next-obj ? )
-M: fixnum iterate f ;
-M: array iterate first t ;
+M: fixnum iterate f ; inline
+M: array iterate first t ; inline
 
 : dead-loop ( obj -- final-obj )
     iterate [ dead-loop ] when ; inline recursive
@@ -567,7 +592,7 @@ M: array iterate first t ;
 ] unit-test
 
 GENERIC: bad-generic ( a -- b )
-M: fixnum bad-generic 1 fixnum+fast ;
+M: fixnum bad-generic 1 fixnum+fast ; inline
 : bad-behavior ( -- b ) 4 bad-generic ; inline recursive
 
 [ V{ fixnum } ] [ [ bad-behavior ] final-classes ] unit-test
@@ -645,7 +670,7 @@ MIXIN: empty-mixin
 ] unit-test
   
 [ V{ bignum } ] [
-    [ { bignum } declare dup 1- bitxor ] final-classes
+    [ { bignum } declare dup 1 - bitxor ] final-classes
 ] unit-test
 
 [ V{ bignum integer } ] [
@@ -685,7 +710,7 @@ MIXIN: empty-mixin
 
 TUPLE: littledan-1 { a read-only } ;
 
-: (littledan-1-test) ( a -- ) a>> 1+ littledan-1 boa (littledan-1-test) ; inline recursive
+: (littledan-1-test) ( a -- ) a>> 1 + littledan-1 boa (littledan-1-test) ; inline recursive
 
 : littledan-1-test ( -- ) 0 littledan-1 boa (littledan-1-test) ; inline
 
@@ -702,7 +727,7 @@ TUPLE: littledan-2 { from read-only } { to read-only } ;
 [ ] [ [ littledan-2-test ] final-classes drop ] unit-test
 
 : (littledan-3-test) ( x -- )
-    length 1+ f <array> (littledan-3-test) ; inline recursive
+    length 1 + f <array> (littledan-3-test) ; inline recursive
 
 : littledan-3-test ( -- )
     0 f <array> (littledan-3-test) ; inline
@@ -711,7 +736,7 @@ TUPLE: littledan-2 { from read-only } { to read-only } ;
 
 [ V{ 0 } ] [ [ { } length ] final-literals ] unit-test
 
-[ V{ 1 } ] [ [ { } length 1+ f <array> length ] final-literals ] unit-test
+[ V{ 1 } ] [ [ { } length 1 + f <array> length ] final-literals ] unit-test
 
 ! generalize-counter is not tight enough
 [ V{ fixnum } ] [ [ 0 10 [ 1 + >fixnum ] times ] final-classes ] unit-test
@@ -740,7 +765,7 @@ TUPLE: foo bar ;
 [ t ] [ [ foo new ] { new } inlined? ] unit-test
 
 GENERIC: whatever ( x -- y )
-M: number whatever drop foo ;
+M: number whatever drop foo ; inline
 
 [ t ] [ [ 1 whatever new ] { new } inlined? ] unit-test
 
@@ -749,8 +774,8 @@ M: number whatever drop foo ;
 [ f ] [ [ that-thing new ] { new } inlined? ] unit-test
 
 GENERIC: whatever2 ( x -- y )
-M: number whatever2 drop H{ { 1 1 } { 2 2 } { 3 3 } { 4 4 } { 5 6 } } ;
-M: f whatever2 ;
+M: number whatever2 drop H{ { 1 1 } { 2 2 } { 3 3 } { 4 4 } { 5 6 } } ; inline
+M: f whatever2 ; inline
 
 [ t ] [ [ 1 whatever2 at ] { at* hashcode* } inlined? ] unit-test
 [ f ] [ [ whatever2 at ] { at* hashcode* } inlined? ] unit-test
index 3dd2c4998af257ccdfdce2cad8d341a7fdc79068..a11264fb7ff9cf1bf64823c10a4e82227a15cb0d 100644 (file)
@@ -19,6 +19,4 @@ IN: compiler.tree.propagation
     H{ } clone copies set
     H{ } clone 1array value-infos set
     H{ } clone 1array constraints set
-    H{ } clone inlining-count set
-    dup compute-node-count
     dup (propagate) ;
index db427d34af51e6aced5b03e345e49d250d46a019..974bb584eba38b70b82bb59611e59a34908626ae 100644 (file)
@@ -1,6 +1,6 @@
-IN: compiler.tree.propagation.recursive.tests
 USING: tools.test compiler.tree.propagation.recursive
 math.intervals kernel math literals layouts ;
+IN: compiler.tree.propagation.recursive.tests
 
 [ T{ interval f { 0 t } { 1/0. t } } ] [
     T{ interval f { 1 t } { 1 t } }
index 5837d59ef9b0a0f3143b67c681b2cc4d44fb3f62..88c9831a24307a0169cfd2990035a15533d9f47d 100644 (file)
@@ -119,7 +119,9 @@ M: #declare propagate-before
 M: #call propagate-before
     dup word>> {
         { [ 2dup foldable-call? ] [ fold-call ] }
-        { [ 2dup do-inlining ] [ 2drop ] }
+        { [ 2dup do-inlining ] [
+            [ output-value-infos ] [ drop out-d>> ] 2bi refine-value-infos 
+        ] }
         [
             [ [ output-value-infos ] [ drop out-d>> ] 2bi set-value-infos ]
             [ compute-constraints ]
index 86114772f752a4e185881d349a8bae89637dc0fd..4996729ded72a235de05968f5931dd8f8fbf8674 100644 (file)
@@ -63,5 +63,5 @@ UNION: fixed-length-sequence array byte-array string ;
         { [ over 0 = ] [ 2drop fixnum <class-info> ] }
         { [ 2dup length-accessor? ] [ nip length>> ] }
         { [ dup literal?>> ] [ literal>> literal-info-slot ] }
-        [ [ 1- ] [ slots>> ] bi* ?nth ]
+        [ [ 1 - ] [ slots>> ] bi* ?nth ]
     } cond [ object-info ] unless* ;
index 3fd7af0324a7d74d7eee65aa33909ed86c956167..683c182903fc88a6c0513acb8999af297f63184f 100644 (file)
@@ -20,7 +20,7 @@ IN: compiler.tree.propagation.transforms
 
 : rem-custom-inlining ( #call -- quot/f )
     second value-info literal>> dup integer?
-    [ power-of-2? [ 1- bitand ] f ? ] [ drop f ] if ;
+    [ power-of-2? [ 1 - bitand ] f ? ] [ drop f ] if ;
 
 {
     mod-integer-integer
@@ -38,6 +38,12 @@ IN: compiler.tree.propagation.transforms
     in-d>> rem-custom-inlining
 ] "custom-inlining" set-word-prop
 
+: positive-fixnum? ( obj -- ? )
+    { [ fixnum? ] [ 0 >= ] } 1&& ;
+
+: simplify-bitand? ( value -- ? )
+    value-info literal>> positive-fixnum? ;
+
 {
     bitand-integer-integer
     bitand-integer-fixnum
@@ -45,10 +51,17 @@ IN: compiler.tree.propagation.transforms
     bitand
 } [
     [
-        in-d>> second value-info >literal< [
-            0 most-positive-fixnum between?
-            [ [ >fixnum ] bi@ fixnum-bitand ] f ?
-        ] when
+        {
+            {
+                [ dup in-d>> first simplify-bitand? ]
+                [ drop [ >fixnum fixnum-bitand ] ]
+            }
+            {
+                [ dup in-d>> second simplify-bitand? ]
+                [ drop [ [ >fixnum ] dip fixnum-bitand ] ]
+            }
+            [ drop f ]
+        } cond
     ] "custom-inlining" set-word-prop
 ] each
 
@@ -162,7 +175,7 @@ CONSTANT: lookup-table-at-max 256
     } 1&& ;
 
 : lookup-table-seq ( assoc -- table )
-    [ keys supremum 1+ ] keep '[ _ at ] { } map-as ;
+    [ keys supremum 1 + ] keep '[ _ at ] { } map-as ;
 
 : lookup-table-quot ( seq -- newquot )
     lookup-table-seq
index 81570848055f8daee4b548eee4252b20cb6262c5..4c4220f238c5aee623ab57c42225138ecc64e685 100644 (file)
@@ -1,10 +1,10 @@
-IN: compiler.tree.recursive.tests
 USING: tools.test kernel combinators.short-circuit math sequences accessors
 compiler.tree
 compiler.tree.builder
 compiler.tree.combinators
 compiler.tree.recursive
 compiler.tree.recursive.private ;
+IN: compiler.tree.recursive.tests
 
 [ { f f f f } ] [ f { f t f f } (tail-calls) ] unit-test
 [ { f f f t } ] [ t { f t f f } (tail-calls) ] unit-test
@@ -30,7 +30,7 @@ compiler.tree.recursive.private ;
     ] curry contains-node? ;
 
 : loop-test-1 ( a -- )
-    dup [ 1+ loop-test-1 ] [ drop ] if ; inline recursive
+    dup [ 1 + loop-test-1 ] [ drop ] if ; inline recursive
                           
 [ t ] [
     [ loop-test-1 ] build-tree analyze-recursive
@@ -53,7 +53,7 @@ compiler.tree.recursive.private ;
 ] unit-test
 
 : loop-test-2 ( a b -- a' )
-    dup [ 1+ loop-test-2 1- ] [ drop ] if ; inline recursive
+    dup [ 1 + loop-test-2 1 - ] [ drop ] if ; inline recursive
 
 [ t ] [
     [ loop-test-2 ] build-tree analyze-recursive
@@ -198,4 +198,4 @@ DEFER: b4
 [ t ] [ [ b4 ] build-tree analyze-recursive \ a4 label-is-loop? ] unit-test
 [ t ] [ [ b4 ] build-tree analyze-recursive \ b4 label-is-not-loop? ] unit-test
 [ t ] [ [ a4 ] build-tree analyze-recursive \ a4 label-is-not-loop? ] unit-test
-[ t ] [ [ a4 ] build-tree analyze-recursive \ b4 label-is-loop? ] unit-test
\ No newline at end of file
+[ t ] [ [ a4 ] build-tree analyze-recursive \ b4 label-is-loop? ] unit-test
index a96fc0501d3e15c5a76187d75dd73eaaa33b2eca..d73368867d0a25706ab5e3813dd99b85db7a176c 100644 (file)
@@ -1,4 +1,3 @@
-IN: compiler.tree.tuple-unboxing.tests
 USING: tools.test compiler.tree
 compiler.tree.builder compiler.tree.recursive
 compiler.tree.normalization compiler.tree.propagation
@@ -7,6 +6,7 @@ compiler.tree.tuple-unboxing compiler.tree.checker
 compiler.tree.def-use kernel accessors sequences math
 math.private sorting math.order binary-search sequences.private
 slots.private ;
+IN: compiler.tree.tuple-unboxing.tests
 
 : test-unboxing ( quot -- )
     build-tree
index 9ece36e6cd8f87572bb45eb2b984affc3128cb56..2df4dce916a5f5807f54540bb4349188fac608c3 100755 (executable)
@@ -17,8 +17,8 @@ TUPLE: huffman-code
     { code } ;\r
 \r
 : <huffman-code> ( -- code ) 0 0 0 huffman-code boa ;\r
-: next-size ( code -- ) [ 1+ ] change-size [ 2 * ] change-code drop ;\r
-: next-code ( code -- ) [ 1+ ] change-code drop ;\r
+: next-size ( code -- ) [ 1 + ] change-size [ 2 * ] change-code drop ;\r
+: next-code ( code -- ) [ 1 + ] change-code drop ;\r
 \r
 :: all-patterns ( huff n -- seq )\r
     n log2 huff size>> - :> free-bits\r
index 05ec94a794daa8c79f4b9322d6028987fcd23b8c..ff38f94c68a236521540f498c56656f86049ac2c 100644 (file)
@@ -64,7 +64,7 @@ CONSTANT: clen-shuffle { 16 17 18 0 8 7 9 6 10 5 11 4 12 3 13 2 14 1 15 }
         k swap - dup k! 0 >
     ] 
     [ ] produce swap suffix
-    { } [ dup array? [ dup first 16 = ] [ f ] if [ [ unclip-last ] [ second 1+ swap <repetition> append ] bi* ] [ suffix ] if ] reduce
+    { } [ dup array? [ dup first 16 = ] [ f ] if [ [ unclip-last ] [ second 1 + swap <repetition> append ] bi* ] [ suffix ] if ] reduce
     [ dup array? [ second 0 <repetition> ] [ 1array ] if ] map concat
     nip swap cut 2array [ [ length>> [0,b) ] [ ] bi get-table ] map ;
     
@@ -91,14 +91,14 @@ CONSTANT: dist-table
     }
 
 : nth* ( n seq -- elt )
-    [ length 1- swap - ] [ nth ] bi ;
+    [ length 1 - swap - ] [ nth ] bi ;
 
 :: inflate-lz77 ( seq -- bytes )
     1000 <byte-vector> :> bytes
     seq
     [
         dup array?
-        [ first2 '[ _ 1- bytes nth* bytes push ] times ]
+        [ first2 '[ _ 1 - bytes nth* bytes push ] times ]
         [ bytes push ] if
     ] each 
     bytes ;
diff --git a/basis/compression/lzw/lzw-tests.factor b/basis/compression/lzw/lzw-tests.factor
deleted file mode 100644 (file)
index 698e35d..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-! Copyright (C) 2009 Doug Coleman.
-! See http://factorcode.org/license.txt for BSD license.
-USING: accessors tools.test compression.lzw ;
-IN: compression.lzw.tests
index 1c2dea2d79ce62305457be3cb4b306316eb5591c..d3f3229171bb279522c8d01d0e6c869d62a00077 100644 (file)
@@ -1,7 +1,7 @@
-IN: concurrency.combinators.tests\r
 USING: concurrency.combinators tools.test random kernel math \r
 concurrency.mailboxes threads sequences accessors arrays\r
 math.parser ;\r
+IN: concurrency.combinators.tests\r
 \r
 [ [ drop ] parallel-each ] must-infer\r
 { 2 0 } [ [ 2drop ] 2parallel-each ] must-infer-as\r
@@ -49,7 +49,7 @@ math.parser ;
 \r
 [ "1a" "4b" "3c" ] [\r
     2\r
-    { [ 1- ] [ sq ] [ 1+ ] } parallel-cleave\r
+    { [ 1 - ] [ sq ] [ 1 + ] } parallel-cleave\r
     [ number>string ] 3 parallel-napply\r
     { [ "a" append ] [ "b" append ] [ "c" append ] } parallel-spread\r
 ] unit-test\r
index d79cfbf1c91b9863801cd9dcc03eec2cae4634d0..d88fcef6093199984a386ee9f6e7df170852b7e4 100644 (file)
@@ -23,7 +23,7 @@ ERROR: count-down-already-done ;
 : count-down ( count-down -- )\r
     dup n>> dup zero?\r
     [ count-down-already-done ]\r
-    [ 1- >>n count-down-check ] if ;\r
+    [ 1 - >>n count-down-check ] if ;\r
 \r
 : await-timeout ( count-down timeout -- )\r
     [ promise>> ] dip ?promise-timeout ?linked t assert= ;\r
index 6c0d882cacfd56f93fc1f4f2fede094b20fcac5f..b2a28519260ee4ed1ec7b98e39fadfc5605f7bae 100644 (file)
@@ -1,9 +1,9 @@
-IN: concurrency.distributed.tests
 USING: tools.test concurrency.distributed kernel io.files
 io.files.temp io.directories arrays io.sockets system
 combinators threads math sequences concurrency.messaging
 continuations accessors prettyprint ;
 FROM: concurrency.messaging => receive send ;
+IN: concurrency.distributed.tests
 
 : test-node ( -- addrspec )
     {
index 7ec9db8ad96a21ea1748828c3e4af477817ccd8b..a8214cf42f2301a5712a034df555f20053c3bbf3 100644 (file)
@@ -1,8 +1,8 @@
-IN: concurrency.exchangers.tests\r
 USING: tools.test concurrency.exchangers\r
 concurrency.count-downs concurrency.promises locals kernel\r
 threads ;\r
 FROM: sequences => 3append ;\r
+IN: concurrency.exchangers.tests\r
 \r
 :: exchanger-test ( -- string )\r
     [let |\r
index 05ff74b03f27236dcf436e2e74aef8688ba07aa3..4fc00b71dd74df1c5c604b7d0703bc6c38b384a1 100644 (file)
@@ -1,6 +1,6 @@
-IN: concurrency.flags.tests\r
 USING: tools.test concurrency.flags concurrency.combinators\r
 kernel threads locals accessors calendar ;\r
+IN: concurrency.flags.tests\r
 \r
 :: flag-test-1 ( -- val )\r
     [let | f [ <flag> ] |\r
index 208a72f820ebfe6e218e4a2349d14483c9663a33..07466e5ffdec0cdee9c7065263681d809eae36f8 100644 (file)
@@ -1,5 +1,5 @@
-IN: concurrency.futures.tests\r
 USING: concurrency.futures kernel tools.test threads ;\r
+IN: concurrency.futures.tests\r
 \r
 [ 50 ] [\r
     [ 50 ] future ?future\r
index 8f82aa88baa997c56780e6b51e6b17117a7fa71f..f199876fd0c5d360c564debc1439724130f1ec08 100644 (file)
@@ -1,7 +1,7 @@
-IN: concurrency.locks.tests\r
 USING: tools.test concurrency.locks concurrency.count-downs\r
 concurrency.messaging concurrency.mailboxes locals kernel\r
 threads sequences calendar accessors ;\r
+IN: concurrency.locks.tests\r
 \r
 :: lock-test-0 ( -- v )\r
     [let | v [ V{ } clone ]\r
index 0094f3323d709d26f22850b02ee2a206ab12a537..18cd86fa53470dcaf00944a203f86482871e3e56 100644 (file)
@@ -57,7 +57,7 @@ TUPLE: rw-lock readers writers reader# writer ;
 <PRIVATE\r
 \r
 : add-reader ( lock -- )\r
-    [ 1+ ] change-reader# drop ;\r
+    [ 1 + ] change-reader# drop ;\r
 \r
 : acquire-read-lock ( lock timeout -- )\r
     over writer>>\r
@@ -68,7 +68,7 @@ TUPLE: rw-lock readers writers reader# writer ;
     writers>> notify-1 ;\r
 \r
 : remove-reader ( lock -- )\r
-    [ 1- ] change-reader# drop ;\r
+    [ 1 - ] change-reader# drop ;\r
 \r
 : release-read-lock ( lock -- )\r
     dup remove-reader\r
index 81e54f18078d907f7740ec97dafd371140eaf837..56d579d6c71cd987a10ebb8ccd22f7fb77ef7c4a 100644 (file)
@@ -1,7 +1,7 @@
-IN: concurrency.mailboxes.tests\r
 USING: concurrency.mailboxes concurrency.count-downs concurrency.conditions\r
 vectors sequences threads tools.test math kernel strings namespaces\r
 continuations calendar destructors ;\r
+IN: concurrency.mailboxes.tests\r
 \r
 { 1 1 } [ [ integer? ] mailbox-get? ] must-infer-as\r
 \r
@@ -86,4 +86,4 @@ continuations calendar destructors ;
 [\r
     <mailbox> 1 seconds mailbox-get-timeout\r
 ] [ wait-timeout? ] must-fail-with\r
-    
\ No newline at end of file
+    \r
index 200adb14aea9148793785c66458504ce70e6e8e7..419277647d778d7679ff74f765ae59de6b2af94f 100755 (executable)
@@ -1,10 +1,10 @@
 ! Copyright (C) 2005, 2008 Chris Double, Slava Pestov.\r
 ! See http://factorcode.org/license.txt for BSD license.\r
-IN: concurrency.mailboxes\r
 USING: dlists deques threads sequences continuations\r
 destructors namespaces math quotations words kernel\r
 arrays assocs init system concurrency.conditions accessors\r
 debugger debugger.threads locals fry ;\r
+IN: concurrency.mailboxes\r
 \r
 TUPLE: mailbox threads data disposed ;\r
 \r
index 36fe4ef907244b481b449b01cd7aafa38432d68c..353f4a69b7cd62d58b64bab270e4c925d2c5cb66 100644 (file)
@@ -1,6 +1,6 @@
-IN: concurrency.promises.tests\r
 USING: vectors concurrency.promises kernel threads sequences\r
 tools.test ;\r
+IN: concurrency.promises.tests\r
 \r
 [ V{ 50 50 50 } ] [\r
     0 <vector>\r
index 59518f4c8d7320d449f092345d519a24ad322048..dcd0ed9a2c8c31e07f9f52d80b3d6a9ae993affd 100644 (file)
@@ -21,13 +21,13 @@ M: negative-count-semaphore summary
 : acquire-timeout ( semaphore timeout -- )\r
     over count>> zero?\r
     [ dupd wait-to-acquire ] [ drop ] if\r
-    [ 1- ] change-count drop ;\r
+    [ 1 - ] change-count drop ;\r
 \r
 : acquire ( semaphore -- )\r
     f acquire-timeout ;\r
 \r
 : release ( semaphore -- )\r
-    [ 1+ ] change-count\r
+    [ 1 + ] change-count\r
     threads>> notify-1 ;\r
 \r
 :: with-semaphore-timeout ( semaphore timeout quot -- )\r
index 0058c8f07a6c59045d92bbc3ff2d835579df1ae2..898e4e51c804fc4a94b91e2072842115a406366a 100644 (file)
@@ -1,5 +1,5 @@
-IN: cords.tests
 USING: cords strings tools.test kernel sequences ;
+IN: cords.tests
 
 [ "hello world" ] [ "hello" " world" cord-append dup like ] unit-test
 [ "hello world" ] [ { "he" "llo" " world" } cord-concat dup like ] unit-test
diff --git a/basis/core-foundation/numbers/numbers-tests.factor b/basis/core-foundation/numbers/numbers-tests.factor
deleted file mode 100644 (file)
index 1c50f2d..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-! Copyright (C) 2009 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: tools.test core-foundation.numbers ;
-IN: core-foundation.numbers.tests
index a63a3ea6747af3ca3be40ab72fb4b2c5fa61c3c8..6446eacd08045d3cf91e9e485a0f5c8a22ad3829 100644 (file)
@@ -103,7 +103,7 @@ TUPLE: run-loop fds sources timers ;
 : (reset-timer) ( timer counter -- )
     yield {
         { [ dup 0 = ] [ now ((reset-timer)) ] }
-        { [ run-queue deque-empty? not ] [ 1- (reset-timer) ] }
+        { [ run-queue deque-empty? not ] [ 1 - (reset-timer) ] }
         { [ sleep-queue heap-empty? ] [ 5 minutes hence ((reset-timer)) ] }
         [ sleep-queue heap-peek nip micros>timestamp ((reset-timer)) ]
     } cond ;
diff --git a/basis/core-foundation/utilities/utilities-tests.factor b/basis/core-foundation/utilities/utilities-tests.factor
deleted file mode 100644 (file)
index fb3deb2..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-! Copyright (C) 2009 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: tools.test core-foundation.utilities ;
-IN: core-foundation.utilities.tests
diff --git a/basis/core-graphics/types/types-tests.factor b/basis/core-graphics/types/types-tests.factor
deleted file mode 100644 (file)
index d3b081f..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-! Copyright (C) 2009 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: tools.test core-graphics.types ;
-IN: core-graphics.types.tests
diff --git a/basis/core-text/fonts/fonts-tests.factor b/basis/core-text/fonts/fonts-tests.factor
deleted file mode 100644 (file)
index 45fa2bc..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-! Copyright (C) 2009 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: tools.test core-text.fonts ;
-IN: core-text.fonts.tests
diff --git a/basis/core-text/utilities/utilities-tests.factor b/basis/core-text/utilities/utilities-tests.factor
deleted file mode 100644 (file)
index 65914a3..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-! Copyright (C) 2009 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: tools.test core-text.utilities ;
-IN: core-text.utilities.tests
index 23b1d1e6f422d343529def975ec841d74aaee96d..6ee1c84558d8e15d16269c0d04592cf766376fca 100644 (file)
@@ -1,7 +1,7 @@
-IN: cpu.ppc.assembler.tests
 USING: cpu.ppc.assembler tools.test arrays kernel namespaces
 make vocabs sequences ;
 FROM: cpu.ppc.assembler => B ;
+IN: cpu.ppc.assembler.tests
 
 : test-assembler ( expected quot -- )
     [ 1array ] [ [ B{ } make ] curry ] bi* unit-test ;
index cbb914121ea2eb02444ca70340235d3a2c7c7fdc..c63372fa3f8d36358ccb838409637197929c0351 100644 (file)
@@ -226,7 +226,7 @@ CONSTANT: rs-reg 14
     ! key = class\r
     5 4 MR\r
     ! key &= cache.length - 1\r
-    5 5 mega-cache-size get 1- bootstrap-cell * ANDI\r
+    5 5 mega-cache-size get 1 - bootstrap-cell * ANDI\r
     ! cache += array-start-offset\r
     3 3 array-start-offset ADDI\r
     ! cache += key\r
index eba209939976772eddc28b76e16a7ee61be50077..b8e5bdbe1086801f7b85dc0652312f86c4904070 100644 (file)
@@ -214,7 +214,7 @@ M:: ppc %integer>bignum ( dst src temp -- )
         temp dst 1 bignum@ STW
         ! Compute sign
         temp src MR
-        temp temp cell-bits 1- SRAWI
+        temp temp cell-bits 1 - SRAWI
         temp temp 1 ANDI
         ! Store sign
         temp dst 2 bignum@ STW
index aeca1accce2715ccbb2b16b65e0259bc157759d6..7c832fe66c27b5be9638ea52fbd0edf4d5229bb3 100644 (file)
@@ -131,7 +131,7 @@ M:: x86.64 %box ( n rep func -- )
 M: x86.64 %box-long-long ( n func -- )
     [ int-rep ] dip %box ;
 
-: box-struct-field@ ( i -- operand ) 1+ cells param@ ;
+: box-struct-field@ ( i -- operand ) 1 + cells param@ ;
 
 : %box-struct-field ( c-type i -- )
     box-struct-field@ swap c-type-rep reg-class-of {
index 6363f17e48053eebdd0973b00735a9eb0f8cacc7..0dafc3d9c4d1cf5f84d08e8832673917a6d0b63c 100644 (file)
@@ -226,7 +226,7 @@ big-endian off
     temp2 temp1 MOV
     bootstrap-cell 8 = [ temp2 1 SHL ] when
     ! key &= cache.length - 1
-    temp2 mega-cache-size get 1- bootstrap-cell * AND
+    temp2 mega-cache-size get 1 - bootstrap-cell * AND
     ! cache += array-start-offset
     temp0 array-start-offset ADD
     ! cache += key
@@ -496,7 +496,7 @@ big-endian off
     ! make a copy
     mod-arg div-arg MOV
     ! sign-extend
-    mod-arg bootstrap-cell-bits 1- SAR
+    mod-arg bootstrap-cell-bits 1 - SAR
     ! divide
     temp3 IDIV ;
 
index 69847cacfa6166b1325ed80a3c6b884790dac225..680e6559959dff4a0bf5867fecdcddb5e9d07925 100644 (file)
@@ -1,7 +1,7 @@
-IN: cpu.x86.features.tests
 USING: cpu.x86.features tools.test kernel sequences math system ;
+IN: cpu.x86.features.tests
 
 cpu x86? [
     [ t ] [ sse2? { t f } member? ] unit-test
     [ t ] [ [ 10000 [ ] times ] count-instructions integer? ] unit-test
-] when
\ No newline at end of file
+] when
index d8fa1fae7edbd4dbe6494e5e99c38ea464984dbe..a6c958083cbc95a71dc098561264a13c972f23f9 100644 (file)
@@ -162,7 +162,7 @@ M:: x86 %integer>bignum ( dst src temp -- )
         dst 3 bignum@ src MOV
         ! Compute sign
         temp src MOV
-        temp cell-bits 1- SAR
+        temp cell-bits 1 - SAR
         temp 1 AND
         ! Store sign
         dst 2 bignum@ temp MOV
index 9e51f41ff1de63949fe0747084cb83d012aed090..e5e8097d3f54f4b4969db66a9f850fab51c9dbd5 100644 (file)
@@ -88,7 +88,7 @@ M: postgresql-statement query-results ( query -- result-set )
     dup init-result-set ;
 
 M: postgresql-result-set advance-row ( result-set -- )
-    [ 1+ ] change-n drop ;
+    [ 1 + ] change-n drop ;
 
 M: postgresql-result-set more-rows? ( result-set -- ? )
     [ n>> ] [ max>> ] bi < ;
index c4aa47d383b3a1281ff091887449bb6e6ad39be6..e9aa01feb4bb9568486c4a9b37268c247664311d 100755 (executable)
@@ -75,7 +75,7 @@ M: db-connection <update-tuple-statement> ( class -- statement )
 M: random-id-generator eval-generator ( singleton -- obj )
     drop
     system-random-generator get [
-        63 [ random-bits ] keep 1- set-bit
+        63 [ random-bits ] keep 1 - set-bit
     ] with-random ;
 
 : interval-comparison ( ? str -- str )
index 6bf8dd3075ffe24b1146605be0d17e36645b9fa8..7f109d80e03a9736286ede656991e80a9dbc5909 100644 (file)
@@ -469,7 +469,7 @@ TUPLE: bignum-test id m n o ;
     } define-persistent
     [ bignum-test drop-table ] ignore-errors
     [ ] [ bignum-test ensure-table ] unit-test
-    [ ] [ 63 2^ 1- dup dup <bignum-test> insert-tuple ] unit-test ;
+    [ ] [ 63 2^ 1 - dup dup <bignum-test> insert-tuple ] unit-test ;
 
     ! sqlite only
     ! [ T{ bignum-test f 1
index 08f84d9335b566ac3fc3c28897ed08cfc3876372..6800c83a9ca4a0df0cfa87f6c3e351fcc46083f4 100644 (file)
@@ -1,7 +1,7 @@
-IN: debugger.tests\r
 USING: debugger kernel continuations tools.test ;\r
+IN: debugger.tests\r
 \r
 [ ] [ [ drop ] [ error. ] recover ] unit-test\r
 \r
 [ f ] [ { } vm-error? ] unit-test\r
-[ f ] [ { "A" "B" } vm-error? ] unit-test
\ No newline at end of file
+[ f ] [ { "A" "B" } vm-error? ] unit-test\r
index 6c0985ce06d5a8d816faf78b23c4699b7d6efbc7..ce9496291c6ff94a4bfeb9b188087b8a48ec1006 100644 (file)
@@ -36,7 +36,7 @@ M: string error. print ;
     error-continuation get name>> assoc-stack ;
 
 : :res ( n -- * )
-    1- restarts get-global nth f restarts set-global restart ;
+    1 - restarts get-global nth f restarts set-global restart ;
 
 : :1 ( -- * ) 1 :res ;
 : :2 ( -- * ) 2 :res ;
@@ -44,7 +44,7 @@ M: string error. print ;
 
 : restart. ( restart n -- )
     [
-        1+ dup 3 <= [ ":" % # "    " % ] [ # " :res  " % ] if
+        1 + dup 3 <= [ ":" % # "    " % ] [ # " :res  " % ] if
         name>> %
     ] "" make print ;
 
@@ -92,7 +92,7 @@ HOOK: signal-error. os ( obj -- )
 
 : array-size-error. ( obj -- )
     "Invalid array size: " write dup third .
-    "Maximum: " write fourth 1- . ;
+    "Maximum: " write fourth 1 - . ;
 
 : c-string-error. ( obj -- )
     "Cannot convert to C string: " write third . ;
index 212908b2fdb0f315fd8b64ba964986d86e1eefe8..1eb916487cce6b223bcc21465a958ee441d0f750 100644 (file)
@@ -13,7 +13,7 @@ CONSTANT: signal-names
     "SIGUSR1" "SIGUSR2"
 }
 
-: signal-name ( n -- str/f ) 1- signal-names ?nth ;
+: signal-name ( n -- str/f ) 1 - signal-names ?nth ;
 
 : signal-name. ( n -- )
     signal-name [ " (" ")" surround write ] when* ;
diff --git a/basis/definitions/icons/icons-tests.factor b/basis/definitions/icons/icons-tests.factor
deleted file mode 100644 (file)
index 47e106f..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-! Copyright (C) 2009 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: tools.test definitions.icons ;
-IN: definitions.icons.tests
index 9f9aca87029a07b2fa7cb994d3e86c4ee7d04213..d9581152e1014c3f2998b396667af2f5141daca4 100644 (file)
@@ -55,8 +55,8 @@ PROTOCOL: beta three ;
 
 TUPLE: hey value ;
 C: <hey> hey
-CONSULT: alpha hey value>> 1+ ;
-CONSULT: beta hey value>> 1- ;
+CONSULT: alpha hey value>> 1 + ;
+CONSULT: beta hey value>> 1 - ;
 
 [ 2 ] [ 1 <hey> one ] unit-test
 [ 2 ] [ 1 <hey> two ] unit-test
index 74746f1a3adffd950e20a4079cc5a35a0c6777c6..cb9233343e7b37daf781a3992bd227896d461665 100644 (file)
@@ -1,5 +1,5 @@
-IN: disjoint-sets.testes
 USING: tools.test disjoint-sets namespaces slots.private ;
+IN: disjoint-sets.testes
 
 SYMBOL: +blah+
 -405534154 +blah+ 1 set-slot
index 80ab2f58bf4a0ae467bc18db6d8e940d500acd0e..05df13f07347d20ef427e2a876d8463f0502a83a 100644 (file)
@@ -30,7 +30,7 @@ TUPLE: disjoint-set
     ranks>> at ; inline
 
 : inc-rank ( a disjoint-set -- )
-    ranks>> [ 1+ ] change-at ; inline
+    ranks>> [ 1 + ] change-at ; inline
 
 : representative? ( a disjoint-set -- ? )
     dupd parent = ; inline
index 9f7f25c56ea23d7a912ece51dac2b6e85124545e..41d93c889ec4acf9c5f32b56f85f4a7f53337014 100644 (file)
@@ -1,6 +1,6 @@
-IN: documents.tests
 USING: documents documents.private accessors sequences
 namespaces tools.test make arrays kernel fry ;
+IN: documents.tests
 
 ! Tests
 
index cc2466053b8718f80b1c382990f863c796186435..b05c86c36556a7bdca5bff8e6d5aef42a5649099 100644 (file)
@@ -45,7 +45,7 @@ TUPLE: document < model locs undos redos inside-undo? ;
     [ drop ] [ doc-line length ] 2bi 2array ;
 
 : doc-lines ( from to document -- slice )
-    [ 1+ ] [ value>> ] bi* <slice> ;
+    [ 1 + ] [ value>> ] bi* <slice> ;
 
 : start-on-line ( from line# document -- n1 )
     drop over first =
@@ -67,7 +67,7 @@ TUPLE: document < model locs undos redos inside-undo? ;
     [ start-on-line ] [ end-on-line ] bi-curry bi-curry bi* ;
 
 : last-line# ( document -- line )
-    value>> length 1- ;
+    value>> length 1 - ;
 
 CONSTANT: doc-start { 0 0 }
 
@@ -84,7 +84,7 @@ CONSTANT: doc-start { 0 0 }
         over length 1 = [
             nip first2
         ] [
-            first swap length 1- + 0
+            first swap length 1 - + 0
         ] if
     ] dip last length + 2array ;
 
@@ -92,7 +92,7 @@ CONSTANT: doc-start { 0 0 }
     0 swap [ append ] change-nth ;
 
 : append-last ( str seq -- )
-    [ length 1- ] keep [ prepend ] change-nth ;
+    [ length 1 - ] keep [ prepend ] change-nth ;
 
 : loc-col/str ( loc document -- str col )
     [ first2 swap ] dip nth swap ;
@@ -103,7 +103,7 @@ CONSTANT: doc-start { 0 0 }
 
 : (set-doc-range) ( doc-lines from to lines -- changed-lines )
     [ prepare-insert ] 3keep
-    [ [ first ] bi@ 1+ ] dip
+    [ [ first ] bi@ 1 + ] dip
     replace-slice ;
 
 : entire-doc ( document -- start end document )
index 0776f8f1583dabea37e170842920d022786020d8..7ba3cb8a6eddf866f6a61e69d461c911f616958a 100644 (file)
@@ -23,14 +23,14 @@ SINGLETON: char-elt
 : prev ( loc document quot: ( loc document -- loc ) -- loc )
     {
         { [ pick { 0 0 } = ] [ 2drop ] }
-        { [ pick second zero? ] [ drop [ first 1- ] dip line-end ] }
+        { [ pick second zero? ] [ drop [ first 1 - ] dip line-end ] }
         [ call ]
     } cond ; inline
 
 : next ( loc document quot: ( loc document -- loc ) -- loc )
     {
         { [ 2over doc-end = ] [ 2drop ] }
-        { [ 2over line-end? ] [ 2drop first 1+ 0 2array ] }
+        { [ 2over line-end? ] [ 2drop first 1 + 0 2array ] }
         [ call ]
     } cond ; inline
 
@@ -73,7 +73,7 @@ SINGLETON: one-word-elt
 
 M: one-word-elt prev-elt
     drop
-    [ [ 1- ] dip f prev-word ] modify-col ;
+    [ [ 1 - ] dip f prev-word ] modify-col ;
 
 M: one-word-elt next-elt
     drop
@@ -90,7 +90,7 @@ SINGLETON: word-elt
 
 M: word-elt prev-elt
     drop
-    [ [ [ 1- ] dip blank-at? prev-word ] modify-col ]
+    [ [ [ 1 - ] dip blank-at? prev-word ] modify-col ]
     prev ;
 
 M: word-elt next-elt
index c178207e49dc85b4a3c544a9af9d95938dfc60d1..6dcf724e8ee9840065f74d9319d357bff7e220c7 100644 (file)
@@ -1,6 +1,5 @@
 USING: definitions io.launcher kernel math math.parser parser
 namespaces prettyprint editors make ;
-
 IN: editors.macvim
 
 : macvim ( file line -- )
index d27e66119346609f0fc9ef1a4d83488c2ed52967..09c7533b285e2def0e58f91208be90a210a42275 100644 (file)
@@ -1,5 +1,5 @@
-IN: eval.tests
 USING: eval tools.test ;
+IN: eval.tests
 
 [ 4 ] [ "USE: math 2 2 +" eval( -- result ) ] unit-test
 [ "USE: math 2 2 +" eval( -- ) ] must-fail
index 4acd1eeab81dcc3d2cc373b9d20b7189bbb405a0..2a1ac85de06312fffc8e526f6433ff24fc95d9fe 100644 (file)
@@ -50,7 +50,7 @@ DEFER: (parse-paragraph)
     parse-paragraph paragraph boa ;
 
 : cut-half-slice ( string i -- before after-slice )
-    [ head ] [ 1+ short tail-slice ] 2bi ;
+    [ head ] [ 1 + short tail-slice ] 2bi ;
 
 : find-cut ( string quot -- before after delimiter )
     dupd find
index c56372f023d19f337a388bd84217541c9465f91f..5710ceb985d582607ebd2f0c56cb671b584686ba 100644 (file)
@@ -1,8 +1,6 @@
 ! Copyright (C) 2008 John Benediktsson
 ! See http://factorcode.org/license.txt for BSD license
-
 USING: calendar kernel formatting tools.test ;
-
 IN: formatting.tests
 
 [ "%s" printf ] must-infer 
index f8b9ba501ba68e5c953bb0e5f7aa2f855269f2bb..40279749d64368592d9c416fb47257dae0412aa9 100644 (file)
@@ -1,11 +1,9 @@
 ! Copyright (C) 2008 John Benediktsson
 ! See http://factorcode.org/license.txt for BSD license
-
 USING: accessors arrays assocs calendar combinators fry kernel
 generalizations io io.streams.string macros math math.functions
 math.parser peg.ebnf quotations sequences splitting strings
 unicode.categories unicode.case vectors combinators.smart ;
-
 IN: formatting
 
 <PRIVATE
@@ -16,10 +14,10 @@ IN: formatting
 : fix-sign ( string -- string )
     dup CHAR: 0 swap index 0 = 
       [ dup 0 swap [ [ CHAR: 0 = not ] keep digit? and ] find-from
-         [ dup 1- rot dup [ nth ] dip swap
+         [ dup 1 - rot dup [ nth ] dip swap
             {
-               { CHAR: - [ [ 1- ] dip remove-nth "-" prepend ] }
-               { CHAR: + [ [ 1- ] dip remove-nth "+" prepend ] }
+               { CHAR: - [ [ 1 - ] dip remove-nth "-" prepend ] }
+               { CHAR: + [ [ 1 - ] dip remove-nth "+" prepend ] }
                [ drop swap drop ] 
             } case 
          ] [ drop ] if
@@ -32,15 +30,15 @@ IN: formatting
     [ "." split1 ] dip [ CHAR: 0 pad-tail ] [ head-slice ] bi "." glue ;
 
 : max-digits ( n digits -- n' )
-    10 swap ^ [ * round ] keep / ; inline
+    10^ [ * round ] keep / ; inline
 
 : >exp ( x -- exp base )
     [ 
         abs 0 swap
         [ dup [ 10.0 >= ] [ 1.0 < ] bi or ]
         [ dup 10.0 >=
-          [ 10.0 / [ 1+ ] dip ]
-          [ 10.0 * [ 1- ] dip ] if
+          [ 10.0 / [ 1 + ] dip ]
+          [ 10.0 * [ 1 - ] dip ] if
         ] while 
      ] keep 0 < [ neg ] when ;
 
@@ -140,7 +138,7 @@ MACRO: printf ( format-string -- )
 
 : (week-of-year) ( timestamp day -- n )
     [ dup clone 1 >>month 1 >>day day-of-week dup ] dip > [ 7 swap - ] when
-    [ day-of-year ] dip 2dup < [ 0 2nip ] [ - 7 / 1+ >fixnum ] if ;
+    [ day-of-year ] dip 2dup < [ 0 2nip ] [ - 7 / 1 + >fixnum ] if ;
 
 : week-of-year-sunday ( timestamp -- n ) 0 (week-of-year) ; inline
 
index 88ecae66addbb2dc29f8c7bed661c822dea6f44d..549db25e09e96e76639dbfe6fa44e411c98968b7 100644 (file)
@@ -1,6 +1,6 @@
-IN: fry.tests
 USING: fry tools.test math prettyprint kernel io arrays
 sequences eval accessors ;
+IN: fry.tests
 
 [ [ 3 + ] ] [ 3 '[ _ + ] ] unit-test
 
index d50fd9442bf72dd62baf65525f6a30e7e803b952..fd029cc329f8c61551ca0149e7ed1b1787398c99 100644 (file)
@@ -26,7 +26,7 @@ M: >r/r>-in-fry-error summary
 
 : check-fry ( quot -- quot )
     dup { load-local load-locals get-local drop-locals } intersect
-    empty? [ >r/r>-in-fry-error ] unless ;
+    [ >r/r>-in-fry-error ] unless-empty ;
 
 PREDICATE: fry-specifier < word { _ @ } memq? ;
 
@@ -42,7 +42,7 @@ GENERIC: deep-fry ( obj -- )
     check-fry
     [ [ deep-fry ] each ] [ ] make
     [ dup \ @ = [ drop [ _ call ] ] [ 1array ] if ] map concat
-    { _ } split [ spread>quot ] [ length 1- ] bi ;
+    { _ } split [ spread>quot ] [ length 1 - ] bi ;
 
 PRIVATE>
 
index 03bd21e58c379e60c5e3c5510cc0d0f59633c821..a21313312bbb173e8bd38731e4fa0cd38bd91684 100644 (file)
@@ -1,6 +1,6 @@
-IN: functors.tests
 USING: functors tools.test math words kernel multiline parser
 io.streams.string generic ;
+IN: functors.tests
 
 <<
 
diff --git a/basis/furnace/auth/auth-tests.factor b/basis/furnace/auth/auth-tests.factor
deleted file mode 100644 (file)
index 54c32e7..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-USING: furnace.auth tools.test ;
-IN: furnace.auth.tests
-
diff --git a/basis/furnace/auth/features/edit-profile/edit-profile-tests.factor b/basis/furnace/auth/features/edit-profile/edit-profile-tests.factor
deleted file mode 100644 (file)
index 996047e..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-IN: furnace.auth.features.edit-profile.tests
-USING: tools.test furnace.auth.features.edit-profile ;
-
-
diff --git a/basis/furnace/auth/features/recover-password/recover-password-tests.factor b/basis/furnace/auth/features/recover-password/recover-password-tests.factor
deleted file mode 100644 (file)
index 313b8ef..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-IN: furnace.auth.features.recover-password
-USING: tools.test furnace.auth.features.recover-password ;
-
-
diff --git a/basis/furnace/auth/features/registration/registration-tests.factor b/basis/furnace/auth/features/registration/registration-tests.factor
deleted file mode 100644 (file)
index 42acda4..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-IN: furnace.auth.features.registration.tests
-USING: tools.test furnace.auth.features.registration ;
-
-
diff --git a/basis/furnace/auth/login/login-tests.factor b/basis/furnace/auth/login/login-tests.factor
deleted file mode 100644 (file)
index aabd0c5..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-IN: furnace.auth.login.tests\r
-USING: tools.test furnace.auth.login ;\r
-\r
-\r
index 1a9784f1478d011b152d942c8b14f16ff3bb1044..c6a037cea17a86dd7fd57ce52890d7cb35fc4094 100644 (file)
@@ -1,6 +1,5 @@
 USING: accessors namespaces kernel combinators.short-circuit
 db.tuples db.types furnace.auth furnace.sessions furnace.cache ;
-
 IN: furnace.auth.login.permits
 
 TUPLE: permit < server-state session uid ;
index 8fe1dd4dd4c5d678ea7e1c640f7a030e34fd4307..44a20e7ae39688857fc8bae7f6b8b90a65d42a8c 100644 (file)
@@ -1,7 +1,7 @@
-IN: furnace.auth.providers.assoc.tests\r
 USING: furnace.actions furnace.auth furnace.auth.providers \r
 furnace.auth.providers.assoc furnace.auth.login\r
 tools.test namespaces accessors kernel ;\r
+IN: furnace.auth.providers.assoc.tests\r
 \r
 <action> "Test" <login-realm>\r
     <users-in-memory> >>users\r
index f5a79d701bc21d9d6a99d7ea3c2db8bda96aaf9d..a7a48307c999eb6f3c265d114320f303e8d3a330 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2008 Slava Pestov.\r
 ! See http://factorcode.org/license.txt for BSD license.\r
-IN: furnace.auth.providers.assoc\r
 USING: accessors assocs kernel furnace.auth.providers ;\r
+IN: furnace.auth.providers.assoc\r
 \r
 TUPLE: users-in-memory assoc ;\r
 \r
index de7650d9ef2da9accdeb6ce1343084de475f2552..f23a4a852730508aedff03b7b58568d49c368440 100644 (file)
@@ -1,4 +1,3 @@
-IN: furnace.auth.providers.db.tests\r
 USING: furnace.actions\r
 furnace.auth\r
 furnace.auth.login\r
@@ -6,6 +5,7 @@ furnace.auth.providers
 furnace.auth.providers.db tools.test\r
 namespaces db db.sqlite db.tuples continuations\r
 io.files io.files.temp io.directories accessors kernel ;\r
+IN: furnace.auth.providers.db.tests\r
 \r
 <action> "test" <login-realm> realm set\r
 \r
diff --git a/basis/furnace/db/db-tests.factor b/basis/furnace/db/db-tests.factor
deleted file mode 100644 (file)
index 15698d8..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-IN: furnace.db.tests
-USING: tools.test furnace.db ;
-
-
index 1d5aa43c7b18c99b3f1a0719d3da20c60a36becd..6fe2633031ae934eda8f2700f726371347b014d3 100644 (file)
@@ -1,7 +1,8 @@
-IN: furnace.tests
 USING: http http.server.dispatchers http.server.responses
 http.server furnace furnace.utilities tools.test kernel
 namespaces accessors io.streams.string urls xml.writer ;
+IN: furnace.tests
+
 TUPLE: funny-dispatcher < dispatcher ;
 
 : <funny-dispatcher> ( -- dispatcher ) funny-dispatcher new-dispatcher ;
index 392d43e89b355240c217170c9a00457faed32650..49311ee8913bf563666116577eadf14fab6f50fe 100644 (file)
@@ -1,10 +1,10 @@
-IN: furnace.sessions.tests\r
 USING: tools.test http furnace.sessions furnace.actions\r
 http.server http.server.responses math namespaces make kernel\r
 accessors io.sockets io.servers.connection prettyprint\r
 io.streams.string io.files io.files.temp io.directories\r
 splitting destructors sequences db db.tuples db.sqlite\r
 continuations urls math.parser furnace furnace.utilities ;\r
+IN: furnace.sessions.tests\r
 \r
 : with-session ( session quot -- )\r
     [\r
@@ -19,7 +19,7 @@ M: foo init-session* drop 0 "x" sset ;
 \r
 M: foo call-responder*\r
     2drop\r
-    "x" [ 1+ ] schange\r
+    "x" [ 1 + ] schange\r
     "x" sget number>string "text/html" <content> ;\r
 \r
 : url-responder-mock-test ( -- string )\r
@@ -73,7 +73,7 @@ M: foo call-responder*
 \r
         [ 9 ] [ "x" sget sq ] unit-test\r
 \r
-        [ ] [ "x" [ 1- ] schange ] unit-test\r
+        [ ] [ "x" [ 1 - ] schange ] unit-test\r
 \r
         [ 4 ] [ "x" sget sq ] unit-test\r
 \r
index 3cce0da575fd1cf890d9363e987ec61e7cb0f361..10f3b5d7f59eb8840e615a89aa416bb968e9b194 100644 (file)
@@ -1,8 +1,9 @@
+USING: ui game-input tools.test kernel system threads calendar
+combinators.short-circuit ;
 IN: game-input.tests
-USING: ui game-input tools.test kernel system threads calendar ;
 
-os windows? os macosx? or [
+os { [ windows? ] [ macosx? ] } 1|| [
     [ ] [ open-game-input ] unit-test
     [ ] [ 1 seconds sleep ] unit-test
     [ ] [ close-game-input ] unit-test
-] when
\ No newline at end of file
+] when
index 922906df483ffac80a4d7a029433b9c20a3c84c9..c21b900d8cf437d3a14d1262985c2a13b8aa9360 100755 (executable)
@@ -45,12 +45,12 @@ ERROR: game-input-not-open ;
     game-input-opened? [
         (open-game-input) 
     ] unless
-    game-input-opened [ 1+ ] change-global
+    game-input-opened [ 1 + ] change-global
     reset-mouse ;
 : close-game-input ( -- )
     game-input-opened [
         dup zero? [ game-input-not-open ] when
-        1-
+        1 -
     ] change-global
     game-input-opened? [
         (close-game-input) 
index 92c0c7173ae6b9d6948f307437e0c48379e42622..71d547ad29ed7521f7ac1c78678a524ea117cc9f 100755 (executable)
@@ -153,7 +153,7 @@ CONSTANT: pov-values
     IOHIDValueGetIntegerValue pov-values ?nth [ pov-neutral ] unless* ;
 
 : record-button ( state hid-value element -- )
-    [ buttons>> ] [ button-value ] [ IOHIDElementGetUsage 1- ] tri* rot set-nth ;
+    [ buttons>> ] [ button-value ] [ IOHIDElementGetUsage 1 - ] tri* rot set-nth ;
 
 : record-controller ( controller-state value -- )
     dup IOHIDValueGetElement {
index abcbd54cab9072969c2868419ac94abcab47510e..e7b3ee82525da5f74b974e6526d5290fd880039b 100644 (file)
@@ -24,20 +24,20 @@ MACRO: narray ( n -- )
     '[ _ { } nsequence ] ;
 
 MACRO: nsum ( n -- )
-    1- [ + ] n*quot ;
+    1 - [ + ] n*quot ;
 
 MACRO: firstn-unsafe ( n -- )
     [ '[ [ _ ] dip nth-unsafe ] ] map '[ _ cleave ] ;
 
 MACRO: firstn ( n -- )
     dup zero? [ drop [ drop ] ] [
-        [ 1- swap bounds-check 2drop ]
+        [ 1 - swap bounds-check 2drop ]
         [ firstn-unsafe ]
         bi-curry '[ _ _ bi ]
     ] if ;
 
 MACRO: npick ( n -- )
-    1- [ dup ] [ '[ _ dip swap ] ] repeat ;
+    1 - [ dup ] [ '[ _ dip swap ] ] repeat ;
 
 MACRO: nover ( n -- )
     dup 1 + '[ _ npick ] n*quot ;
@@ -46,10 +46,10 @@ MACRO: ndup ( n -- )
     dup '[ _ npick ] n*quot ;
 
 MACRO: nrot ( n -- )
-    1- [ ] [ '[ _ dip swap ] ] repeat ;
+    1 - [ ] [ '[ _ dip swap ] ] repeat ;
 
 MACRO: -nrot ( n -- )
-    1- [ ] [ '[ swap _ dip ] ] repeat ;
+    1 - [ ] [ '[ swap _ dip ] ] repeat ;
 
 MACRO: ndrop ( n -- )
     [ drop ] n*quot ;
@@ -91,7 +91,7 @@ MACRO: napply ( quot n -- )
     swap <repetition> spread>quot ;
 
 MACRO: mnswap ( m n -- )
-    1+ '[ _ -nrot ] swap '[ _ _ napply ] ;
+    1 + '[ _ -nrot ] swap '[ _ _ napply ] ;
 
 MACRO: nweave ( n -- )
     [ dup <reversed> [ '[ _ _ mnswap ] ] with map ] keep
index 45eb27ea62e338c433fa1abf82dcfcec8e311e7c..bdc0623d5413eb591589a8f35420f59b8c356d26 100644 (file)
@@ -1,5 +1,5 @@
-IN: globs.tests
 USING: tools.test globs ;
+IN: globs.tests
 
 [ f ] [ "abd" "fdf" glob-matches? ] unit-test
 [ f ] [ "fdsafas" "?" glob-matches? ] unit-test
index ec13e3a75083fe3e34c42c59d3e5e71007d75d4c..83579d2beb518bc00433992d1b79bff0b543a0a6 100644 (file)
@@ -18,41 +18,41 @@ GENERIC: group@ ( n groups -- from to seq )
 
 M: chunking-seq set-nth group@ <slice> 0 swap copy ;
 
-M: chunking-seq like drop { } like ;
+M: chunking-seq like drop { } like ; inline
 
 INSTANCE: chunking-seq sequence
 
 MIXIN: subseq-chunking
 
-M: subseq-chunking nth group@ subseq ;
+M: subseq-chunking nth group@ subseq ; inline
 
 MIXIN: slice-chunking
 
-M: slice-chunking nth group@ <slice> ;
+M: slice-chunking nth group@ <slice> ; inline
 
-M: slice-chunking nth-unsafe group@ slice boa ;
+M: slice-chunking nth-unsafe group@ slice boa ; inline
 
 TUPLE: abstract-groups < chunking-seq ;
 
 M: abstract-groups length
-    [ seq>> length ] [ n>> ] bi [ + 1- ] keep /i ;
+    [ seq>> length ] [ n>> ] bi [ + 1 - ] keep /i ; inline
 
 M: abstract-groups set-length
-    [ n>> * ] [ seq>> ] bi set-length ;
+    [ n>> * ] [ seq>> ] bi set-length ; inline
 
 M: abstract-groups group@
-    [ n>> [ * dup ] keep + ] [ seq>> ] bi [ length min ] keep ;
+    [ n>> [ * dup ] keep + ] [ seq>> ] bi [ length min ] keep ; inline
 
 TUPLE: abstract-clumps < chunking-seq ;
 
 M: abstract-clumps length
-    [ seq>> length ] [ n>> ] bi - 1+ ;
+    [ seq>> length ] [ n>> ] bi - 1 + ; inline
 
 M: abstract-clumps set-length
-    [ n>> + 1- ] [ seq>> ] bi set-length ;
+    [ n>> + 1 - ] [ seq>> ] bi set-length ; inline
 
 M: abstract-clumps group@
-    [ n>> over + ] [ seq>> ] bi ;
+    [ n>> over + ] [ seq>> ] bi ; inline
 
 PRIVATE>
 
@@ -100,4 +100,4 @@ INSTANCE: sliced-clumps slice-chunking
 
 : all-equal? ( seq -- ? ) [ = ] monotonic? ;
 
-: all-eq? ( seq -- ? ) [ eq? ] monotonic? ;
\ No newline at end of file
+: all-eq? ( seq -- ? ) [ eq? ] monotonic? ;
index 32ed10d8f26f6c4b043fafb83da462c746916ff5..677daca69de52e85006fbfe78c9b4388248614f2 100644 (file)
@@ -46,7 +46,7 @@ M: heap heap-size ( heap -- n )
 
 : right ( n -- m ) 1 shift 2 + ; inline
 
-: up ( n -- m ) 1- 2/ ; inline
+: up ( n -- m ) 1 - 2/ ; inline
 
 : data-nth ( n heap -- entry )
     data>> nth-unsafe ; inline
@@ -164,7 +164,7 @@ M: bad-heap-delete summary
 
 M: heap heap-delete ( entry heap -- )
     [ entry>index ] keep
-    2dup heap-size 1- = [
+    2dup heap-size 1 - = [
         nip data-pop*
     ] [
         [ nip data-pop ] 2keep
index 3dbda475de891b421c2a795709c018e5faca622e..6fa4217522590af3b737a37b80ebdb20848a8533 100644 (file)
@@ -1,4 +1,4 @@
-IN: help.apropos.tests
 USING: help.apropos tools.test ;
+IN: help.apropos.tests
 
 [ ] [ "swp" apropos ] unit-test
index 95d4612cbed90b31ca9a781605973ed7c8c31afd..4022d3bd382a2ac8ccb5fcea0d24cf8f4d50e170 100644 (file)
@@ -1,7 +1,7 @@
-IN: help.crossref.tests
 USING: help.crossref help.topics help.markup tools.test words
 definitions assocs sequences kernel namespaces parser arrays
 io.streams.string continuations debugger compiler.units eval ;
+IN: help.crossref.tests
 
 [ ] [
     "IN: help.crossref.tests USING: help.syntax help.markup ; : foo ( -- ) ; HELP: foo \"foo is great\" ; ARTICLE: \"foo\" \"Foo\" { $subsection foo } ;" eval( -- )
index 240ce672400d3a0bd451546d88d576674638625f..709d56c5d61712dfe97476118a81e259fcc1fcb4 100644 (file)
@@ -1,5 +1,5 @@
-IN: help.handbook.tests
 USING: help tools.test ;
+IN: help.handbook.tests
 
 [ ] [ "article-index" print-topic ] unit-test
 [ ] [ "primitive-index" print-topic ] unit-test
index a18dcd03f72bd4656fc4ed5f34a92e7e97722b8c..1c633600255fcc9975006396dc975395db082575 100644 (file)
@@ -288,6 +288,7 @@ ARTICLE: "handbook-tools-reference" "Developer tools"
 { $subsection "prettyprint" }
 { $subsection "inspector" }
 { $subsection "tools.annotations" }
+{ $subsection "tools.deprecation" }
 { $subsection "tools.inference" }
 { $heading "Browsing" }
 { $subsection "see" }
index e09127835977c3e1ad57387c26f2ffa5582b092b..d8c5a32f3dbd17dfd7ba76a97f2ab4f209aaf270 100644 (file)
@@ -1,6 +1,6 @@
-IN: help.tests
 USING: tools.test help kernel ;
+IN: help.tests
 
 [ 3 throw ] must-fail
 [ ] [ :help ] unit-test
-[ ] [ f print-topic ] unit-test
\ No newline at end of file
+[ ] [ f print-topic ] unit-test
index 3ba336be0bff6604596047d2f27dd96c74e04109..90ff6c110faefadb101325f9f3dc773942534d3a 100644 (file)
@@ -1,6 +1,6 @@
-IN: help.html.tests
 USING: help.html tools.test help.topics kernel ;
+IN: help.html.tests
 
 [ ] [ "xml" >link help>html drop ] unit-test
 
-[ "article-foobar.html" ] [ "foobar" >link topic>filename ] unit-test
\ No newline at end of file
+[ "article-foobar.html" ] [ "foobar" >link topic>filename ] unit-test
index f03e0b33370ae571e62f42fac670a9ae396e516e..5637dd92f450d549426c25107c78a28d0c041355 100644 (file)
@@ -1,5 +1,5 @@
-IN: help.vocabs.tests
 USING: help.vocabs tools.test help.markup help vocabs ;
+IN: help.vocabs.tests
 
 [ ] [ { $vocab "scratchpad" } print-content ] unit-test
-[ ] [ "classes" vocab print-topic ] unit-test
\ No newline at end of file
+[ ] [ "classes" vocab print-topic ] unit-test
index 6b7a6ae8cae224014a3e8ed7d8d9e78318d19c35..08d794090c06a03270e74651903a8542ae8d6cba 100644 (file)
@@ -71,7 +71,8 @@ t specialize-method? set-global
 SYNTAX: HINTS:
     scan-object dup wrapper? [ wrapped>> ] when
     [ changed-definition ]
-    [ parse-definition { } like "specializer" set-word-prop ] bi ;
+    [ subwords [ changed-definition ] each ]
+    [ parse-definition { } like "specializer" set-word-prop ] tri ;
 
 ! Default specializers
 { first first2 first3 first4 }
index c901e35e3e8262cdefeaa359f77425cdd76627d2..d1d43c762cc7d27ef34c6ef0478185db0d55c156 100644 (file)
@@ -1,9 +1,9 @@
-IN: html.components.tests
 USING: tools.test kernel io.streams.string
 io.streams.null accessors inspector html.streams
 html.components html.forms namespaces
 xml.writer ;
 FROM: html.components => inspector ;
+IN: html.components.tests
 
 [ ] [ begin-form ] unit-test
 
index 006a435cf0e8b54243a5ca7d503a5ecb36aa7084..b1596e9aa677c4dccdfdd4e595ac4d34a060a7b5 100644 (file)
@@ -1,7 +1,7 @@
-IN: html.forms.tests
 USING: kernel sequences tools.test assocs html.forms validators accessors
 namespaces ;
 FROM: html.forms => values ;
+IN: html.forms.tests
 
 : with-validation ( quot -- messages )
     [
index cc8b4f0a1595cc36566fae4b4dc08b5f2e1a5cd0..5cf318bcafd0c7b003b9377e78d42124e28e8bd9 100644 (file)
@@ -44,7 +44,7 @@ M: form clone
     [ value ] dip '[
         [
             form [ clone ] change
-            1+ "index" set-value
+            1 + "index" set-value
             "value" set-value
             @
         ] with-scope
@@ -54,7 +54,7 @@ M: form clone
     [ value ] dip '[
         [
             begin-form
-            1+ "index" set-value
+            1 + "index" set-value
             from-object
             @
         ] with-scope
index ceb2e72478d964cf5f3444f0fb6e33ff44489889..a98a21f177c2ca6ebdbaa4daf3e89a201220bec3 100644 (file)
@@ -17,7 +17,7 @@ TUPLE: template-lexer < lexer ;
 M: template-lexer skip-word
     [
         {
-            { [ 2dup nth CHAR: " = ] [ drop 1+ ] }
+            { [ 2dup nth CHAR: " = ] [ drop 1 + ] }
             { [ 2dup swap tail-slice "%>" head? ] [ drop 2 + ] }
             [ f skip ]
         } cond
index c391b417a932eaab87c5f3d6bf94009928eb4cda..7a7fcffc741d5a838971d0a9a4e4018a8cbf0209 100644 (file)
@@ -1,5 +1,6 @@
 USING: http.client http.client.private http tools.test
 namespaces urls ;
+IN: http.client.tests
 
 [ "localhost" f ] [ "localhost" parse-host ] unit-test
 [ "localhost" 8888 ] [ "localhost:8888" parse-host ] unit-test
diff --git a/basis/http/client/post-data/post-data-tests.factor b/basis/http/client/post-data/post-data-tests.factor
deleted file mode 100644 (file)
index 2704ce1..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-! Copyright (C) 2009 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: tools.test http.client.post-data ;
-IN: http.client.post-data.tests
index f87ed47f00811a6c647a1ddf2934bee03ee9b4b5..f8c3b836a6e7d0eb4f7590ab81c22eddc49d1253 100644 (file)
@@ -1,5 +1,5 @@
-IN: http.parsers.tests
 USING: http http.parsers tools.test ;
+IN: http.parsers.tests
 
 [ { } ] [ "" parse-cookie ] unit-test
 [ { } ] [ "" parse-set-cookie ] unit-test
@@ -13,4 +13,4 @@ unit-test
 
 [ { T{ cookie { name "__s" } { value "12345567" } } } ]
 [ "__s=12345567;" parse-cookie ]
-unit-test
\ No newline at end of file
+unit-test
index 72ff111db93ae2185987cee4270d1796cec90d78..d502de75b0e6d9779c9fee15d24af513cf0db190 100644 (file)
@@ -1,6 +1,6 @@
-IN: http.server.redirection.tests
 USING: http http.server.redirection urls accessors
 namespaces tools.test present kernel ;
+IN: http.server.redirection.tests
 
 [
     <request>
index d54be036984af493cb4b6db4239cca7c5abf16ae..185b0eb36194c016d12646e51b064212f432ad8a 100644 (file)
@@ -1,4 +1,4 @@
-IN: http.server.static.tests
 USING: http.server.static tools.test xml.writer ;
+IN: http.server.static.tests
 
-[ ] [ "resource:basis" directory>html write-xml ] unit-test
\ No newline at end of file
+[ ] [ "resource:basis" directory>html write-xml ] unit-test
index ca3ea8d2b456ca28988641537f1a29309938cd60..ec7a70b656eac61db3567a8e1d06a65126780b64 100644 (file)
@@ -229,8 +229,8 @@ MEMO: dct-matrix-blas ( -- m ) dct-matrix >float-blas-matrix ;
     ] with each^2 ;
 
 : sign-extend ( bits v -- v' )
-    swap [ ] [ 1- 2^ < ] 2bi
-    [ -1 swap shift 1+ + ] [ drop ] if ;
+    swap [ ] [ 1 - 2^ < ] 2bi
+    [ -1 swap shift 1 + + ] [ drop ] if ;
 
 : read1-jpeg-dc ( decoder -- dc )
     [ read1-huff dup ] [ bs>> bs:read ] bi sign-extend ;
@@ -245,7 +245,7 @@ MEMO: dct-matrix-blas ( -- m ) dct-matrix >float-blas-matrix ;
     0 :> k!
     [
         color ac-huff-table>> read1-jpeg-ac
-        [ first 1+ k + k! ] [ second k coefs set-nth ] [ ] tri
+        [ first 1 + k + k! ] [ second k coefs set-nth ] [ ] tri
         { 0 0 } = not
         k 63 < and
     ] loop
index b94266282cf057ee19d048bb79d14bf8adfe6bfd..e9130a3c40c6b82828c11fe52c6da85b82afe8d6 100644 (file)
@@ -58,7 +58,7 @@ PRIVATE>
     [\r
         alist sort-keys unclip swap [ [ first dup ] [ second ] bi ] dip\r
         [| oldkey oldval key val | ! Underneath is start\r
-            oldkey 1+ key =\r
+            oldkey 1 + key =\r
             oldval val = and\r
             [ oldkey 2array oldval 2array , key ] unless\r
             key val\r
index 51ab6f27d9782e6b2eb04d28e285f25ff057fbfa..571957cf4c9d23465b243229526793cfd4d20ee0 100644 (file)
@@ -21,7 +21,7 @@ C: <foo> foo
 
 : something ( array -- num )
     {
-        { [ dup 1+ 2array ] [ 3 * ] }
+        { [ dup 1 + 2array ] [ 3 * ] }
         { [ 3array ] [ + + ] }
     } switch ;
 
@@ -92,5 +92,5 @@ TUPLE: funny-tuple ;
 
 [ ] [ [ <funny-tuple> ] [undo] drop ] unit-test
 
-[ 0 ] [ { 1 2 } [ [ 1+ 2 ] { } output>sequence ] undo ] unit-test
-[ { 0 1 } ] [ 1 2 [ [ [ 1+ ] bi@ ] input<sequence ] undo ] unit-test
+[ 0 ] [ { 1 2 } [ [ 1 + 2 ] { } output>sequence ] undo ] unit-test
+[ { 0 1 } ] [ 1 2 [ [ [ 1 + ] bi@ ] input<sequence ] undo ] unit-test
index 7a9e821b37740a2ce9a1fdd45a632f2ab7acb678..6b1e839ca6d47173c0b15907c9b314e369683983 100755 (executable)
@@ -295,4 +295,4 @@ M: no-match summary drop "Fall through in switch" ;
     reverse [ [ [undo] ] dip compose ] { } assoc>map
     recover-chain ;
 
-MACRO: switch ( quot-alist -- ) [switch] ;
\ No newline at end of file
+MACRO: switch ( quot-alist -- ) [switch] ;
index 7d0acb4140a3f8d0ceeaba0542febb14d22d3028..8022ed34e223f899cb302486d63efa795b3e2368 100644 (file)
@@ -40,7 +40,7 @@ TUPLE: select-mx < mx read-fdset write-fdset ;
     dup assoc-empty? [ drop 0 ] [ keys supremum ] if ;
 
 : num-fds ( mx -- n )
-    [ reads>> max-fd ] [ writes>> max-fd ] bi max 1+ ;
+    [ reads>> max-fd ] [ writes>> max-fd ] bi max 1 + ;
 
 : init-fdsets ( mx -- nfds read write except )
     [ num-fds ]
index 7237651b8003345be1f0049a554ab06a00f39bdd..a66b2aad7a00b50f288539863309356e0ac6d798 100755 (executable)
@@ -1,4 +1,4 @@
-IN: io.backend.windows.privileges.tests\r
 USING: io.backend.windows.privileges tools.test ;\r
+IN: io.backend.windows.privileges.tests\r
 \r
 [ [ ] with-privileges ] must-infer\r
index 2e9aac2ac9deb30de09baf4aa30f9aa312d51eae..fde5cf9b12bd12131c1df5ca99e868226dc50b3c 100755 (executable)
@@ -4,23 +4,36 @@ USING: alien alien.c-types arrays destructors io io.backend
 io.buffers io.files io.ports io.binary io.timeouts system
 strings kernel math namespaces sequences windows.errors
 windows.kernel32 windows.shell32 windows.types windows.winsock
-splitting continuations math.bitwise accessors ;
+splitting continuations math.bitwise accessors init sets assocs ;
 IN: io.backend.windows
 
+: win32-handles ( -- assoc )
+    \ win32-handles [ H{ } clone ] initialize-alien ;
+
+TUPLE: win32-handle < identity-tuple handle disposed ;
+
+M: win32-handle hashcode* handle>> hashcode* ;
+
 : set-inherit ( handle ? -- )
-    [ HANDLE_FLAG_INHERIT ] dip
+    [ handle>> HANDLE_FLAG_INHERIT ] dip
     >BOOLEAN SetHandleInformation win32-error=0/f ;
 
-TUPLE: win32-handle handle disposed ;
-
 : new-win32-handle ( handle class -- win32-handle )
-    new swap [ >>handle ] [ f set-inherit ] bi ;
+    new swap >>handle
+    dup f set-inherit
+    dup win32-handles conjoin ;
 
 : <win32-handle> ( handle -- win32-handle )
     win32-handle new-win32-handle ;
 
+ERROR: disposing-twice ;
+
+: unregister-handle ( handle -- )
+    win32-handles delete-at*
+    [ t >>disposed drop ] [ disposing-twice ] if ;
+
 M: win32-handle dispose* ( handle -- )
-    handle>> CloseHandle drop ;
+    [ unregister-handle ] [ handle>> CloseHandle win32-error=0/f ] bi ;
 
 TUPLE: win32-file < win32-handle ptr ;
 
index 1654cb8b833a17d39a9c206c0df59ba9f35fccb0..00d3bc7509052385481bda70c98b2c7fb3f8c760 100644 (file)
@@ -5,7 +5,7 @@ IN: io.encodings.ascii
 
 <PRIVATE
 : encode-if< ( char stream encoding max -- )
-    nip 1- pick < [ encode-error ] [ stream-write1 ] if ; inline
+    nip 1 - pick < [ encode-error ] [ stream-write1 ] if ; inline
 
 : decode-if< ( stream encoding max -- character )
     nip swap stream-read1 dup
@@ -16,7 +16,7 @@ PRIVATE>
 SINGLETON: ascii
 
 M: ascii encode-char
-    128 encode-if< ;
+    128 encode-if< ; inline
 
 M: ascii decode-char
-    128 decode-if< ;
\ No newline at end of file
+    128 decode-if< ; inline
index 81e43f8dd9cd0dd5d2655b7a34f56e926c30e770..38165e4267819d36c9e61c546afa7dc2aa0a1601 100755 (executable)
@@ -9,11 +9,11 @@ calendar ascii combinators.short-circuit locals ;
 IN: io.files.info.windows
 
 :: round-up-to ( n multiple -- n' )
-    n multiple rem dup 0 = [
-        drop n
+    n multiple rem [
+        n
     ] [
         multiple swap - n +
-    ] if ;
+    ] if-zero ;
 
 TUPLE: windows-file-info < file-info attributes ;
 
@@ -109,11 +109,11 @@ M: windows link-info ( path -- info )
     file-info ;
 
 : volume-information ( normalized-path -- volume-name volume-serial max-component flags type )
-    MAX_PATH 1+ [ <byte-array> ] keep
+    MAX_PATH 1 + [ <byte-array> ] keep
     "DWORD" <c-object>
     "DWORD" <c-object>
     "DWORD" <c-object>
-    MAX_PATH 1+ [ <byte-array> ] keep
+    MAX_PATH 1 + [ <byte-array> ] keep
     [ GetVolumeInformation win32-error=0/f ] 7 nkeep
     drop 5 nrot drop
     [ utf16n alien>string ] 4 ndip
@@ -165,13 +165,13 @@ M: winnt file-system-info ( path -- file-system-info )
     ] if ;
 
 : find-first-volume ( -- string handle )
-    MAX_PATH 1+ [ <byte-array> ] keep
+    MAX_PATH 1 + [ <byte-array> ] keep
     dupd
     FindFirstVolume dup win32-error=0/f
     [ utf16n alien>string ] dip ;
 
 : find-next-volume ( handle -- string/f )
-    MAX_PATH 1+ [ <byte-array> tuck ] keep
+    MAX_PATH 1 + [ <byte-array> tuck ] keep
     FindNextVolume 0 = [
         GetLastError ERROR_NO_MORE_FILES =
         [ drop f ] [ win32-error-string throw ] if
index 7aec916c72086977809a0e4f6a8a6e97acdd62bf..38bcc86cc6b00fbb8a9cae6a46ddf075d9ea13e2 100644 (file)
@@ -28,7 +28,7 @@ ERROR: too-many-symlinks path n ;
 : (follow-links) ( n path -- path' )
     over 0 = [ symlink-depth get too-many-symlinks ] when
     dup link-info type>> +symbolic-link+ =
-    [ [ 1- ] [ follow-link ] bi* (follow-links) ]
+    [ [ 1 - ] [ follow-link ] bi* (follow-links) ]
     [ nip ] if ; inline recursive
 
 PRIVATE>
index dd5eb5c8d912872e97baaa47d0744147fe767133..ef7d778abe7ae439b2ce4c35e6a81bc66b92b15c 100644 (file)
@@ -4,7 +4,7 @@ io.pathnames namespaces ;
 IN: io.files.links.unix.tests
 
 : make-test-links ( n path -- )
-    [ '[ [ 1+ ] keep [ number>string _ prepend ] bi@ make-link ] each ]
+    [ '[ [ 1 + ] keep [ number>string _ prepend ] bi@ make-link ] each ]
     [ [ number>string ] dip prepend touch-file ] 2bi ; inline
 
 [ t ] [
index 444ba98c7ded16e78ad363d9890f7a88a0ec0f48..43463bd3f109d25f538f2da6c7d75ec78a42cc90 100755 (executable)
@@ -47,10 +47,8 @@ IN: io.files.windows
     GetLastError ERROR_ALREADY_EXISTS = not ;
 
 : set-file-pointer ( handle length method -- )
-    [ dupd d>w/w <uint> ] dip SetFilePointer
-    INVALID_SET_FILE_POINTER = [
-        CloseHandle "SetFilePointer failed" throw
-    ] when drop ;
+    [ [ handle>> ] dip d>w/w <uint> ] dip SetFilePointer
+    INVALID_SET_FILE_POINTER = [ "SetFilePointer failed" throw ] when ;
 
 HOOK: open-append os ( path -- win32-file )
 
index 4587556e0c2692710c5b39ce3a191106e5666d72..f57f7b6d478a57db28d9156f9bf59f822b1fbaff 100755 (executable)
@@ -164,4 +164,19 @@ IN: io.launcher.windows.nt.tests
     "append-test" temp-file ascii file-contents
 ] unit-test
 
+[ "( scratchpad ) " ] [
+    console-vm "-run=listener" 2array
+    ascii [ "USE: system 0 exit" print flush readln ] with-process-stream
+] unit-test
+
+[ ] [
+    console-vm "-run=listener" 2array
+    ascii [ "USE: system 0 exit" print ] with-process-writer
+] unit-test
 
+[ ] [
+    <process>
+    console-vm "-run=listener" 2array >>command
+    "vocab:io/launcher/windows/nt/test/input.txt" >>stdin
+    try-process
+] unit-test
index 5ebb38abc27c599921aab563b3d778ea725ee581..e62373cbd7a9ee0def201fbadfead900a2092b63 100755 (executable)
@@ -10,21 +10,21 @@ IN: io.launcher.windows.nt
 
 : duplicate-handle ( handle -- handle' )
     GetCurrentProcess ! source process
-    swap ! handle
+    swap handle>> ! handle
     GetCurrentProcess ! target process
     f <void*> [ ! target handle
         DUPLICATE_SAME_ACCESS ! desired access
         TRUE ! inherit handle
-        DUPLICATE_CLOSE_SOURCE ! options
+        0 ! options
         DuplicateHandle win32-error=0/f
-    ] keep *void* ;
+    ] keep *void* <win32-handle> &dispose ;
 
 ! /dev/null simulation
 : null-input ( -- pipe )
-    (pipe) [ in>> handle>> ] [ out>> dispose ] bi ;
+    (pipe) [ in>> &dispose ] [ out>> dispose ] bi ;
 
 : null-output ( -- pipe )
-    (pipe) [ in>> dispose ] [ out>> handle>> ] bi ;
+    (pipe) [ in>> dispose ] [ out>> &dispose ] bi ;
 
 : null-pipe ( mode -- pipe )
     {
@@ -49,7 +49,7 @@ IN: io.launcher.windows.nt
     create-mode
     FILE_ATTRIBUTE_NORMAL ! flags and attributes
     f ! template file
-    CreateFile dup invalid-handle? <win32-file> &dispose handle>> ;
+    CreateFile dup invalid-handle? <win32-file> &dispose ;
 
 : redirect-append ( path access-mode create-mode -- handle )
     [ path>> ] 2dip
@@ -58,10 +58,10 @@ IN: io.launcher.windows.nt
     dup 0 FILE_END set-file-pointer ;
 
 : redirect-handle ( handle access-mode create-mode -- handle )
-    2drop handle>> duplicate-handle ;
+    2drop ;
 
 : redirect-stream ( stream access-mode create-mode -- handle )
-    [ underlying-handle handle>> ] 2dip redirect-handle ;
+    [ underlying-handle ] 2dip redirect-handle ;
 
 : redirect ( obj access-mode create-mode -- handle )
     {
@@ -72,7 +72,7 @@ IN: io.launcher.windows.nt
         { [ pick win32-file? ] [ redirect-handle ] }
         [ redirect-stream ]
     } cond
-    dup [ dup t set-inherit ] when ;
+    dup [ dup t set-inherit handle>> ] when ;
 
 : redirect-stdout ( process args -- handle )
     drop
diff --git a/basis/io/launcher/windows/nt/test/input.txt b/basis/io/launcher/windows/nt/test/input.txt
new file mode 100755 (executable)
index 0000000..99c3cc6
--- /dev/null
@@ -0,0 +1 @@
+USE: system 0 exit\r
index 7de6c25a135fb3b8de86994167ceb0817f59910c..d17cd1ff805965297df3a60c50185c9cc693ad3a 100755 (executable)
@@ -47,7 +47,7 @@ TUPLE: CreateProcess-args
 
 : count-trailing-backslashes ( str n -- str n )
     [ "\\" ?tail ] dip swap [
-        1+ count-trailing-backslashes
+        1 + count-trailing-backslashes
     ] when ;
 
 : fix-trailing-backslashes ( str -- str' )
index db8e02ae73881f739156f3ed6e9f612096dbc02a..7329e73a8007bfb9c14b1e4ac7f43134dae82909 100644 (file)
@@ -14,13 +14,13 @@ SYMBOL: dummy-monitor-disposed
 TUPLE: dummy-monitor < monitor ;
 
 M: dummy-monitor dispose
-    drop dummy-monitor-disposed get [ 1+ ] change-i drop ;
+    drop dummy-monitor-disposed get [ 1 + ] change-i drop ;
 
 M: mock-io-backend (monitor)
     nip
     over exists? [
         dummy-monitor new-monitor
-        dummy-monitor-created get [ 1+ ] change-i drop
+        dummy-monitor-created get [ 1 + ] change-i drop
     ] [
         "Does not exist" throw
     ] if ;
index c15663b0319c714e5ebaa09552b37d1f1a3a2f8c..8d747086a7b1a32f7367e0388f14c4ec4b856980 100644 (file)
@@ -47,7 +47,7 @@ M: callable run-pipeline-element
 PRIVATE>
 
 : run-pipeline ( seq -- results )
-    [ length dup zero? [ drop { } ] [ 1- <pipes> ] if ] keep
+    [ length dup zero? [ drop { } ] [ 1 - <pipes> ] if ] keep
     [
         [ [ first in>> ] [ second out>> ] bi ] dip
         run-pipeline-element
index e72b267c04849acfb2d0f2a90e6e6281dc7b54f4..07246354e3e98871ecb01acd14ecd76cc52240a9 100644 (file)
@@ -36,7 +36,7 @@ TUPLE: openssl-context < secure-context aliens sessions ;
         password [ B{ 0 } password! ] unless
 
         [let | len [ password strlen ] |
-            buf password len 1+ size min memcpy
+            buf password len 1 + size min memcpy
             len
         ]
     ] alien-callback ;
index fe136cd88732b63636a410f0d9ad228944d109fe..ec8b4206e3c1d2c82302e23701a0fc1013903e4c 100644 (file)
@@ -19,7 +19,7 @@ IN: io.sockets.unix
     [ handle-fd ] 2dip 1 <int> "int" heap-size setsockopt io-error ;
 
 M: unix addrinfo-error ( n -- )
-    dup zero? [ drop ] [ gai_strerror throw ] if ;
+    [ gai_strerror throw ] unless-zero ;
 
 ! Client sockets - TCP and Unix domain
 M: object (get-local-address) ( handle remote -- sockaddr )
index ab4fbd60bb9fdbdf2c7b2daa5ab7768f18b3a950..aabd4bbafcd6e84d55d4dbb7e008e197b30ecf0d 100644 (file)
@@ -5,18 +5,18 @@ IN: lcs
 \r
 <PRIVATE\r
 : levenshtein-step ( insert delete change same? -- next )\r
-    0 1 ? + [ [ 1+ ] bi@ ] dip min min ;\r
+    0 1 ? + [ [ 1 + ] bi@ ] dip min min ;\r
 \r
 : lcs-step ( insert delete change same? -- next )\r
     1 -1/0. ? + max max ; ! -1/0. is -inf (float)\r
 \r
 :: loop-step ( i j matrix old new step -- )\r
-    i j 1+ matrix nth nth ! insertion\r
-    i 1+ j matrix nth nth ! deletion\r
+    i j 1 + matrix nth nth ! insertion\r
+    i 1 + j matrix nth nth ! deletion\r
     i j matrix nth nth ! replace/retain\r
     i old nth j new nth = ! same?\r
     step call\r
-    i 1+ j 1+ matrix nth set-nth ; inline\r
+    i 1 + j 1 + matrix nth set-nth ; inline\r
 \r
 : lcs-initialize ( |str1| |str2| -- matrix )\r
     [ drop 0 <array> ] with map ;\r
@@ -25,7 +25,7 @@ IN: lcs
     [ [ + ] curry map ] with map ;\r
 \r
 :: run-lcs ( old new init step -- matrix )\r
-    [let | matrix [ old length 1+ new length 1+ init call ] |\r
+    [let | matrix [ old length 1 + new length 1 + init call ] |\r
         old length [| i |\r
             new length\r
             [| j | i j matrix old new step loop-step ] each\r
@@ -44,14 +44,14 @@ TUPLE: insert item ;
 TUPLE: trace-state old new table i j ;\r
 \r
 : old-nth ( state -- elt )\r
-    [ i>> 1- ] [ old>> ] bi nth ;\r
+    [ i>> 1 - ] [ old>> ] bi nth ;\r
 \r
 : new-nth ( state -- elt )\r
-    [ j>> 1- ] [ new>> ] bi nth ;\r
+    [ j>> 1 - ] [ new>> ] bi nth ;\r
 \r
 : top-beats-side? ( state -- ? )\r
-    [ [ i>> ] [ j>> 1- ] [ table>> ] tri nth nth ]\r
-    [ [ i>> 1- ] [ j>> ] [ table>> ] tri nth nth ] bi > ;\r
+    [ [ i>> ] [ j>> 1 - ] [ table>> ] tri nth nth ]\r
+    [ [ i>> 1 - ] [ j>> ] [ table>> ] tri nth nth ] bi > ;\r
 \r
 : retained? ( state -- ? )\r
     {\r
@@ -61,7 +61,7 @@ TUPLE: trace-state old new table i j ;
 \r
 : do-retain ( state -- state )\r
     dup old-nth retain boa ,\r
-    [ 1- ] change-i [ 1- ] change-j ;\r
+    [ 1 - ] change-i [ 1 - ] change-j ;\r
 \r
 : inserted? ( state -- ? )\r
     {\r
@@ -70,7 +70,7 @@ TUPLE: trace-state old new table i j ;
     } 1&& ;\r
 \r
 : do-insert ( state -- state )\r
-    dup new-nth insert boa , [ 1- ] change-j ;\r
+    dup new-nth insert boa , [ 1 - ] change-j ;\r
 \r
 : deleted? ( state -- ? )\r
     {\r
@@ -79,7 +79,7 @@ TUPLE: trace-state old new table i j ;
     } 1&& ;\r
 \r
 : do-delete ( state -- state )\r
-    dup old-nth delete boa , [ 1- ] change-i ;\r
+    dup old-nth delete boa , [ 1 - ] change-i ;\r
 \r
 : (trace-diff) ( state -- )\r
     {\r
@@ -90,7 +90,7 @@ TUPLE: trace-state old new table i j ;
     } cond ;\r
 \r
 : trace-diff ( old new table -- diff )\r
-    [ ] [ first length 1- ] [ length 1- ] tri trace-state boa\r
+    [ ] [ first length 1 - ] [ length 1 - ] tri trace-state boa\r
     [ (trace-diff) ] { } make reverse ;\r
 PRIVATE>\r
 \r
index 5030e93abc955492392a6f5b6e813ec4b2153257..603b04e895e0d6df74e15cb5180b86f3cc58dde8 100644 (file)
@@ -50,8 +50,8 @@ IN: linked-assocs.test
 
 { 9 } [
     <linked-hash>
-    { [ 3 * ] [ 1- ] }          "first"   pick set-at
-    { [ [ 1- ] bi@ ] [ 2 / ] }  "second"  pick set-at
+    { [ 3 * ] [ 1 - ] }          "first"   pick set-at
+    { [ [ 1 - ] bi@ ] [ 2 / ] }  "second"  pick set-at
     4 6 pick values [ first call ] each
     + swap values <reversed> [ second call ] each
 ] unit-test
@@ -62,4 +62,4 @@ IN: linked-assocs.test
     2 "by" pick set-at
     3 "cx" pick set-at
     >alist
-] unit-test
\ No newline at end of file
+] unit-test
index bde26e2fb9cff2fa06cf4b09f5a371bdb2b0d46d..7b386e9c819ea1acfc93988b97227fcfb8666355 100644 (file)
@@ -97,7 +97,7 @@ M: lazy-take car ( lazy-take -- car )
     cons>> car ;
 
 M: lazy-take cdr ( lazy-take -- cdr )
-    [ n>> 1- ] keep
+    [ n>> 1 - ] keep
     cons>> cdr ltake ;
 
 M: lazy-take nil? ( lazy-take -- ? )
@@ -191,7 +191,7 @@ TUPLE: lazy-from-by n quot ;
 C: lfrom-by lazy-from-by
 
 : lfrom ( n -- list )
-    [ 1+ ] lfrom-by ;
+    [ 1 + ] lfrom-by ;
 
 M: lazy-from-by car ( lazy-from-by -- car )
     n>> ;
@@ -235,7 +235,7 @@ M: sequence-cons car ( sequence-cons -- car )
     [ index>> ] [ seq>> nth ] bi ;
 
 M: sequence-cons cdr ( sequence-cons -- cdr )
-    [ index>> 1+ ] [ seq>> sequence-tail>list ] bi ;
+    [ index>> 1 + ] [ seq>> sequence-tail>list ] bi ;
 
 M: sequence-cons nil? ( sequence-cons -- ? )
     drop f ;
index e34a719c57835a25ebfd610bcd719cd59c53fe2c..d2f969cddc62236632ef8a848959d65f25b38517 100644 (file)
@@ -24,7 +24,7 @@ IN: lists.tests
 ] unit-test
     
 { T{ cons f 2 T{ cons f 3 T{ cons f 4 T{ cons f 5 +nil+ } } } } } [
-    { 1 2 3 4 } sequence>list [ 1+ ] lmap
+    { 1 2 3 4 } sequence>list [ 1 + ] lmap
 ] unit-test
     
 { 15 } [
index 0eedb808891605748f2857c2d0c1d4bb9d4dcad0..ddf1ab91098e2e7abab454a4424775fbc4af404b 100644 (file)
@@ -71,7 +71,7 @@ PRIVATE>
     ] if ; inline recursive
 
 : llength ( list -- n )
-    0 [ drop 1+ ] foldl ;
+    0 [ drop 1 + ] foldl ;
 
 : lreverse ( list -- newlist )    
     nil [ swap cons ] foldl ;
index 9ec8e30133f5df95d918eaabc0a965e2d59f2943..1caa4b746fa59947e0822cac7c88b0ee020a4bf9 100644 (file)
@@ -38,7 +38,7 @@ USING: kernel literals math prettyprint ;
 IN: scratchpad
 
 << CONSTANT: five 5 >>
-{ $[ five dup 1+ dup 2 + ] } .
+{ $[ five dup 1 + dup 2 + ] } .
     "> "{ 5 6 8 }" }
 
 } ;
@@ -69,7 +69,7 @@ USE: literals
 IN: scratchpad
 
 CONSTANT: five 5
-{ $ five $[ five dup 1+ dup 2 + ] } .
+{ $ five $[ five dup 1 + dup 2 + ] } .
     "> "{ 5 5 6 8 }" }
 { $subsection POSTPONE: $ }
 { $subsection POSTPONE: $[ }
index b1f0b6ca1732b3d59b6092d32b665c1d04d08ea2..0f94e0591a675fcf4448fbd6d1e762fc2d8ed7e2 100644 (file)
@@ -175,8 +175,8 @@ $nl
 { $code
     ":: counter ( -- )"
     "    [let | value! [ 0 ] |"
-    "        [ value 1+ dup value! ]"
-    "        [ value 1- dup value! ] ] ;"
+    "        [ value 1 + dup value! ]"
+    "        [ value 1 - dup value! ] ] ;"
 }
 "Mutable bindings are implemented in a manner similar to the ML language; each mutable binding is actually an immutable binding of a mutable cell (in Factor's case, a 1-element array); reading the binding automatically dereferences the array, and writing to the binding stores into the array."
 $nl
index 414b2da45c96cfb049bc3ce9ebb9ec8ff72bfb54..63b6d68feb3a4131eb5ed4415711ad754c67c48a 100644 (file)
@@ -199,23 +199,23 @@ DEFER: xyzzy
 [ 5 ] [ 10 xyzzy ] unit-test
 
 :: let*-test-1 ( a -- b )
-    [let* | b [ a 1+ ]
-            c [ b 1+ ] |
+    [let* | b [ a 1 + ]
+            c [ b 1 + ] |
         a b c 3array ] ;
 
 [ { 1 2 3 } ] [ 1 let*-test-1 ] unit-test
 
 :: let*-test-2 ( a -- b )
-    [let* | b [ a 1+ ]
-            c! [ b 1+ ] |
+    [let* | b [ a 1 + ]
+            c! [ b 1 + ] |
         a b c 3array ] ;
 
 [ { 1 2 3 } ] [ 1 let*-test-2 ] unit-test
 
 :: let*-test-3 ( a -- b )
-    [let* | b [ a 1+ ]
-            c! [ b 1+ ] |
-        c 1+ c!  a b c 3array ] ;
+    [let* | b [ a 1 + ]
+            c! [ b 1 + ] |
+        c 1 + c!  a b c 3array ] ;
 
 [ { 1 2 4 } ] [ 1 let*-test-3 ] unit-test
 
@@ -502,7 +502,7 @@ M:: integer lambda-method-forget-test ( a -- b ) a ;
 
 [ 3 ] [ 3 [| | :> a! a ] call ] unit-test
 
-[ 3 ] [ 2 [| | :> a! a 1+ a! a ] call ] unit-test
+[ 3 ] [ 2 [| | :> a! a 1 + a! a ] call ] unit-test
 
 :: wlet-&&-test ( a -- ? )
     [wlet | is-integer? [ a integer? ]
index 8374ab421bd214dfcd4ea71c0ee3b8815a923bd4..848ad5d40e8d160b8001d780c4ff3e7b189b5e74 100644 (file)
@@ -74,7 +74,7 @@ CONSTANT: keep-logs 10
     over exists? [ move-file ] [ 2drop ] if ;\r
 \r
 : advance-log ( path n -- )\r
-    [ 1- log# ] 2keep log# ?move-file ;\r
+    [ 1 - log# ] 2keep log# ?move-file ;\r
 \r
 : rotate-log ( service -- )\r
     dup close-log\r
index 0fbfdf0bd948df160a6db96cddbcc87081f26471..4de49c06a7b1455fc25fb6d22a5368dfbd5a8eb0 100644 (file)
@@ -7,13 +7,13 @@ TUPLE: bits { number read-only } { length read-only } ;
 C: <bits> bits
 
 : make-bits ( number -- bits )
-    dup zero? [ drop T{ bits f 0 0 } ] [ dup abs log2 1 + <bits> ] if ; inline
+    [ T{ bits f 0 0 } ] [ dup abs log2 1 + <bits> ] if-zero ; inline
 
-M: bits length length>> ;
+M: bits length length>> ; inline
 
-M: bits nth-unsafe number>> swap bit? ;
+M: bits nth-unsafe number>> swap bit? ; inline
 
 INSTANCE: bits immutable-sequence
 
 : unbits ( seq -- number )
-    <reversed> 0 [ [ 1 shift ] dip [ 1+ ] when ] reduce ;
+    <reversed> 0 [ [ 1 shift ] dip [ 1 + ] when ] reduce ;
index e10853af183482904fbf7a7a910fd8365aebeaf1..d1e6c11b6c900a84e2a73afd1f4620d3335156fa 100644 (file)
@@ -17,7 +17,8 @@ IN: math.bitwise.tests
 [ 256 ] [ 1 { 8 } bitfield ] unit-test
 [ 268 ] [ 3 1 { 8 2 } bitfield ] unit-test
 [ 268 ] [ 1 { 8 { 3 2 } } bitfield ] unit-test
-[ 512 ] [ 1 { { 1+ 8 } } bitfield ] unit-test
+: test-1+ ( x -- y ) 1 + ;
+[ 512 ] [ 1 { { test-1+ 8 } } bitfield ] unit-test
 
 CONSTANT: a 1
 CONSTANT: b 2
index 041539c9815c2aaa82611688731e7f0df1ae3239..0e0b7ae1677f007e24a1680502aed5fada88b3d1 100644 (file)
@@ -28,7 +28,7 @@ HELP: nCk
 HELP: permutation
 { $values { "n" "a non-negative integer" } { "seq" sequence } { "seq" sequence } }
 { $description "Outputs the " { $snippet "nth" } " lexicographical permutation of " { $snippet "seq" } "." }
-{ $notes "Permutations are 0-based and a bounds error will be thrown if " { $snippet "n" } " is larger than " { $snippet "seq length factorial 1-" } "." }
+{ $notes "Permutations are 0-based and a bounds error will be thrown if " { $snippet "n" } " is larger than " { $snippet "seq length factorial 1 -" } "." }
 { $examples
     { $example "USING: math.combinatorics prettyprint ;"
         "1 3 permutation ." "{ 0 2 1 }" }
index 832a9e64baf9db08cf7921f8aaafc1c3661160d2..ce94dfaca886a0c4e87699bc6c7defee2c2a747e 100644 (file)
@@ -5,29 +5,29 @@ math.libm math.functions arrays math.functions.private sequences
 parser ;
 IN: math.complex.private
 
-M: real real-part ;
-M: real imaginary-part drop 0 ;
-M: complex real-part real>> ;
-M: complex imaginary-part imaginary>> ;
-M: complex absq >rect [ sq ] bi@ + ;
-M: complex hashcode* nip >rect [ hashcode ] bi@ bitxor ;
+M: real real-part ; inline
+M: real imaginary-part drop 0 ; inline
+M: complex real-part real>> ; inline
+M: complex imaginary-part imaginary>> ; inline
+M: complex absq >rect [ sq ] bi@ + ; inline
+M: complex hashcode* nip >rect [ hashcode ] bi@ bitxor ; inline
 : componentwise ( x y quot -- a b ) [ [ >rect ] bi@ ] dip bi-curry@ bi* ; inline
 : complex= ( x y quot -- ? ) componentwise and ; inline
-M: complex equal? over complex? [ [ = ] complex= ] [ 2drop f ] if ;
-M: complex number= [ number= ] complex= ;
+M: complex equal? over complex? [ [ = ] complex= ] [ 2drop f ] if ; inline
+M: complex number= [ number= ] complex= ; inline
 : complex-op ( x y quot -- z ) componentwise rect> ; inline
-M: complex + [ + ] complex-op ;
-M: complex - [ - ] complex-op ;
+M: complex + [ + ] complex-op ; inline
+M: complex - [ - ] complex-op ; inline
 : *re ( x y -- xr*yr xi*yi ) [ >rect ] bi@ [ * ] bi-curry@ bi* ; inline
 : *im ( x y -- xi*yr xr*yi ) swap [ >rect ] bi@ swap [ * ] bi-curry@ bi* ; inline
-M: complex * [ *re - ] [ *im + ] 2bi rect> ;
+M: complex * [ *re - ] [ *im + ] 2bi rect> ; inline
 : (complex/) ( x y -- r i m ) [ [ *re + ] [ *im - ] 2bi ] keep absq ; inline
 : complex/ ( x y quot -- z ) [ (complex/) ] dip curry bi@ rect> ; inline
-M: complex / [ / ] complex/ ;
-M: complex /f [ /f ] complex/ ;
-M: complex /i [ /i ] complex/ ;
-M: complex abs absq >float fsqrt ;
-M: complex sqrt >polar [ fsqrt ] [ 2.0 / ] bi* polar> ;
+M: complex / [ / ] complex/ ; inline
+M: complex /f [ /f ] complex/ ; inline
+M: complex /i [ /i ] complex/ ; inline
+M: complex abs absq >float fsqrt ; inline
+M: complex sqrt >polar [ fsqrt ] [ 2.0 / ] bi* polar> ; inline
 
 IN: syntax
 
index 41800e46dafdcf514afa4ff15d6f1a49cb0c6d5c..114b92ecdeb9c3bdf36de1c0f6183ae3b213d41e 100644 (file)
@@ -20,9 +20,6 @@ ARTICLE: "arithmetic-functions" "Arithmetic functions"
 "Computing additive and multiplicative inverses:"
 { $subsection neg }
 { $subsection recip }
-"Incrementing, decrementing:"
-{ $subsection 1+ }
-{ $subsection 1- }
 "Minimum, maximum, clamping:"
 { $subsection min }
 { $subsection max }
@@ -32,6 +29,10 @@ ARTICLE: "arithmetic-functions" "Arithmetic functions"
 "Tests:"
 { $subsection zero? }
 { $subsection between? }
+"Control flow:"
+{ $subsection if-zero }
+{ $subsection when-zero }
+{ $subsection unless-zero }
 "Sign:"
 { $subsection sgn }
 "Rounding:"
@@ -50,8 +51,10 @@ ARTICLE: "power-functions" "Powers and logarithms"
 { $subsection exp }
 { $subsection cis }
 { $subsection log }
+{ $subsection log10 }
 "Raising a number to a power:"
 { $subsection ^ }
+{ $subsection 10^ }
 "Converting between rectangular and polar form:"
 { $subsection abs }
 { $subsection absq }
@@ -122,6 +125,10 @@ HELP: log
 { $values { "x" number } { "y" number } }
 { $description "Natural logarithm function. Outputs negative infinity if " { $snippet "x" } " is 0." } ;
 
+HELP: log10
+{ $values { "x" number } { "y" number } }
+{ $description "Logarithm function base 10. Outputs negative infinity if " { $snippet "x" } " is 0." } ;
+
 HELP: sqrt
 { $values { "x" number } { "y" number } }
 { $description "Square root function." } ;
@@ -261,6 +268,10 @@ HELP: ^
 { $description "Raises " { $snippet "x" } " to the power of " { $snippet "y" } ". If " { $snippet "y" } " is an integer the answer is computed exactly, otherwise a floating point approximation is used." }
 { $errors "Throws an error if " { $snippet "x" } " and " { $snippet "y" } " are both integer 0." } ;
 
+HELP: 10^
+{ $values { "x" number } { "y" number } }
+{ $description "Raises " { $snippet "x" } " to the power of 10. If " { $snippet "x" } " is an integer the answer is computed exactly, otherwise a floating point approximation is used." } ;
+
 HELP: gcd
 { $values { "x" integer } { "y" integer } { "a" integer } { "d" integer } }
 { $description "Computes the positive greatest common divisor " { $snippet "d" } " of " { $snippet "x" } " and " { $snippet "y" } ", and another value " { $snippet "a" } " satisfying:" { $code "a*y = d mod x" } }
index 314062591d192cff360e643d1f7479393e937268..0daea7f706664cdb1c29263312012cd75d568138 100644 (file)
@@ -13,7 +13,7 @@ IN: math.functions
 GENERIC: sqrt ( x -- y ) foldable
 
 M: real sqrt
-    >float dup 0.0 < [ neg fsqrt 0.0 swap rect> ] [ fsqrt ] if ;
+    >float dup 0.0 < [ neg fsqrt 0.0 swap rect> ] [ fsqrt ] if ; inline
 
 : factor-2s ( n -- r s )
     #! factor an integer into 2^r * s
@@ -71,7 +71,7 @@ PRIVATE>
     2dup [ real? ] both? [ drop 0 >= ] [ 2drop f ] if ; inline
 
 : 0^ ( x -- z )
-    dup zero? [ drop 0/0. ] [ 0 < 1/0. 0 ? ] if ; inline
+    [ 0/0. ] [ 0 < 1/0. 0 ? ] if-zero ; inline
 
 : (^mod) ( n x y -- z )
     make-bits 1 [
@@ -104,10 +104,12 @@ PRIVATE>
 : divisor? ( m n -- ? )
     mod 0 = ;
 
+ERROR: non-trivial-divisor n ;
+
 : mod-inv ( x n -- y )
     [ nip ] [ gcd 1 = ] 2bi
     [ dup 0 < [ + ] [ nip ] if ]
-    [ "Non-trivial divisor found" throw ] if ; foldable
+    [ non-trivial-divisor ] if ; foldable
 
 : ^mod ( x y n -- z )
     over 0 < [
@@ -118,7 +120,7 @@ PRIVATE>
 
 GENERIC: absq ( x -- y ) foldable
 
-M: real absq sq ;
+M: real absq sq ; inline
 
 : ~abs ( x y epsilon -- ? )
     [ - abs ] dip < ;
@@ -146,16 +148,20 @@ M: real absq sq ;
 
 GENERIC: exp ( x -- y )
 
-M: real exp fexp ;
+M: real exp fexp ; inline
 
 M: complex exp >rect swap fexp swap polar> ;
 
 GENERIC: log ( x -- y )
 
-M: real log dup 0.0 >= [ flog ] [ 0.0 rect> log ] if ;
+M: real log dup 0.0 >= [ flog ] [ 0.0 rect> log ] if ; inline
 
 M: complex log >polar swap flog swap rect> ;
 
+: 10^ ( x -- y ) 10 swap ^ ; inline
+
+: log10 ( x -- y ) log 10 log / ; inline
+
 GENERIC: cos ( x -- y ) foldable
 
 M: complex cos
@@ -163,7 +169,7 @@ M: complex cos
     [ [ fcos ] [ fcosh ] bi* * ]
     [ [ fsin neg ] [ fsinh ] bi* * ] 2bi rect> ;
 
-M: real cos fcos ;
+M: real cos fcos ; inline
 
 : sec ( x -- y ) cos recip ; inline
 
@@ -174,7 +180,7 @@ M: complex cosh
     [ [ fcosh ] [ fcos ] bi* * ]
     [ [ fsinh ] [ fsin ] bi* * ] 2bi rect> ;
 
-M: real cosh fcosh ;
+M: real cosh fcosh ; inline
 
 : sech ( x -- y ) cosh recip ; inline
 
@@ -185,7 +191,7 @@ M: complex sin
     [ [ fsin ] [ fcosh ] bi* * ]
     [ [ fcos ] [ fsinh ] bi* * ] 2bi rect> ;
 
-M: real sin fsin ;
+M: real sin fsin ; inline
 
 : cosec ( x -- y ) sin recip ; inline
 
@@ -196,7 +202,7 @@ M: complex sinh
     [ [ fsinh ] [ fcos ] bi* * ]
     [ [ fcosh ] [ fsin ] bi* * ] 2bi rect> ;
 
-M: real sinh fsinh ;
+M: real sinh fsinh ; inline
 
 : cosech ( x -- y ) sinh recip ; inline
 
@@ -204,13 +210,13 @@ GENERIC: tan ( x -- y ) foldable
 
 M: complex tan [ sin ] [ cos ] bi / ;
 
-M: real tan ftan ;
+M: real tan ftan ; inline
 
 GENERIC: tanh ( x -- y ) foldable
 
 M: complex tanh [ sinh ] [ cosh ] bi / ;
 
-M: real tanh ftanh ;
+M: real tanh ftanh ; inline
 
 : cot ( x -- y ) tan recip ; inline
 
@@ -246,7 +252,7 @@ GENERIC: atan ( x -- y ) foldable
 
 M: complex atan i* atanh i* ;
 
-M: real atan fatan ;
+M: real atan fatan ; inline
 
 : asec ( x -- y ) recip acos ; inline
 
@@ -259,13 +265,13 @@ M: real atan fatan ;
 : round ( x -- y ) dup sgn 2 / + truncate ; inline
 
 : floor ( x -- y )
-    dup 1 mod dup zero?
-    [ drop ] [ dup 0 < [ - 1 - ] [ - ] if ] if ; foldable
+    dup 1 mod
+    [ ] [ dup 0 < [ - 1 - ] [ - ] if ] if-zero ; foldable
 
 : ceiling ( x -- y ) neg floor neg ; foldable
 
 : floor-to ( x step -- y )
-    dup zero? [ drop ] [ [ / floor ] [ * ] bi ] if ;
+    [ [ / floor ] [ * ] bi ] unless-zero ;
 
 : lerp ( a b t -- a_t ) [ over - ] dip * + ; inline
 
index 4be8dcc9a734413676d045615b684d1c84d820ae..0c0f95b48ca19db7831b5133060108eaede39d87 100644 (file)
@@ -253,7 +253,7 @@ HELP: interval-bitnot
 { $description "Computes the bitwise complement of the interval." } ;
 
 HELP: points>interval
-{ $values { "seq" "a sequence of " { $snippet "{ point included? }" } " pairs" } { "interval" interval } }
+{ $values { "seq" "a sequence of " { $snippet "{ point included? }" } " pairs" } { "interval" interval } { "nan?" "true if the computation produced NaNs" } }
 { $description "Outputs the smallest interval containing all of the endpoints." }
 ;
 
index 760338a7c3b4300c41049c129fbf53f7e6c8156a..a2bdf6d98f36ade3fad194bb524252e11a200e3e 100644 (file)
@@ -113,6 +113,22 @@ IN: math.intervals.tests
     0 1 (a,b) 0 1 [a,b] interval-subset?
 ] unit-test
 
+[ t ] [
+    full-interval -1/0. 1/0. [a,b] interval-subset?
+] unit-test
+
+[ t ] [
+    -1/0. 1/0. [a,b] full-interval interval-subset?
+] unit-test
+
+[ f ] [
+    full-interval 0 1/0. [a,b] interval-subset?
+] unit-test
+
+[ t ] [
+    0 1/0. [a,b] full-interval interval-subset?
+] unit-test
+
 [ f ] [
     0 0 1 (a,b) interval-contains?
 ] unit-test
@@ -251,8 +267,6 @@ IN: math.intervals.tests
         { bitnot interval-bitnot }
         { abs interval-abs }
         { 2/ interval-2/ }
-        { 1+ interval-1+ }
-        { 1- interval-1- }
         { neg interval-neg }
     }
     "math.ratios.private" vocab [
@@ -334,6 +348,10 @@ comparison-ops [
 
 [ t ] [ -10 10 [a,b] interval-abs 0 10 [a,b] = ] unit-test
 
+[ t ] [ full-interval interval-abs [0,inf] = ] unit-test
+
+[ t ] [ [0,inf] interval-sq [0,inf] = ] unit-test
+
 ! Test that commutative interval ops really are
 : random-interval-or-empty ( -- obj )
     10 random 0 = [ empty-interval ] [ random-interval ] if ;
index 3c339406763b203f7f64eaff6f2a161c546b03a1..99997ab8cb0bc9798e87d6df68a9fb6165a64162 100755 (executable)
@@ -11,14 +11,21 @@ SYMBOL: full-interval
 
 TUPLE: interval { from read-only } { to read-only } ;
 
+: closed-point? ( from to -- ? )
+    2dup [ first ] bi@ number=
+    [ [ second ] both? ] [ 2drop f ] if ;
+
 : <interval> ( from to -- interval )
-    2dup [ first ] bi@ {
-        { [ 2dup > ] [ 2drop 2drop empty-interval ] }
-        { [ 2dup number= ] [
-            2drop 2dup [ second ] both?
+    {
+        { [ 2dup [ first ] bi@ > ] [ 2drop empty-interval ] }
+        { [ 2dup [ first ] bi@ number= ] [
+            2dup [ second ] both?
             [ interval boa ] [ 2drop empty-interval ] if
         ] }
-        [ 2drop interval boa ]
+        { [ 2dup [ { -1/0. t } = ] [ { 1/0. t } = ] bi* and ] [
+            2drop full-interval
+        ] }
+        [ interval boa ]
     } cond ;
 
 : open-point ( n -- endpoint ) f 2array ;
@@ -53,6 +60,9 @@ MEMO: [0,inf] ( -- interval ) 0 [a,inf] ; foldable
 MEMO: fixnum-interval ( -- interval )
     most-negative-fixnum most-positive-fixnum [a,b] ; inline
 
+MEMO: array-capacity-interval ( -- interval )
+    0 max-array-capacity [a,b] ; inline
+
 : [-inf,inf] ( -- interval ) full-interval ; inline
 
 : compare-endpoints ( p1 p2 quot -- ? )
@@ -84,21 +94,25 @@ MEMO: fixnum-interval ( -- interval )
 : interval>points ( int -- from to )
     [ from>> ] [ to>> ] bi ;
 
-: points>interval ( seq -- interval )
-    dup [ first fp-nan? ] any?
-    [ drop [-inf,inf] ] [
-        dup first
-        [ [ endpoint-min ] reduce ]
-        [ [ endpoint-max ] reduce ]
-        2bi <interval>
-    ] if ;
+: points>interval ( seq -- interval nan? )
+    [ first fp-nan? not ] partition
+    [
+        [ [ ] [ endpoint-min ] map-reduce ]
+        [ [ ] [ endpoint-max ] map-reduce ] bi
+        <interval>
+    ]
+    [ empty? not ]
+    bi* ;
+
+: nan-ok ( interval nan? -- interval ) drop ; inline
+: nan-not-ok ( interval nan? -- interval ) [ drop full-interval ] when ; inline
 
 : (interval-op) ( p1 p2 quot -- p3 )
     [ [ first ] [ first ] [ call ] tri* ]
     [ drop [ second ] both? ]
     3bi 2array ; inline
 
-: interval-op ( i1 i2 quot -- i3 )
+: interval-op ( i1 i2 quot -- i3 nan? )
     {
         [ [ from>> ] [ from>> ] [ ] tri* (interval-op) ]
         [ [ to>>   ] [ from>> ] [ ] tri* (interval-op) ]
@@ -116,10 +130,10 @@ MEMO: fixnum-interval ( -- interval )
     } cond ; inline
 
 : interval+ ( i1 i2 -- i3 )
-    [ [ + ] interval-op ] do-empty-interval ;
+    [ [ + ] interval-op nan-ok ] do-empty-interval ;
 
 : interval- ( i1 i2 -- i3 )
-    [ [ - ] interval-op ] do-empty-interval ;
+    [ [ - ] interval-op nan-ok ] do-empty-interval ;
 
 : interval-intersect ( i1 i2 -- i3 )
     {
@@ -144,7 +158,7 @@ MEMO: fixnum-interval ( -- interval )
         { [ dup empty-interval eq? ] [ drop ] }
         { [ over full-interval eq? ] [ drop ] }
         { [ dup full-interval eq? ] [ nip ] }
-        [ [ interval>points 2array ] bi@ append points>interval ]
+        [ [ interval>points 2array ] bi@ append points>interval nan-not-ok ]
     } cond ;
 
 : interval-subset? ( i1 i2 -- ? )
@@ -163,7 +177,7 @@ MEMO: fixnum-interval ( -- interval )
     0 swap interval-contains? ;
 
 : interval* ( i1 i2 -- i3 )
-    [ [ [ * ] interval-op ] do-empty-interval ]
+    [ [ [ * ] interval-op nan-ok ] do-empty-interval ]
     [ [ interval-zero? ] either? ]
     2bi [ 0 [a,a] interval-union ] when ;
 
@@ -210,7 +224,7 @@ MEMO: fixnum-interval ( -- interval )
     [
         [
             [ interval-closure ] bi@
-            [ shift ] interval-op
+            [ shift ] interval-op nan-not-ok
         ] interval-integer-op
     ] do-empty-interval ;
 
@@ -225,11 +239,11 @@ MEMO: fixnum-interval ( -- interval )
 
 : interval-max ( i1 i2 -- i3 )
     #! Inaccurate; could be tighter
-    [ [ interval-closure ] bi@ [ max ] interval-op ] do-empty-interval ;
+    [ [ interval-closure ] bi@ [ max ] interval-op nan-not-ok ] do-empty-interval ;
 
 : interval-min ( i1 i2 -- i3 )
     #! Inaccurate; could be tighter
-    [ [ interval-closure ] bi@ [ min ] interval-op ] do-empty-interval ;
+    [ [ interval-closure ] bi@ [ min ] interval-op nan-not-ok ] do-empty-interval ;
 
 : interval-interior ( i1 -- i2 )
     dup special-interval? [
@@ -244,7 +258,7 @@ MEMO: fixnum-interval ( -- interval )
     } cond ; inline
 
 : interval/ ( i1 i2 -- i3 )
-    [ [ [ / ] interval-op ] interval-division-op ] do-empty-interval ;
+    [ [ [ / ] interval-op nan-not-ok ] interval-division-op ] do-empty-interval ;
 
 : interval/-safe ( i1 i2 -- i3 )
     #! Just a hack to make the compiler work if bootstrap.math
@@ -256,13 +270,13 @@ MEMO: fixnum-interval ( -- interval )
         [
             [
                 [ interval-closure ] bi@
-                [ /i ] interval-op
+                [ /i ] interval-op nan-not-ok
             ] interval-integer-op
         ] interval-division-op
     ] do-empty-interval ;
 
 : interval/f ( i1 i2 -- i3 )
-    [ [ [ /f ] interval-op ] interval-division-op ] do-empty-interval ;
+    [ [ [ /f ] interval-op nan-not-ok ] interval-division-op ] do-empty-interval ;
 
 : (interval-abs) ( i1 -- i2 )
     interval>points [ first2 [ abs ] dip 2array ] bi@ 2array ;
@@ -271,10 +285,13 @@ MEMO: fixnum-interval ( -- interval )
     {
         { [ dup empty-interval eq? ] [ ] }
         { [ dup full-interval eq? ] [ drop [0,inf] ] }
-        { [ 0 over interval-contains? ] [ (interval-abs) { 0 t } suffix points>interval ] }
-        [ (interval-abs) points>interval ]
+        { [ 0 over interval-contains? ] [ (interval-abs) { 0 t } suffix points>interval nan-not-ok ] }
+        [ (interval-abs) points>interval nan-not-ok ]
     } cond ;
 
+: interval-absq ( i1 -- i2 )
+    interval-abs interval-sq ;
+
 : interval-recip ( i1 -- i2 ) 1 [a,a] swap interval/ ;
 
 : interval-2/ ( i1 -- i2 ) -1 [a,a] interval-shift ;
@@ -344,14 +361,6 @@ SYMBOL: incomparable
         [ nip (rem-range) ]
     } cond ;
 
-: interval->fixnum ( i1 -- i2 )
-    {
-        { [ dup empty-interval eq? ] [ ] }
-        { [ dup full-interval eq? ] [ drop fixnum-interval ] }
-        { [ dup fixnum-interval interval-subset? not ] [ drop fixnum-interval ] }
-        [ ]
-    } cond ;
-
 : interval-bitand-pos ( i1 i2 -- ? )
     [ to>> first ] bi@ min 0 swap [a,b] ;
 
index 0368dd5286195caa96654af970d00a8ee14f78b3..8411447aac3a183e1ba7b99558b3770c32146a03 100755 (executable)
@@ -50,7 +50,7 @@ SYMBOL: matrix
 : do-row ( exchange-with row# -- )
     [ exchange-rows ] keep
     [ first-col ] keep
-    dup 1+ rows-from clear-col ;
+    dup 1 + rows-from clear-col ;
 
 : find-row ( row# quot -- i elt )
     [ rows-from ] dip find ; inline
@@ -60,8 +60,8 @@ SYMBOL: matrix
 
 : (echelon) ( col# row# -- )
     over cols < over rows < and [
-        2dup pivot-row [ over do-row 1+ ] when*
-        [ 1+ ] dip (echelon)
+        2dup pivot-row [ over do-row 1 + ] when*
+        [ 1 + ] dip (echelon)
     ] [
         2drop
     ] if ;
index 673f9c97cdbf3bd9e419aaefe5df4df6f120deed..fdc2f9fc3bef158c64f13dacbf19d5afea5d6e87 100644 (file)
@@ -9,7 +9,7 @@ IN: math.primes.erato
 CONSTANT: masks B{ 0 128 0 0 0 0 0 64 0 0 0 32 0 16 0 0 0 8 0 4 0 0 0 2 0 0 0 0 0 1 }
 
 : bit-pos ( n -- byte/f mask/f )
-    30 /mod masks nth-unsafe dup zero? [ 2drop f f ] when ;
+    30 /mod masks nth-unsafe [ drop f f ] when-zero ;
 
 : marked-unsafe? ( n arr -- ? )
     [ bit-pos ] dip swap [ [ nth-unsafe ] [ bitand zero? not ] bi* ] [ 2drop f ] if* ;
@@ -38,4 +38,4 @@ PRIVATE>
 
 : marked-prime? ( n arr -- ? )
     2dup upper-bound 2 swap between? [ bounds-error ] unless
-    over { 2 3 5 } member? [ 2drop t ] [ marked-unsafe? ] if ;
\ No newline at end of file
+    over { 2 3 5 } member? [ 2drop t ] [ marked-unsafe? ] if ;
index 439d55ee8d405a2e947eff19c3067d8fd151aa66..da1c36196bef0b2649c45961340ce77634c331c5 100644 (file)
@@ -8,7 +8,7 @@ IN: math.primes.factors
 
 : count-factor ( n d -- n' c )
     [ 1 ] 2dip [ /i ] keep
-    [ dupd /mod zero? ] curry [ nip [ 1+ ] dip ] while drop
+    [ dupd /mod zero? ] curry [ nip [ 1 + ] dip ] while drop
     swap ;
 
 : write-factor ( n d -- n' d' )
@@ -39,7 +39,7 @@ PRIVATE>
 : totient ( n -- t )
     {
         { [ dup 2 < ] [ drop 0 ] }
-        [ dup unique-factors [ 1 [ 1- * ] reduce ] [ product ] bi / * ]
+        [ dup unique-factors [ 1 [ 1 - * ] reduce ] [ product ] bi / * ]
     } cond ; foldable
 
 : divisors ( n -- seq )
index d28afa14130e3e9a5875fc3244493bf990768990..58cb2b09db226b887ce995fdaaf992c05903cefc 100644 (file)
@@ -12,11 +12,9 @@ TUPLE: range
 : <range> ( a b step -- range )
     [ over - ] dip [ /i 1 + 0 max ] keep range boa ; inline
 
-M: range length ( seq -- n )
-    length>> ;
+M: range length ( seq -- n ) length>> ; inline
 
-M: range nth-unsafe ( n range -- obj )
-    [ step>> * ] keep from>> + ;
+M: range nth-unsafe ( n range -- obj ) [ step>> * ] keep from>> + ; inline
 
 ! For ranges with many elements, the default element-wise methods
 ! sequences define are unsuitable because they're O(n)
index c01e7377b2fcc118109eda1af6df6affcf240f04..8124fcdd24610f39670c5af67cbe9d51ba753bb1 100644 (file)
@@ -78,8 +78,8 @@ unit-test
 [ 3 ] [ 10/3 truncate ] unit-test
 [ -3 ] [ -10/3 truncate ] unit-test
 
-[ -1/2 ] [ 1/2 1- ] unit-test
-[ 3/2 ] [ 1/2 1+ ] unit-test
+[ -1/2 ] [ 1/2 1 - ] unit-test
+[ 3/2 ] [ 1/2 1 + ] unit-test
 
 [ 1.0 ] [ 0.5 1/2 + ] unit-test
 [ 1.0 ] [ 1/2 0.5 + ] unit-test
index d4f457180edc393a26510cdec3c33c9b656f8821..dcb8e87e7c85ee1b874d783829e7e63a0806fd0d 100644 (file)
@@ -1,6 +1,7 @@
 ! Copyright (C) 2004, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors kernel kernel.private math math.functions math.private ;
+USING: accessors kernel kernel.private math math.functions
+math.private sequences summary ;
 IN: math.ratios
 
 : 2>fraction ( a/b c/d -- a c b d )
@@ -19,13 +20,18 @@ IN: math.ratios
 
 PRIVATE>
 
+ERROR: division-by-zero x ;
+
+M: division-by-zero summary
+    drop "Division by zero" ;
+
 M: integer /
-    dup zero? [
-        "Division by zero" throw
+    [
+        division-by-zero
     ] [
         dup 0 < [ [ neg ] bi@ ] when
         2dup gcd nip [ /i ] curry bi@ fraction>
-    ] if ;
+    ] if-zero ;
 
 M: ratio hashcode*
     nip >fraction [ hashcode ] bi@ bitxor ;
@@ -42,8 +48,8 @@ M: ratio >fixnum >fraction /i >fixnum ;
 M: ratio >bignum >fraction /i >bignum ;
 M: ratio >float >fraction /f ;
 
-M: ratio numerator numerator>> ;
-M: ratio denominator denominator>> ;
+M: ratio numerator numerator>> ; inline
+M: ratio denominator denominator>> ; inline
 
 M: ratio < scale < ;
 M: ratio <= scale <= ;
index d82abe5b07aefbcd8b48e01ddea62b2c16b34ad7..771c11c1300f34105d88b81a596c024f8469a122 100644 (file)
@@ -9,7 +9,7 @@ MEMO: fib ( m -- n )
 
 [ 89 ] [ 10 fib ] unit-test
 
-[ "USING: kernel math memoize generalizations ; IN: memoize.tests MEMO: x ( a b c d e -- f g h i j ) [ 1+ ] 4 ndip ;" eval( -- ) ] must-fail
+[ "USING: kernel math memoize generalizations ; IN: memoize.tests MEMO: x ( a b c d e -- f g h i j ) [ 1 + ] 4 ndip ;" eval( -- ) ] must-fail
 
 MEMO: see-test ( a -- b ) reverse ;
 
index 0cf7556bcd01513f23472bd3f5082cca7bb969c8..1d56c59fc0ee28d74ecb897abccc0973b7e0abf1 100755 (executable)
@@ -46,7 +46,7 @@ ERROR: end-of-stream multipart ;
     dup bytes>> length 256 < [ fill-bytes ] when ;
 
 : split-bytes ( bytes separator -- leftover-bytes safe-to-dump )
-    dupd [ length ] bi@ 1- - short cut-slice swap ;
+    dupd [ length ] bi@ 1 - - short cut-slice swap ;
 
 : dump-until-separator ( multipart -- multipart )
     dup
index 6984e0e750a11658448cde4baedf07497f7f2fc4..d7900f1dbd5e32ab5b534b35ad9dfd8e73eda488 100644 (file)
@@ -4,7 +4,7 @@ IN: models.arrow.tests
 \r
 3 <model> "x" set\r
 "x" get [ 2 * ] <arrow> dup "z" set\r
-[ 1+ ] <arrow> "y" set\r
+[ 1 + ] <arrow> "y" set\r
 [ ] [ "y" get activate-model ] unit-test\r
 [ t ] [ "z" get "x" get connections>> memq? ] unit-test\r
 [ 7 ] [ "y" get value>> ] unit-test\r
index 19b478eaf9b696da29bbd6e4b0bb1cef2794c57a..27504bc0fa769d7e9b014aa6c9a424f286abbee2 100644 (file)
@@ -32,10 +32,10 @@ GENERIC: model-activated ( model -- )
 M: model model-activated drop ;
 
 : ref-model ( model -- n )
-    [ 1+ ] change-ref ref>> ;
+    [ 1 + ] change-ref ref>> ;
 
 : unref-model ( model -- n )
-    [ 1- ] change-ref ref>> ;
+    [ 1 - ] change-ref ref>> ;
 
 : activate-model ( model -- )
     dup ref-model 1 = [
index 84ac738126b973af1b9be33aba8b556d1a246af2..f52dc8a3b0a3c29f887936acf2cc9c4a121a694c 100644 (file)
@@ -24,7 +24,7 @@ IN: models.product.tests
 \r
 TUPLE: an-observer { i integer } ;\r
 \r
-M: an-observer model-changed nip [ 1+ ] change-i drop ;\r
+M: an-observer model-changed nip [ 1 + ] change-i drop ;\r
 \r
 [ 1 0 ] [\r
     [let* | m1 [ 1 <model> ]\r
@@ -42,4 +42,4 @@ M: an-observer model-changed nip [ 1+ ] change-i drop ;
         o1 i>>\r
         o2 i>>\r
     ]\r
-] unit-test
\ No newline at end of file
+] unit-test\r
index 4782571d4aa82e9cfe6fdd491a1154a031312bb7..fd91c440d73c782d44d4ab5efb7fa67a01122647 100644 (file)
@@ -1,4 +1,4 @@
-USING: help.markup help.syntax ;
+USING: help.markup help.syntax strings ;
 IN: multiline
 
 HELP: STRING:
@@ -18,6 +18,34 @@ HELP: /*
            ""
 } ;
 
+HELP: HEREDOC:
+{ $syntax "HEREDOC: marker\n...text...\nmarker" }
+{ $values { "marker" "a word (token)" } { "text" "arbitrary text" } { "value" string } }
+{ $description "Returns a string delimited by an arbitrary user-defined token. This delimiter must be exactly the text beginning at the first non-blank character after the " { $link POSTPONE: HEREDOC: } " until the end of the line containing the " { $link POSTPONE: HEREDOC: } ". Text is captured until a line is found conatining exactly this delimter string." }
+{ $warning "Whitespace is significant." }
+{ $examples
+    { $example "USING: multiline prettyprint ;"
+               "HEREDOC: END\nx\nEND\n."
+               "\"x\\n\""
+    }
+    { $example "USING: multiline prettyprint sequences ;"
+               "2 5 HEREDOC: zap\nfoo\nbar\nzap\nsubseq ."
+               "\"o\\nb\""
+    }
+} ;
+
+HELP: DELIMITED:
+{ $syntax "DELIMITED: marker\n...text...\nmarker" }
+{ $values { "marker" "a word (token)" } { "text" "arbitrary text" } { "value" string } }
+{ $description "Returns a string delimited by an arbitrary user-defined token. This delimiter must be exactly the text beginning at the first non-blank character after the " { $link POSTPONE: DELIMITED: } " until the end of the line containing the " { $link POSTPONE: DELIMITED: } ". Text is captured until the exact delimiter string is found, regardless of where." }
+{ $examples
+    { $example "USING: multiline prettyprint ;"
+               "DELIMITED: factor blows my mind"
+"whoafactor blows my mind ."
+                "\"whoa\""
+    }
+} ;
+
 { POSTPONE: <" POSTPONE: STRING: } related-words
 
 HELP: parse-multiline-string
@@ -29,6 +57,8 @@ ARTICLE: "multiline" "Multiline"
 "Multiline strings:"
 { $subsection POSTPONE: STRING: }
 { $subsection POSTPONE: <" }
+{ $subsection POSTPONE: HEREDOC: }
+{ $subsection POSTPONE: DELIMITED: }
 "Multiline comments:"
 { $subsection POSTPONE: /* }
 "Writing new multiline parsing words:"
index 153b6cedbe7b3709bd0c999bfb535725b7915e18..25610ed6601bd391a5a335e81e179a7aa4ed207b 100644 (file)
@@ -1,4 +1,4 @@
-USING: multiline tools.test ;
+USING: accessors eval multiline tools.test ;
 IN: multiline.tests
 
 STRING: test-it
@@ -19,3 +19,73 @@ world"> ] unit-test
 
 [ "\nhi" ] [ <"
 hi"> ] unit-test
+
+
+! HEREDOC:
+
+[ "foo\nbar\n" ] [ HEREDOC: END
+foo
+bar
+END
+] unit-test
+
+[ "" ] [ HEREDOC: END
+END
+] unit-test
+
+[ " END\n" ] [ HEREDOC: END
+ END
+END
+] unit-test
+
+[ "\n" ] [ HEREDOC: END
+
+END
+] unit-test
+
+[ "x\n" ] [ HEREDOC: END
+x
+END
+] unit-test
+
+[ "x\n" ] [ HEREDOC:       END
+x
+END
+] unit-test
+
+[ "xyz \n" ] [ HEREDOC: END
+xyz 
+END
+] unit-test
+
+[ "} ! * # \" Â«\n" ] [ HEREDOC: END
+} ! * # " Â«
+END
+] unit-test
+
+[ 21 "foo\nbar\n" " HEREDOC: FOO\n FOO\n" 22 ] [ 21 HEREDOC: X
+foo
+bar
+X
+HEREDOC: END
+ HEREDOC: FOO
+ FOO
+END
+22 ] unit-test
+
+[ "lol\n xyz\n" ]
+[
+HEREDOC: xyz
+lol
+ xyz
+xyz
+] unit-test
+
+
+[ "lol" ]
+[ DELIMITED: aol
+lolaol ] unit-test
+
+[ "whoa" ]
+[ DELIMITED: factor blows my mind
+whoafactor blows my mind ] unit-test
index 2e8f8eb4c497d1fb9252ee15b1b554f2d6645a6f..4eaafe1f188c73d77d9210aca17d0feaf8e78ab4 100644 (file)
@@ -4,6 +4,8 @@ USING: namespaces make parser lexer kernel sequences words
 quotations math accessors locals ;
 IN: multiline
 
+ERROR: bad-heredoc identifier ;
+
 <PRIVATE
 : next-line-text ( -- str )
     lexer get dup next-line line-text>> ;
@@ -27,7 +29,7 @@ SYNTAX: STRING:
 
 <PRIVATE
 
-:: (parse-multiline-string) ( i end -- j )
+:: (scan-multiline-string) ( i end -- j )
     lexer get line-text>> :> text
     text [
         end text i start* [| j |
@@ -35,19 +37,44 @@ SYNTAX: STRING:
         ] [
             text i short tail % CHAR: \n ,
             lexer get next-line
-            0 end (parse-multiline-string)
+            0 end (scan-multiline-string)
         ] if*
     ] [ end unexpected-eof ] if ;
         
-PRIVATE>
-
-: parse-multiline-string ( end-text -- str )
+:: (parse-multiline-string) ( end-text skip-n-chars -- str )
     [
         lexer get
-        [ 1+ swap (parse-multiline-string) ]
+        [ skip-n-chars + end-text (scan-multiline-string) ]
         change-column drop
     ] "" make ;
 
+: rest-of-line ( -- seq )
+    lexer get [ line-text>> ] [ column>> ] bi tail ;
+
+:: advance-same-line ( text -- )
+    lexer get [ text length + ] change-column drop ;
+
+:: (parse-til-line-begins) ( begin-text -- )
+    lexer get still-parsing? [
+        lexer get line-text>> begin-text sequence= [
+            begin-text advance-same-line
+        ] [
+            lexer get line-text>> % "\n" %
+            lexer get next-line
+            begin-text (parse-til-line-begins)
+        ] if
+    ] [
+        begin-text bad-heredoc
+    ] if ;
+
+: parse-til-line-begins ( begin-text -- seq )
+    [ (parse-til-line-begins) ] "" make ;
+
+PRIVATE>
+
+: parse-multiline-string ( end-text -- str )
+    1 (parse-multiline-string) ;
+
 SYNTAX: <"
     "\">" parse-multiline-string parsed ;
 
@@ -61,3 +88,15 @@ SYNTAX: {"
     "\"}" parse-multiline-string parsed ;
 
 SYNTAX: /* "*/" parse-multiline-string drop ;
+
+SYNTAX: HEREDOC:
+    lexer get skip-blank
+    rest-of-line
+    lexer get next-line
+    parse-til-line-begins parsed ;
+
+SYNTAX: DELIMITED:
+    lexer get skip-blank
+    rest-of-line
+    lexer get next-line
+    0 (parse-multiline-string) parsed ;
index 9aa4ee429d869ab3882277ad943e3fb819e082fe..6292a683e3066d4e44d928cff397ceb2a27018c5 100644 (file)
@@ -25,7 +25,7 @@ reset-gl-function-number-counter
 
 : gl-function-number ( -- n )
     +gl-function-number-counter+ get-global
-    dup 1+ +gl-function-number-counter+ set-global ;
+    dup 1 + +gl-function-number-counter+ set-global ;
 
 : gl-function-pointer ( names n -- funptr )
     gl-function-context 2array dup +gl-function-pointers+ get-global at
index 93f407681e04f418c2ea02c979984cba7b482a28..850b585190646384904f7ec17f1785f7c593dc61 100644 (file)
@@ -51,7 +51,7 @@ PRIVATE>
   dup zero? [
     2drop epsilon
   ] [
-    [ exactly-n ] [ 1- at-most-n ] 2bi 2choice
+    [ exactly-n ] [ 1 - at-most-n ] 2bi 2choice
   ] if ;
 
 : at-least-n ( parser n -- parser' )
index 12e6d59fc01885484737f7ea572688b851df947d..42530151be51f01aa13303e5908f513c3ee5a4c9 100644 (file)
@@ -329,7 +329,7 @@ SYMBOL: id
 : next-id ( -- n )
   #! Return the next unique id for a parser
   id get-global [
-    dup 1+ id set-global
+    dup 1 + id set-global
   ] [
     1 id set-global 0
   ] if* ;
index a761e2d327707a67680c260094a8c7fc21221bc2..cb2abd801568773df3bcb066be453b4ef2d678dc 100644 (file)
@@ -4,5 +4,5 @@ USING: layouts kernel parser math ;
 IN: persistent.hashtables.config
 
 : radix-bits ( -- n ) << cell 4 = 4 5 ? parsed >> ; foldable
-: radix-mask ( -- n ) radix-bits 2^ 1- ; foldable
-: full-bitmap-mask ( -- n ) radix-bits 2^ 2^ 1- ; inline
+: radix-mask ( -- n ) radix-bits 2^ 1 - ; foldable
+: full-bitmap-mask ( -- n ) radix-bits 2^ 2^ 1 - ; inline
index 67886312c67379383fd7504e7e36178fc2ea5c7b..0179216e62a7acc1f0a474e613695316dac56150 100644 (file)
@@ -33,7 +33,7 @@ M: persistent-hash pluck-at
     {
         { [ 2dup root>> eq? ] [ nip ] }
         { [ over not ] [ 2drop T{ persistent-hash } ] }
-        [ count>> 1- persistent-hash boa ]
+        [ count>> 1 - persistent-hash boa ]
     } cond ;
 
 M: persistent-hash >alist [ root>> >alist% ] { } make ;
index f231043274839d171ee0bf6ed39bea0fc357a621..4c764eba9331d2bbdfeeb407e41758b054a51ccd 100644 (file)
@@ -7,7 +7,7 @@ persistent.hashtables.config
 persistent.hashtables.nodes ;
 IN: persistent.hashtables.nodes.bitmap
 
-: index ( bit bitmap -- n ) [ 1- ] dip bitand bit-count ; inline
+: index ( bit bitmap -- n ) [ 1 - ] dip bitand bit-count ; inline
 
 M:: bitmap-node (entry-at) ( key hashcode bitmap-node -- entry )
     [let* | shift [ bitmap-node shift>> ]
index 5927171aa3b3d13e54301d65bf104e8226f5bd39..2527959f325f0317cd6540a0c3ab2a625e45f2fe 100644 (file)
@@ -55,13 +55,13 @@ M: persistent-vector nth-unsafe
     [ 1array ] dip node boa ;
 
 : 2node ( first second -- node )
-    [ 2array ] [ drop level>> 1+ ] 2bi node boa ;
+    [ 2array ] [ drop level>> 1 + ] 2bi node boa ;
 
 : new-child ( new-child node -- node' expansion/f )
     dup full? [ tuck level>> 1node ] [ node-add f ] if ;
 
 : new-last ( val seq -- seq' )
-    [ length 1- ] keep new-nth ;
+    [ length 1 - ] keep new-nth ;
 
 : node-set-last ( child node -- node' )
     clone [ new-last ] change-children ;
@@ -86,7 +86,7 @@ M: persistent-vector ppush ( val pvec -- pvec' )
     clone
     dup tail>> full?
     [ ppush-new-tail ] [ ppush-tail ] if
-    [ 1+ ] change-count ;
+    [ 1 + ] change-count ;
 
 : node-set-nth ( val i node -- node' )
     clone [ new-nth ] change-children ;
@@ -166,7 +166,7 @@ M: persistent-vector ppop ( pvec -- pvec' )
                 clone
                 dup tail>> children>> length 1 >
                 [ ppop-tail ] [ ppop-new-tail ] if
-            ] dip 1- >>count
+            ] dip 1 - >>count
         ]
     } case ;
 
index 4765df10d74f9501407abacfcf89145353c8b38b..2e1a47b9512d50b75f68667c123483d1a3e84407 100644 (file)
@@ -7,7 +7,7 @@ IN: porter-stemmer
     ] [
         CHAR: y = [
             over zero?
-            [ 2drop t ] [ [ 1- ] dip consonant? not ] if
+            [ 2drop t ] [ [ 1 - ] dip consonant? not ] if
         ] [
             2drop t
         ] if
@@ -15,18 +15,18 @@ IN: porter-stemmer
 
 : skip-vowels ( i str -- i str )
     2dup bounds-check? [
-        2dup consonant? [ [ 1+ ] dip skip-vowels ] unless
+        2dup consonant? [ [ 1 + ] dip skip-vowels ] unless
     ] when ;
 
 : skip-consonants ( i str -- i str )
     2dup bounds-check? [
-        2dup consonant? [ [ 1+ ] dip skip-consonants ] when
+        2dup consonant? [ [ 1 + ] dip skip-consonants ] when
     ] when ;
 
 : (consonant-seq) ( n i str -- n )
     skip-vowels
     2dup bounds-check? [
-        [ 1+ ] [ 1+ ] [ ] tri* skip-consonants [ 1+ ] dip
+        [ 1 + ] [ 1 + ] [ ] tri* skip-consonants [ 1 + ] dip
         (consonant-seq)
     ] [
         2drop
@@ -42,7 +42,7 @@ IN: porter-stemmer
     over 1 < [
         2drop f
     ] [
-        2dup nth [ over 1- over nth ] dip = [
+        2dup nth [ over 1 - over nth ] dip = [
             consonant?
         ] [
             2drop f
@@ -92,7 +92,7 @@ IN: porter-stemmer
         { [ "bl" ?tail ] [ "ble" append ] }
         { [ "iz" ?tail ] [ "ize" append ] }
         {
-            [ dup length 1- over double-consonant? ]
+            [ dup length 1 - over double-consonant? ]
             [ dup "lsz" last-is? [ but-last-slice ] unless ]
         }
         {
@@ -206,7 +206,7 @@ IN: porter-stemmer
 : ll->l ( str -- newstr )
     {
         { [ dup last CHAR: l = not ] [ ] }
-        { [ dup length 1- over double-consonant? not ] [ ] }
+        { [ dup length 1 - over double-consonant? not ] [ ] }
         { [ dup consonant-seq 1 > ] [ but-last-slice ] }
         [ ]
     } cond ;
index 27416e0f89d9b35277f017301bf2bc582aecdc2d..247067673e3d1ec7bfa2acb71ec1d4633e95d2f3 100644 (file)
@@ -124,29 +124,31 @@ M: pathname pprint*
         ] if
     ] if ; inline
 
-: tuple>assoc ( tuple -- assoc )
-    [ class all-slots ] [ tuple-slots ] bi zip
+: filter-tuple-assoc ( slot,value -- name,value )
     [ [ initial>> ] dip = not ] assoc-filter
     [ [ name>> ] dip ] assoc-map ;
 
+: tuple>assoc ( tuple -- assoc )
+    [ class all-slots ] [ tuple-slots ] bi zip filter-tuple-assoc ;
+
 : pprint-slot-value ( name value -- )
     <flow \ { pprint-word
     [ text ] [ f <inset pprint* block> ] bi*
     \ } pprint-word block> ;
 
+: (pprint-tuple) ( opener class slots closer -- )
+    <flow {
+        [ pprint-word ]
+        [ pprint-word ]
+        [ t <inset [ pprint-slot-value ] assoc-each block> ]
+        [ pprint-word ]
+    } spread block> ;
+
+: ?pprint-tuple ( tuple quot -- )
+    [ boa-tuples? get [ pprint-object ] ] dip [ check-recursion ] curry if ; inline
+
 : pprint-tuple ( tuple -- )
-    boa-tuples? get [ pprint-object ] [
-        [
-            <flow
-            \ T{ pprint-word
-            dup class pprint-word
-            t <inset
-            tuple>assoc [ pprint-slot-value ] assoc-each
-            block>
-            \ } pprint-word
-            block>
-        ] check-recursion
-    ] if ;
+    [ [ \ T{ ] dip [ class ] [ tuple>assoc ] bi \ } (pprint-tuple) ] ?pprint-tuple ;
 
 M: tuple pprint*
     pprint-tuple ;
@@ -177,16 +179,17 @@ M: callstack pprint-delims drop \ CS{ \ } ;
 M: object >pprint-sequence ;
 M: vector >pprint-sequence ;
 M: byte-vector >pprint-sequence ;
-M: curry >pprint-sequence ;
-M: compose >pprint-sequence ;
+M: callable >pprint-sequence ;
 M: hashtable >pprint-sequence >alist ;
 M: wrapper >pprint-sequence wrapped>> 1array ;
 M: callstack >pprint-sequence callstack>array ;
 
-M: tuple >pprint-sequence
-    [ class ] [ tuple-slots ] bi
+: class-slot-sequence ( class slots -- sequence )
     [ 1array ] [ [ f 2array ] dip append ] if-empty ;
 
+M: tuple >pprint-sequence
+    [ class ] [ tuple-slots ] bi class-slot-sequence ;
+
 M: object pprint-narrow? drop f ;
 M: byte-vector pprint-narrow? drop f ;
 M: array pprint-narrow? drop t ;
index 99913a803abaaa5788df469c15b6c38743759458..718de7e84c38174525ce4f0e5cf8bebf1607d798 100644 (file)
@@ -73,7 +73,7 @@ SYMBOL: ->
 
 : remove-breakpoints ( quot pos -- quot' )
     over quotation? [
-        1+ cut [ (remove-breakpoints) ] bi@
+        1 + cut [ (remove-breakpoints) ] bi@
         [ -> ] glue 
     ] [
         drop
@@ -109,4 +109,4 @@ SYMBOL: pprint-string-cells?
                 ] each
             ] with-row
         ] each
-    ] tabular-output nl ;
\ No newline at end of file
+    ] tabular-output nl ;
index 0e0c7afb82ad0041c9a4e370f665dfeabed0f2e0..040b6d8f7c23723f365e04e8bc002d56bb364cb7 100644 (file)
@@ -44,7 +44,7 @@ TUPLE: pprinter last-newline line-count indent ;
         line-limit? [
             "..." write pprinter get return
         ] when
-        pprinter get [ 1+ ] change-line-count drop
+        pprinter get [ 1 + ] change-line-count drop
         nl do-indent
     ] if ;
 
@@ -209,7 +209,7 @@ M: block short-section ( block -- )
 TUPLE: text < section string ;
 
 : <text> ( string style -- text )
-    over length 1+ \ text new-section
+    over length 1 + \ text new-section
         swap >>style
         swap >>string ;
 
@@ -310,8 +310,8 @@ SYMBOL: next
 : group-flow ( seq -- newseq )
     [
         dup length [
-            2dup 1- swap ?nth prev set
-            2dup 1+ swap ?nth next set
+            2dup 1 - swap ?nth prev set
+            2dup 1 + swap ?nth next set
             swap nth dup split-before dup , split-after
         ] with each
     ] { } make { t } split harvest ;
index e82789ccbf3602893a7dcafcd26b2d825e669323..53af3a5178ab5655cb47e6342a7ef453a4d40465 100644 (file)
@@ -29,7 +29,7 @@ IN: quoted-printable
 
 : take-some ( seqs -- seqs seq )
     0 over [ length + dup 76 >= ] find drop nip
-    [ 1- cut-slice swap ] [ f swap ] if* concat ;
+    [ 1 - cut-slice swap ] [ f swap ] if* concat ;
 
 : divide-lines ( strings -- strings )
     [ dup ] [ take-some ] produce nip ;
index dadf93fd439f09593663e2459c89f8352a0ce483..e6661dc07886eab2d5ff393f23712bc98908e8b7 100644 (file)
@@ -8,4 +8,4 @@ M: random-dummy seed-random ( seed obj -- )
     (>>i) ;
 
 M: random-dummy random-32* ( obj -- r )
-    [ dup 1+ ] change-i drop ;
+    [ dup 1 + ] change-i drop ;
index a02abbb8ac8262d03dd51e933070f0d724955cc0..966c5b2e608e7801fbd9598f6064a519d10bfd23 100644 (file)
@@ -17,7 +17,7 @@ CONSTANT: a uint-array{ 0 HEX: 9908b0df }
 
 : y ( n seq -- y )
     [ nth-unsafe 31 mask-bit ]
-    [ [ 1+ ] [ nth-unsafe ] bi* 31 bits ] 2bi bitor ; inline
+    [ [ 1 + ] [ nth-unsafe ] bi* 31 bits ] 2bi bitor ; inline
 
 : mt[k] ( offset n seq -- )
     [
@@ -30,16 +30,16 @@ CONSTANT: a uint-array{ 0 HEX: 9908b0df }
     [
         seq>>
         [ [ n m - ] dip '[ [ m ] dip _ mt[k] ] each ]
-        [ [ m 1- ] dip '[ [ m n - ] [ n m - + ] bi* _ mt[k] ] each ]
+        [ [ m 1 - ] dip '[ [ m n - ] [ n m - + ] bi* _ mt[k] ] each ]
         bi
     ] [ 0 >>i drop ] bi ; inline
 
 : init-mt-formula ( i seq -- f(seq[i]) )
-    dupd nth dup -30 shift bitxor 1812433253 * + 1+ 32 bits ; inline
+    dupd nth dup -30 shift bitxor 1812433253 * + 1 + 32 bits ; inline
 
 : init-mt-rest ( seq -- )
-    n 1- swap '[
-        _ [ init-mt-formula ] [ [ 1+ ] dip set-nth ] 2bi
+    n 1 - swap '[
+        _ [ init-mt-formula ] [ [ 1 + ] dip set-nth ] 2bi
     ] each ; inline
 
 : init-mt-seq ( seed -- seq )
@@ -67,7 +67,7 @@ M: mersenne-twister seed-random ( mt seed -- )
 M: mersenne-twister random-32* ( mt -- r )
     [ next-index ]
     [ seq>> nth-unsafe mt-temper ]
-    [ [ 1+ ] change-i drop ] tri ;
+    [ [ 1 + ] change-i drop ] tri ;
 
 [
     [ 32 random-bits ] with-system-random
index 1962857d573181a1da1b5a2a3291d2825a8ae8cb..4c94e87928cebe5acaa9efe2e959207c1f42d45f 100755 (executable)
@@ -39,7 +39,7 @@ M: f random-32* ( obj -- * ) no-random-number-generator ;
 <PRIVATE
 
 : random-integer ( n -- n' )
-    dup log2 7 + 8 /i 1+
+    dup log2 7 + 8 /i 1 +
     [ random-bytes >byte-array byte-array>bignum ]
     [ 3 shift 2^ ] bi / * >integer ;
 
@@ -57,7 +57,7 @@ PRIVATE>
 
 : randomize ( seq -- seq )
     dup length [ dup 1 > ]
-    [ [ iota random ] [ 1- ] bi [ pick exchange ] keep ]
+    [ [ iota random ] [ 1 - ] bi [ pick exchange ] keep ]
     while drop ;
 
 : delete-random ( seq -- elt )
index 2916ef7c32be08352ba6ed3836443e663e37b8a3..90ab3342f2ea0eda65f26eae9184f126ebefb4d8 100644 (file)
@@ -56,7 +56,7 @@ M: at-least <times>
 : to-times ( term n -- ast )
     dup zero?
     [ 2drop epsilon ]
-    [ dupd 1- to-times 2array <concatenation> <maybe> ]
+    [ dupd 1 - to-times 2array <concatenation> <maybe> ]
     if ;
 
 M: from-to <times>
index 548273486589cfbcbcc22a96a020be4c4542fd1b..d8940bb829a3afc70848194901b8a795d36d8999 100644 (file)
@@ -35,13 +35,13 @@ M: $ question>quot
     drop [ { [ length = ] [ ?nth "\r\n" member? ] } 2|| ] ;
 
 M: ^ question>quot
-    drop [ { [ drop zero? ] [ [ 1- ] dip ?nth "\r\n" member? ] } 2|| ] ;
+    drop [ { [ drop zero? ] [ [ 1 - ] dip ?nth "\r\n" member? ] } 2|| ] ;
 
 M: $unix question>quot
     drop [ { [ length = ] [ ?nth CHAR: \n = ] } 2|| ] ;
 
 M: ^unix question>quot
-    drop [ { [ drop zero? ] [ [ 1- ] dip ?nth CHAR: \n = ] } 2|| ] ;
+    drop [ { [ drop zero? ] [ [ 1 - ] dip ?nth CHAR: \n = ] } 2|| ] ;
 
 M: word-break question>quot
     drop [ word-break-at? ] ;
index 21439640fe18f6934606946006062c301265ab14..ba4aa47e7b87f7dcd26ff157cc5b86d4ff25501c 100644 (file)
@@ -25,7 +25,7 @@ M: lookahead question>quot ! Returns ( index string -- ? )
 M: lookbehind question>quot ! Returns ( index string -- ? )
     term>> <reversed-option>
     ast>dfa dfa>reverse-shortest-word
-    '[ [ 1- ] dip f _ execute ] ;
+    '[ [ 1 - ] dip f _ execute ] ;
 
 : check-string ( string -- string )
     ! Make this configurable
@@ -38,7 +38,7 @@ M: lookbehind question>quot ! Returns ( index string -- ? )
 
 GENERIC: end/start ( string regexp -- end start )
 M: regexp end/start drop length 0 ;
-M: reverse-regexp end/start drop length 1- -1 swap ;
+M: reverse-regexp end/start drop length 1 - -1 swap ;
 
 PRIVATE>
 
@@ -53,12 +53,12 @@ PRIVATE>
 :: (next-match) ( i string regexp quot: ( i string regexp -- j ) reverse? -- i start end ? )
     i string regexp quot call dup [| j |
         j i j
-        reverse? [ swap [ 1+ ] bi@ ] when
+        reverse? [ swap [ 1 + ] bi@ ] when
         string
     ] [ drop f f f f ] if ; inline
 
 : search-range ( i string reverse? -- seq )
-    [ drop dup 1+ -1 ] [ length 1 ] if range boa ; inline
+    [ drop dup 1 + -1 ] [ length 1 ] if range boa ; inline
 
 :: next-match ( i string regexp quot: ( i string regexp -- j ) reverse? -- i start end ? )
     f f f f
@@ -93,7 +93,7 @@ PRIVATE>
     [ subseq ] map-matches ;
 
 : count-matches ( string regexp -- n )
-    [ 0 ] 2dip [ 3drop 1+ ] each-match ;
+    [ 0 ] 2dip [ 3drop 1 + ] each-match ;
 
 <PRIVATE
 
@@ -192,7 +192,7 @@ PRIVATE>
     dup skip-blank [
         [ index-from ] 2keep
         [ swapd subseq ]
-        [ 2drop 1+ ] 3bi
+        [ 2drop 1 + ] 3bi
     ] change-lexer-column ;
 
 : parse-noblank-token ( lexer -- str/f )
@@ -220,4 +220,4 @@ USING: vocabs vocabs.loader ;
 
 "prettyprint" vocab [
     "regexp.prettyprint" require
-] when
\ No newline at end of file
+] when
index 206bdbb9065ef0aaf5d1f938707dbb315153af92..1b3bd4bfb5a18767bd5e88d559f30dcc6f8ca9d4 100644 (file)
@@ -101,6 +101,7 @@ M: object declarations. drop ;
 M: word declarations.
     {
         POSTPONE: delimiter
+        POSTPONE: deprecated
         POSTPONE: inline
         POSTPONE: recursive
         POSTPONE: foldable
@@ -229,4 +230,4 @@ PRIVATE>
     ] { } make prune ;
 
 : see-methods ( word -- )
-    methods see-all nl ;
\ No newline at end of file
+    methods see-all nl ;
index 93f9727f75db1edc772a8d2c5b3e66029198dce8..730689eb4ff46f8de5e253b6c7c06a5893b4a520 100644 (file)
@@ -18,8 +18,8 @@ PRIVATE>
 M: complex-sequence length
     seq>> length -1 shift ;
 M: complex-sequence nth-unsafe
-    complex@ [ nth-unsafe ] [ [ 1+ ] dip nth-unsafe ] 2bi rect> ;
+    complex@ [ nth-unsafe ] [ [ 1 + ] dip nth-unsafe ] 2bi rect> ;
 M: complex-sequence set-nth-unsafe
     complex@
     [ [ real-part      ] [    ] [ ] tri* set-nth-unsafe ]
-    [ [ imaginary-part ] [ 1+ ] [ ] tri* set-nth-unsafe ] 3bi ;
+    [ [ imaginary-part ] [ 1 + ] [ ] tri* set-nth-unsafe ] 3bi ;
index b7e395fa359ebcc38ced50e47646de13135f6f4e..2b4294bda4ca9250643d255b26c24be28945bcc5 100644 (file)
@@ -47,11 +47,11 @@ M: id equal? over id? [ [ obj>> ] bi@ eq? ] [ 2drop f ] if ;
 ! The last case is needed because a very large number would
 ! otherwise be confused with a small number.
 : serialize-cell ( n -- )
-    dup zero? [ drop 0 write1 ] [
+    [ 0 write1 ] [
         dup HEX: 7e <= [
             HEX: 80 bitor write1
         ] [
-            dup log2 8 /i 1+ 
+            dup log2 8 /i 1 
             dup HEX: 7f >= [
                 HEX: ff write1
                 dup serialize-cell
@@ -60,7 +60,7 @@ M: id equal? over id? [ [ obj>> ] bi@ eq? ] [ 2drop f ] if ;
             ] if
             >be write
         ] if
-    ] if ;
+    ] if-zero ;
 
 : deserialize-cell ( -- n )
     read1 {
@@ -79,12 +79,12 @@ M: f (serialize) ( obj -- )
     drop CHAR: n write1 ;
 
 M: integer (serialize) ( obj -- )
-    dup zero? [
-        drop CHAR: z write1
+    [
+        CHAR: z write1
     ] [
         dup 0 < [ neg CHAR: m ] [ CHAR: p ] if write1
         serialize-cell
-    ] if ;
+    ] if-zero ;
 
 M: float (serialize) ( obj -- )
     CHAR: F write1
@@ -295,4 +295,4 @@ PRIVATE>
     binary [ deserialize ] with-byte-reader ;
 
 : object>bytes ( obj -- bytes )
-    binary [ serialize ] with-byte-writer ;
\ No newline at end of file
+    binary [ serialize ] with-byte-writer ;
index 7f46af4c9274ee9d8b4d7659e89a510170bc682c..8e9ea6a9ea88003c0346636fbf074e9e219f0d2d 100644 (file)
@@ -10,7 +10,7 @@ NAME>=< DEFINES ${NAME}>=<
 
 WHERE
 
-: NAME<=> ( obj1 obj2 -- <=> ) QUOT bi@ <=> ;
+: NAME<=> ( obj1 obj2 -- <=> ) QUOT compare ;
 : NAME>=< ( obj1 obj2 -- >=< ) NAME<=> invert-comparison ;
 
 ;FUNCTOR
index 8bc12e270441894929fa3300274244e8ca190181..78b1493920cca026cde6aa54b8e9085f3e5cb462 100644 (file)
@@ -4,9 +4,9 @@ IN: sorting.insertion
 <PRIVATE
 :: insert ( seq quot: ( elt -- elt' ) n -- )
     n zero? [
-        n n 1- [ seq nth quot call ] bi@ >= [
-            n n 1- seq exchange
-            seq quot n 1- insert
+        n n 1 - [ seq nth quot call ] bi@ >= [
+            n n 1 - seq exchange
+            seq quot n 1 - insert
         ] unless
     ] unless ; inline recursive
 PRIVATE>
index e7e891feded042d1fb371aa9a0ac9f936281d1d1..b49dfa35e415ce400fd9de2bbbd866214ff17f8c 100755 (executable)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: functors sequences sequences.private kernel words classes
 math alien alien.c-types byte-arrays accessors
-specialized-arrays ;
+specialized-arrays prettyprint.custom ;
 IN: specialized-arrays.direct.functor
 
 FUNCTOR: define-direct-array ( T -- )
@@ -10,6 +10,7 @@ FUNCTOR: define-direct-array ( T -- )
 A'      IS ${T}-array
 >A'     IS >${T}-array
 <A'>    IS <${A'}>
+A'{     IS ${A'}{
 
 A       DEFINES-CLASS direct-${T}-array
 <A>     DEFINES <${A}>
@@ -30,6 +31,12 @@ M: A set-nth-unsafe underlying>> SET-NTH call ;
 M: A like drop dup A instance? [ >A' ] unless ;
 M: A new-sequence drop <A'> ;
 
+M: A pprint-delims drop \ A'{ \ } ;
+
+M: A >pprint-sequence ;
+
+M: A pprint* pprint-object ;
+
 INSTANCE: A sequence
 
 ;FUNCTOR
index 1c855be1a485c84144538cdcc51eea63d683e04e..06b9aef17dc22d8ccebfe2d1fe33a780293a73af 100644 (file)
@@ -39,19 +39,19 @@ TUPLE: A
     dup length T heap-size /mod 0 = [ drop T bad-byte-array-length ] unless
     swap A boa ; inline
 
-M: A clone [ length>> ] [ underlying>> clone ] bi A boa ;
+M: A clone [ length>> ] [ underlying>> clone ] bi A boa ; inline
 
-M: A length length>> ;
+M: A length length>> ; inline
 
-M: A nth-unsafe underlying>> NTH call ;
+M: A nth-unsafe underlying>> NTH call ; inline
 
-M: A set-nth-unsafe underlying>> SET-NTH call ;
+M: A set-nth-unsafe underlying>> SET-NTH call ; inline
 
-: >A ( seq -- specialized-array ) A new clone-like ; inline
+: >A ( seq -- specialized-array ) A new clone-like ;
 
-M: A like drop dup A instance? [ >A ] unless ;
+M: A like drop dup A instance? [ >A ] unless ; inline
 
-M: A new-sequence drop (A) ;
+M: A new-sequence drop (A) ; inline
 
 M: A equal? over A instance? [ sequence= ] [ 2drop f ] if ;
 
@@ -60,9 +60,9 @@ M: A resize
         [ T heap-size * ] [ underlying>> ] bi*
         resize-byte-array
     ] 2bi
-    A boa ;
+    A boa ; inline
 
-M: A byte-length underlying>> length ;
+M: A byte-length underlying>> length ; inline
 
 M: A pprint-delims drop \ A{ \ } ;
 
index 3dec6130de5a3e83b747cbeeff0a078e10d52294..3641345a3ebd2bd9179e1224d9e8df1dbf69d146 100644 (file)
@@ -29,10 +29,10 @@ PRIVATE>
             [ length ] [ ] [ <circular> 1 over change-circular-start ] tri
             [ @ not [ , ] [ drop ] if ] 3each
         ] { } make
-        dup empty? [ over length 1- prefix ] when -1 prefix 2 clump
+        dup empty? [ over length 1 - prefix ] when -1 prefix 2 clump
         swap
     ] dip
-    '[ first2 [ 1+ ] bi@ _ _ boa ] map ; inline
+    '[ first2 [ 1 + ] bi@ _ _ boa ] map ; inline
 
 PRIVATE>
 
index 338b052316146c9fbd19d2b44fd8deb0fc2efd08..5411c885ad7165f0a7a44ea55e2c879df6658c79 100755 (executable)
@@ -5,7 +5,7 @@ parser sequences strings vectors words quotations effects classes
 continuations assocs combinators compiler.errors accessors math.order
 definitions sets hints macros stack-checker.state
 stack-checker.visitor stack-checker.errors stack-checker.values
-stack-checker.recursive-state ;
+stack-checker.recursive-state summary ;
 IN: stack-checker.backend
 
 : push-d ( obj -- ) meta-d push ;
@@ -98,8 +98,10 @@ M: object apply-object push-literal ;
 : time-bomb ( error -- )
     '[ _ throw ] infer-quot-here ;
 
-: bad-call ( -- )
-    "call must be given a callable" time-bomb ;
+ERROR: bad-call obj ;
+
+M: bad-call summary
+    drop "call must be given a callable" ;
 
 : infer-literal-quot ( literal -- )
     dup recursive-quotation? [
@@ -110,7 +112,7 @@ M: object apply-object push-literal ;
             [ [ recursion>> ] keep add-local-quotation ]
             bi infer-quot
         ] [
-            drop bad-call
+            value>> \ bad-call boa time-bomb
         ] if
     ] if ;
 
index 6959e3245224ce3ccc094c0572ff0b80a72e31bb..ea8f6f5f49ccaf5568632a9965498e8237a5c599 100644 (file)
@@ -134,13 +134,17 @@ M: object infer-call*
 
 \ compose [ infer-compose ] "special" set-word-prop
 
+ERROR: bad-executable obj ;
+
+M: bad-executable summary
+    drop "execute must be given a word" ;
+
 : infer-execute ( -- )
     pop-literal nip
     dup word? [
         apply-object
     ] [
-        drop
-        "execute must be given a word" time-bomb
+        \ bad-executable boa time-bomb
     ] if ;
 
 \ execute [ infer-execute ] "special" set-word-prop
@@ -149,11 +153,13 @@ M: object infer-call*
 
 : infer-<tuple-boa> ( -- )
     \ <tuple-boa>
-    peek-d literal value>> second 1+ { tuple } <effect>
+    peek-d literal value>> second 1 + { tuple } <effect>
     apply-word/effect ;
 
 \ <tuple-boa> [ infer-<tuple-boa> ] "special" set-word-prop
 
+\ <tuple-boa> t "flushable" set-word-prop
+
 : infer-effect-unsafe ( word -- )
     pop-literal nip
     add-effect-input
index f4bd56348130f88a8b2a3c74ca7d13ef9892075d..931cb36ea949b8c394164e3e85d9bbdaa34b09bb 100755 (executable)
@@ -17,7 +17,7 @@ IN: suffix-arrays
 
 : from-to ( index begin suffix-array -- from/f to/f )
     swap '[ _ head? not ]
-    [ find-last-from drop dup [ 1+ ] when ]
+    [ find-last-from drop dup [ 1 + ] when ]
     [ find-from drop ] 3bi ;
 
 : <funky-slice> ( from/f to/f seq -- slice )
index 79aef90bead4b36f435a93d3fa973337b245315e..c21e9e0c60ea9b90244de909042d0c0b79054af4 100644 (file)
@@ -10,7 +10,7 @@ IN: tools.annotations.tests
 ! erg's bug
 GENERIC: some-generic ( a -- b )
 
-M: integer some-generic 1+ ;
+M: integer some-generic 1 + ;
 
 [ 4 ] [ 3 some-generic ] unit-test
 
@@ -18,7 +18,7 @@ M: integer some-generic 1+ ;
 
 [ 4 ] [ 3 some-generic ] unit-test
 
-[ ] [ "IN: tools.annotations.tests USE: math M: integer some-generic 1- ;" eval( -- ) ] unit-test
+[ ] [ "IN: tools.annotations.tests USE: math M: integer some-generic 1 - ;" eval( -- ) ] unit-test
 
 [ 2 ] [ 3 some-generic ] unit-test
 
@@ -59,4 +59,4 @@ M: object my-generic ;
 : some-code ( -- )
     f my-generic drop ;
 
-[ ] [ some-code ] unit-test
\ No newline at end of file
+[ ] [ some-code ] unit-test
index fb664c495c35f5e5553b0d465d58e79c5eca4d32..7b9c8b43bc167bdcbc8a099934e12035d384ebd7 100644 (file)
@@ -9,7 +9,7 @@ IN: tools.completion
 :: (fuzzy) ( accum i full ch -- accum i full ? )
     ch i full index-from [
         :> i i accum push
-        accum i 1+ full t
+        accum i 1 + full t
     ] [
         f -1 full f
     ] if* ;
@@ -23,7 +23,7 @@ IN: tools.completion
         [
             2dup number=
             [ drop ] [ nip V{ } clone pick push ] if
-            1+
+            1 +
         ] keep pick last push
     ] each ;
 
@@ -33,9 +33,9 @@ IN: tools.completion
 : score-1 ( i full -- n )
     {
         { [ over zero? ] [ 2drop 10 ] }
-        { [ 2dup length 1- number= ] [ 2drop 4 ] }
-        { [ 2dup [ 1- ] dip nth Letter? not ] [ 2drop 10 ] }
-        { [ 2dup [ 1+ ] dip nth Letter? not ] [ 2drop 4 ] }
+        { [ 2dup length 1 - number= ] [ 2drop 4 ] }
+        { [ 2dup [ 1 - ] dip nth Letter? not ] [ 2drop 10 ] }
+        { [ 2dup [ 1 + ] dip nth Letter? not ] [ 2drop 4 ] }
         [ 2drop 1 ]
     } cond ;
 
diff --git a/basis/tools/deprecation/authors.txt b/basis/tools/deprecation/authors.txt
new file mode 100644 (file)
index 0000000..f13c9c1
--- /dev/null
@@ -0,0 +1 @@
+Joe Groff
diff --git a/basis/tools/deprecation/deprecation-docs.factor b/basis/tools/deprecation/deprecation-docs.factor
new file mode 100644 (file)
index 0000000..28d771c
--- /dev/null
@@ -0,0 +1,13 @@
+! (c)2009 Joe Groff bsd license
+USING: help.markup help.syntax kernel words ;
+IN: tools.deprecation
+
+HELP: :deprecations
+{ $description "Prints all deprecation notes." } ;
+
+ARTICLE: "tools.deprecation" "Deprecation tracking"
+"Factor's core syntax defines a " { $link POSTPONE: deprecated } " word that can be applied to words to mark them as deprecated. When the " { $vocab-link "tools.deprecation" } " vocabulary is loaded, notes will be collected and reported by the " { $link "tools.errors" } " mechanism when deprecated words are used to define other words."
+{ $subsection POSTPONE: deprecated }
+{ $subsection :deprecations } ;
+
+ABOUT: "tools.deprecation"
diff --git a/basis/tools/deprecation/deprecation.factor b/basis/tools/deprecation/deprecation.factor
new file mode 100644 (file)
index 0000000..90dba55
--- /dev/null
@@ -0,0 +1,73 @@
+! (c)2009 Joe Groff bsd license
+USING: accessors arrays assocs compiler.units
+debugger init io kernel namespaces prettyprint sequences
+source-files.errors summary tools.crossref
+tools.crossref.private tools.errors words ;
+IN: tools.deprecation
+
+SYMBOL: +deprecation-note+
+SYMBOL: deprecation-notes
+
+deprecation-notes [ H{ } clone ] initialize
+
+TUPLE: deprecation-note < source-file-error ;
+
+M: deprecation-note error-type drop +deprecation-note+ ;
+
+TUPLE: deprecated-usages asset usages ;
+
+: :deprecations ( -- )
+    deprecation-notes get-global values errors. ;
+
+T{ error-type
+    { type +deprecation-note+ }
+    { word ":deprecations" }
+    { plural "deprecated word usages" }
+    { icon "vocab:ui/tools/error-list/icons/deprecation-note.tiff" }
+    { quot [ deprecation-notes get values ] }
+    { forget-quot [ deprecation-notes get delete-at ] }
+} define-error-type
+
+: <deprecation-note> ( error word -- deprecation-note )
+    \ deprecation-note <definition-error> ;
+
+: deprecation-note ( word usages -- )
+    [ deprecated-usages boa ]
+    [ drop <deprecation-note> ]
+    [ drop deprecation-notes get-global set-at ] 2tri ;
+
+: clear-deprecation-note ( word -- )
+    deprecation-notes get-global delete-at ;
+
+: check-deprecations ( word -- )
+    dup "forgotten" word-prop
+    [ clear-deprecation-note ] [
+        dup def>> uses [ deprecated? ] filter
+        [ clear-deprecation-note ] [ >array deprecation-note ] if-empty
+    ] if ;
+
+M: deprecated-usages summary
+    drop "Deprecated words used" ;
+
+M: deprecated-usages error.
+    "The definition of " write
+    dup asset>> pprint
+    " uses these deprecated words:" write nl
+    usages>> [ "    " write pprint nl ] each ;
+
+SINGLETON: deprecation-observer
+
+: initialize-deprecation-notes ( -- )
+    get-crossref [ drop deprecated? ] assoc-filter
+    values [ keys [ check-deprecations ] each ] each ;
+
+M: deprecation-observer definitions-changed
+    drop keys [ word? ] filter
+    dup [ deprecated? ] filter empty?
+    [ [ check-deprecations ] each ]
+    [ drop initialize-deprecation-notes ] if ;
+
+[ \ deprecation-observer add-definition-observer ] 
+"tools.deprecation" add-init-hook
+
+initialize-deprecation-notes
diff --git a/basis/tools/deprecation/summary.txt b/basis/tools/deprecation/summary.txt
new file mode 100644 (file)
index 0000000..513938d
--- /dev/null
@@ -0,0 +1 @@
+Tracking usage of deprecated words
index 761dbd816a8c77c66bc9a4863953a25fb25c1fa8..92e7541616f3507d05075fa5a7ec5d04d38db358 100644 (file)
@@ -54,17 +54,17 @@ TUPLE: CLASS-array
     [ \ CLASS [ tuple-prototype <repetition> concat ] [ tuple-arity ] bi ] keep
     \ CLASS-array boa ; inline
 
-M: CLASS-array length length>> ;
+M: CLASS-array length length>> ; inline
 
-M: CLASS-array nth-unsafe tuple-slice \ CLASS read-tuple ;
+M: CLASS-array nth-unsafe tuple-slice \ CLASS read-tuple ; inline
 
-M: CLASS-array set-nth-unsafe tuple-slice \ CLASS write-tuple ;
+M: CLASS-array set-nth-unsafe tuple-slice \ CLASS write-tuple ; inline
 
-M: CLASS-array new-sequence drop <CLASS-array> ;
+M: CLASS-array new-sequence drop <CLASS-array> ; inline
 
 : >CLASS-array ( seq -- tuple-array ) 0 <CLASS-array> clone-like ;
 
-M: CLASS-array like drop dup CLASS-array? [ >CLASS-array ] unless ;
+M: CLASS-array like drop dup CLASS-array? [ >CLASS-array ] unless ; inline
 
 INSTANCE: CLASS-array sequence
 
index 03a86fe25f6f46bedaf86484700b11f6dcd7f644..f23989a1e264876164e63cced6eaefc00cc4e7c5 100755 (executable)
@@ -202,7 +202,7 @@ PRIVATE>
     lf>crlf [
         utf16n string>alien
         EmptyClipboard win32-error=0/f
-        GMEM_MOVEABLE over length 1+ GlobalAlloc
+        GMEM_MOVEABLE over length 1 + GlobalAlloc
             dup win32-error=0/f
     
         dup GlobalLock dup win32-error=0/f
index aa2b9ca58c58a18541aea7fa2693e24950feaa9e..b1b82a054235513845001cbdbad6801ec7a28e8a 100755 (executable)
@@ -495,7 +495,7 @@ TUPLE: multiline-editor < editor ;
 
 <PRIVATE
 
-: page-elt ( editor -- editor element ) dup visible-lines 1- <page-elt> ;
+: page-elt ( editor -- editor element ) dup visible-lines 1 - <page-elt> ;
 
 PRIVATE>
 
@@ -526,7 +526,7 @@ PRIVATE>
 
 : this-line-and-next ( document line -- start end )
     [ nip 0 swap 2array ]
-    [ [ nip 1+ ] [ 1+ swap doc-line length ] 2bi 2array ]
+    [ [ nip 1 + ] [ 1 + swap doc-line length ] 2bi 2array ]
     2bi ;
 
 : last-line? ( document line -- ? )
index 34f46865187081aebe5bcfcbb54538174574da7f..168fb4bb114473387077718b3f9978ce70d1f821 100644 (file)
@@ -23,7 +23,7 @@ M: glue pref-dim* drop { 0 0 } ;
     [ '[ [ dim>> ] [ gap>> ] [ filled-cell>> ] tri _ tri@ ] dip ] dip call ; inline
 
 : available-space ( pref-dim gap dims -- avail )
-    length 1+ * [-] ; inline
+    length 1 + * [-] ; inline
 
 : -center) ( pref-dim gap filled-cell dims -- )
     [ nip available-space ] 2keep [ remove-nth sum [-] ] 2keep set-nth ; inline
@@ -46,4 +46,4 @@ M: frame layout*
     [ <frame-grid> ] dip new-grid ; inline
 
 : <frame> ( cols rows -- frame )
-    frame new-frame ;
\ No newline at end of file
+    frame new-frame ;
index ade5c8101ebae19ba6f2145adace76f9a15e72e7..d7f77d9e549301c9bd19ce58b763ac47165eda80 100644 (file)
@@ -78,10 +78,10 @@ TUPLE: mock-gadget < gadget graft-called ungraft-called ;
     mock-gadget new 0 >>graft-called 0 >>ungraft-called ;
 
 M: mock-gadget graft*
-    [ 1+ ] change-graft-called drop ;
+    [ 1 + ] change-graft-called drop ;
 
 M: mock-gadget ungraft*
-    [ 1+ ] change-ungraft-called drop ;
+    [ 1 + ] change-ungraft-called drop ;
 
 ! We can't print to output-stream here because that might be a pane
 ! stream, and our graft-queue rebinding here would be captured
@@ -122,7 +122,7 @@ M: mock-gadget ungraft*
         3 [
             <mock-gadget> over <model> >>model
             "g" get over add-gadget drop
-            swap 1+ number>string set
+            swap 1 + number>string set
         ] each ;
 
     : status-flags ( -- seq )
index 029501258421f9f2467e2dbdfa5c83951799826b..26d0fee2e30fee83b7d27f4c6205c1db25191e66 100644 (file)
@@ -395,4 +395,4 @@ M: f request-focus-on 2drop ;
 
 USING: vocabs vocabs.loader ;
 
-"prettyprint" vocab [ "ui.gadgets.prettyprint" require ] when
\ No newline at end of file
+"prettyprint" vocab [ "ui.gadgets.prettyprint" require ] when
index b9fe10c530b83e71ce1265a1f8edb8a255d57732..3292e3e6c5621292dda37ef5dd10d87f8c982286 100644 (file)
@@ -28,10 +28,10 @@ M: line-gadget line-height font>> font-metrics height>> ceiling ;
 : line>y ( n gadget -- y ) line-height * >integer ;
 
 : validate-line ( m gadget -- n )
-    control-value [ drop f ] [ length 1- min 0 max ] if-empty ;
+    control-value [ drop f ] [ length 1 - min 0 max ] if-empty ;
 
 : valid-line? ( n gadget -- ? )
-    control-value length 1- 0 swap between? ;
+    control-value length 1 - 0 swap between? ;
 
 : visible-line ( gadget quot -- n )
     '[
@@ -43,7 +43,7 @@ M: line-gadget line-height font>> font-metrics height>> ceiling ;
     [ loc>> ] visible-line ;
 
 : last-visible-line ( gadget -- n )
-    [ [ loc>> ] [ dim>> ] bi v+ ] visible-line 1+ ;
+    [ [ loc>> ] [ dim>> ] bi v+ ] visible-line 1 + ;
 
 : each-slice-index ( from to seq quot -- )
     [ [ <slice> ] [ drop [a,b) ] 3bi ] dip 2each ; inline
@@ -85,4 +85,4 @@ M: line-gadget pref-viewport-dim
     2bi 2array ;
 
 : visible-lines ( gadget -- n )
-    [ visible-dim second ] [ line-height ] bi /i ;
\ No newline at end of file
+    [ visible-dim second ] [ line-height ] bi /i ;
index 504427827fb447f371e829494a99fda4f07f02a7..ccc5550adb41132dafee9f53e3c2155cbc97142b 100644 (file)
@@ -413,10 +413,10 @@ PRIVATE>
     0 select-row ;
 
 : last-row ( table -- )
-    dup control-value length 1- select-row ;
+    dup control-value length 1 - select-row ;
 
 : prev/next-page ( table n -- )
-    over visible-lines 1- * prev/next-row ;
+    over visible-lines 1 - * prev/next-row ;
 
 : previous-page ( table -- )
     -1 prev/next-page ;
@@ -503,4 +503,4 @@ M: table viewport-column-header
     dup renderer>> column-titles
     [ <column-headers> ] [ drop f ] if ;
 
-PRIVATE>
\ No newline at end of file
+PRIVATE>
index 485015b898fb35cfd5467bdace3ebead38f693f5..042e2d34466ca7310f36e65a50246991ebbcbb78 100644 (file)
@@ -14,7 +14,7 @@ TUPLE: gradient < caching-pen colors last-vertices last-colors ;
 
 :: gradient-vertices ( direction dim colors -- seq )
     direction dim v* dim over v- swap
-    colors length dup 1- v/n [ v*n ] with map
+    colors length dup 1 - v/n [ v*n ] with map
     swap [ over v+ 2array ] curry map
     concat concat >float-array ;
 
@@ -43,4 +43,4 @@ M: gradient draw-interior
         [ colors>> draw-gradient ]
     } cleave ;
 
-M: gradient pen-background 2drop transparent ;
\ No newline at end of file
+M: gradient pen-background 2drop transparent ;
index d56da86b866ff72d3632d5a0b1e4bfb58cdc271c..d5e836044bd4a48d30613d83d2964f5c81e99d01 100755 (executable)
@@ -25,7 +25,7 @@ M: uniscribe-renderer draw-string ( font string -- )
 \r
 M: uniscribe-renderer x>offset ( x font string -- n )\r
     [ 2drop 0 ] [\r
-        cached-script-string x>line-offset 0 = [ 1+ ] unless\r
+        cached-script-string x>line-offset 0 = [ 1 + ] unless\r
     ] if-empty ;\r
 \r
 M: uniscribe-renderer offset>x ( n font string -- x )\r
index ec96ac4078d67a6650f4d552ae20e9b27d6b9aaf..07c92224b20a7b664d9de50a305a05c9ae7c4911 100644 (file)
@@ -14,6 +14,7 @@ $nl
     { { $image "vocab:ui/tools/error-list/icons/linkage-error.tiff" } "Linkage error" { $link "loading-libs" } }
     { { $image "vocab:ui/tools/error-list/icons/help-lint-error.tiff" } "Help lint failure" { $link "help.lint" } }
     { { $image "vocab:ui/tools/error-list/icons/unit-test-error.tiff" } "Unit test failure" { $link "tools.test" } }
+    { { $image "vocab:ui/tools/error-list/icons/deprecation-note.tiff" } "Deprecated words used" { $link "tools.deprecation" } }
 } ;
 
 ABOUT: "ui.tools.error-list"
index 1193ca237c683c65971b4029a9cc40ccd0f6aa61..a1da59fe391bca006b3852dba15a31bc12a115e8 100644 (file)
@@ -165,8 +165,8 @@ error-display "toolbar" f {
         { 5 5 } >>gap
         error-list <error-list-toolbar> f track-add
         error-list source-file-table>> <scroller> "Source files" <labeled-gadget> 1/4 track-add
-        error-list error-table>> <scroller> "Errors" <labeled-gadget> 1/2 track-add
-        error-list error-display>> "Details" <labeled-gadget> 1/4 track-add
+        error-list error-table>> <scroller> "Errors" <labeled-gadget> 1/4 track-add
+        error-list error-display>> "Details" <labeled-gadget> 1/2 track-add
     { 5 5 } <filled-border> 1 track-add ;
 
 M: error-list-gadget focusable-child*
diff --git a/basis/ui/tools/error-list/icons/deprecation-note.tiff b/basis/ui/tools/error-list/icons/deprecation-note.tiff
new file mode 100644 (file)
index 0000000..1eef0ef
Binary files /dev/null and b/basis/ui/tools/error-list/icons/deprecation-note.tiff differ
index 5e03ab21ad1242cb545377df63ceb509172d0ed8..dae9e26dc8df7bdbfb2c28096721556a67d5b0c0 100644 (file)
@@ -10,7 +10,7 @@ TUPLE: history document elements index ;
     V{ } clone 0 history boa ;
 
 : history-add ( history -- input )
-    dup elements>> length 1+ >>index
+    dup elements>> length 1 + >>index
     [ document>> doc-string [ <input> ] [ empty? ] bi ] keep
     '[ [ _ elements>> push ] keep ] unless ;
 
@@ -32,7 +32,7 @@ TUPLE: history document elements index ;
     [ set-doc-string ] [ clear-undo drop ] 2bi ;
 
 : change-history-index ( history i -- )
-    over elements>> length 1-
+    over elements>> length 1 -
     '[ _ + _ min 0 max ] change-index drop ;
 
 : history-recall ( history i -- )
index e34e354a874f9851b8e12b3fc8dc59fd3c9d2584..4b9a4a1ef37644e511755bea9d4e4bdbf98755fd 100644 (file)
@@ -170,7 +170,7 @@ M: interactor stream-read1
 M: interactor dispose drop ;
 
 : go-to-error ( interactor error -- )
-    [ line>> 1- ] [ column>> ] bi 2array
+    [ line>> 1 - ] [ column>> ] bi 2array
     over set-caret
     mark>caret ;
 
@@ -444,4 +444,4 @@ M: listener-gadget graft*
     [ call-next-method ] [ restart-listener ] bi ;
 
 M: listener-gadget ungraft*
-    [ com-end ] [ call-next-method ] bi ;
\ No newline at end of file
+    [ com-end ] [ call-next-method ] bi ;
index 9df084210dfdacea63ab361169543653f64ac0d6..11c2a48a2a5408900b03b538f9390eae9f4a36bb 100644 (file)
@@ -35,7 +35,7 @@ TUPLE: node value children ;
         ] [
             [
                 [ traverse-step traverse-from-path ]
-                [ tuck children>> swap first 1+ tail-slice % ] 2bi
+                [ tuck children>> swap first 1 + tail-slice % ] 2bi
             ] make-node
         ] if
     ] if ;
@@ -44,7 +44,7 @@ TUPLE: node value children ;
     traverse-step traverse-from-path ;
 
 : (traverse-middle) ( frompath topath gadget -- )
-    [ first 1+ ] [ first ] [ children>> ] tri* <slice> % ;
+    [ first 1 + ] [ first ] [ children>> ] tri* <slice> % ;
 
 : traverse-post ( topath gadget -- )
     traverse-step traverse-to-path ;
@@ -94,4 +94,4 @@ M: array leaves* '[ _ leaves* ] each ;
 
 M: gadget leaves* conjoin ;
 
-: leaves ( tree -- assoc ) H{ } clone [ leaves* ] keep ;
\ No newline at end of file
+: leaves ( tree -- assoc ) H{ } clone [ leaves* ] keep ;
index 2486e701c0cec64c26cffb529785dc88575fdcfa..aa3c549cf0e2fdeb7c98a25592d8a31184809766 100644 (file)
@@ -26,7 +26,7 @@ SYMBOL: windows
     #! etc.
     swap 2array windows get-global push
     windows get-global dup length 1 >
-    [ [ length 1- dup 1- ] keep exchange ] [ drop ] if ;
+    [ [ length 1 - dup 1 - ] keep exchange ] [ drop ] if ;
 
 : unregister-window ( handle -- )
     windows [ [ first = not ] with filter ] change-global ;
index ed96842c41ad0f58d1c2e900c8b31ed451ff55c4..7c7b8a1f50771499672eb752680021570141ccd4 100644 (file)
@@ -93,7 +93,7 @@ PRIVATE>
 : first-grapheme ( str -- i )
     unclip-slice grapheme-class over
     [ grapheme-class [ nip ] [ grapheme-break? ] 2bi ] find drop
-    nip swap length or 1+ ;
+    nip swap length or 1 + ;
 
 : first-grapheme-from ( start str -- i )
     over tail-slice first-grapheme + ;
@@ -192,13 +192,13 @@ to: word-table
     swap [ format/extended? not ] find-from drop ;
 
 : walk-up ( str i -- j )
-    dupd 1+ (walk-up) [ 1+ (walk-up) ] [ drop f ] if* ;
+    dupd 1 + (walk-up) [ 1 + (walk-up) ] [ drop f ] if* ;
 
 : (walk-down) ( str i -- j )
     swap [ format/extended? not ] find-last-from drop ;
 
 : walk-down ( str i -- j )
-    dupd (walk-down) [ 1- (walk-down) ] [ drop f ] if* ;
+    dupd (walk-down) [ 1 - (walk-down) ] [ drop f ] if* ;
 
 : word-break? ( str i table-entry -- ? )
     {
@@ -226,7 +226,7 @@ PRIVATE>
 : first-word ( str -- i )
     [ unclip-slice word-break-prop over <enum> ] keep
     '[ swap _ word-break-next ] assoc-find 2drop
-    nip swap length or 1+ ;
+    nip swap length or 1 + ;
 
 : >words ( str -- words )
     [ first-word ] >pieces ;
@@ -234,7 +234,7 @@ PRIVATE>
 <PRIVATE
 
 : nth-next ( i str -- str[i-1] str[i] )
-    [ [ 1- ] keep ] dip '[ _ nth ] bi@ ;
+    [ [ 1 - ] keep ] dip '[ _ nth ] bi@ ;
 
 PRIVATE>
 
index cea880c0b08b5885e575da6475c3c017f4fe9f16..ff2c808fdef7e8bb24507c4798ff7e316a70474e 100644 (file)
@@ -27,7 +27,7 @@ IN: unicode.normalize.tests
 :: assert= ( test spec quot -- )
     spec [
         [
-            [ 1- test nth ] bi@
+            [ 1 - test nth ] bi@
             [ 1quotation ] [ quot curry ] bi* unit-test
         ] with each
     ] assoc-each ;
index aca96a56942c315303dc84afd4c52a9061883c7c..b1cba0751187d2787b8b91f98711dae0d6108364 100644 (file)
@@ -108,7 +108,7 @@ HINTS: string-append string string ;
 ! Normalization -- Composition
 
 : initial-medial? ( str i -- ? )
-    { [ swap nth initial? ] [ 1+ swap ?nth medial? ] } 2&& ;
+    { [ swap nth initial? ] [ 1 + swap ?nth medial? ] } 2&& ;
 
 : --final? ( str i -- ? )
     2 + swap ?nth final? ;
@@ -124,7 +124,7 @@ HINTS: string-append string string ;
 : compose-jamo ( str i -- str i )
     2dup initial-medial? [
         2dup --final? [ imf, ] [ im, ] if
-    ] [ 2dup swap nth , 1+ ] if ;
+    ] [ 2dup swap nth , 1 + ] if ;
 
 : pass-combining ( str -- str i )
     dup [ non-starter? not ] find drop
@@ -136,7 +136,7 @@ TUPLE: compose-state i str char after last-class ;
 : get-str ( state i -- ch )
     swap [ i>> + ] [ str>> ] bi ?nth ; inline
 : current ( state -- ch ) 0 get-str ; inline
-: to ( state -- state ) [ 1+ ] change-i ; inline
+: to ( state -- state ) [ 1 + ] change-i ; inline
 : push-after ( ch state -- state ) [ ?push ] change-after ; inline
 
 :: try-compose ( state new-char current-class -- state )
@@ -177,8 +177,8 @@ DEFER: compose-iter
 :: (compose) ( str i -- )
     i str ?nth [
         dup jamo? [ drop str i compose-jamo ] [
-            i 1+ str ?nth combining-class
-            [ str i 1+ compose-combining ] [ , str i 1+ ] if
+            i 1 + str ?nth combining-class
+            [ str i 1 + compose-combining ] [ , str i 1 + ] if
         ] if (compose)
     ] when* ; inline recursive
 
index 91feae6471cd624ed53efef94e066a62fb944802..eba0e4976f40e7927e61ae7c02e76e15752b48b4 100644 (file)
@@ -64,7 +64,7 @@ PRIVATE>
     #! first group is -1337, legacy unix code
     -1337 NGROUPS_MAX [ 4 * <byte-array> ] keep
     <int> [ getgrouplist io-error ] 2keep
-    [ 4 tail-slice ] [ *int 1- ] bi* >groups ;
+    [ 4 tail-slice ] [ *int 1 - ] bi* >groups ;
 
 PRIVATE>
     
index da8b1e63e3f11f7eafacc778486c0aed12238f05..131d8dda5dc681488a36296ed79400f63dcd6009 100644 (file)
@@ -80,7 +80,7 @@ CONSTANT: WNOWAIT    HEX: 1000000
     HEX: ff00 bitand -8 shift ; inline
 
 : WIFSIGNALED ( status -- ? )
-    HEX: 7f bitand 1+ -1 shift 0 > ; inline
+    HEX: 7f bitand 1 + -1 shift 0 > ; inline
 
 : WCOREFLAG ( -- value )
     HEX: 80 ; inline
index bd4a2c1114b01d759a335b7e002826a8d331fd81..9e2c9539c6ecfa2362efbbc7892a1aee165e2cd6 100644 (file)
@@ -45,7 +45,7 @@ M: unrolled-list clear-deque
 : <front-node> ( elt front -- node )
     [
         unroll-factor 0 <array>
-        [ unroll-factor 1- swap set-nth ] keep f
+        [ unroll-factor 1 - swap set-nth ] keep f
     ] dip [ node boa dup ] keep
     dup [ (>>prev) ] [ 2drop ] if ; inline
 
@@ -55,12 +55,12 @@ M: unrolled-list clear-deque
     ] [ dup front>> >>back ] if* drop ; inline
 
 : push-front/new ( elt list -- )
-    unroll-factor 1- >>front-pos
+    unroll-factor 1 - >>front-pos
     [ <front-node> ] change-front
     normalize-back ; inline
 
 : push-front/existing ( elt list front -- )
-    [ [ 1- ] change-front-pos ] dip
+    [ [ 1 - ] change-front-pos ] dip
     [ front-pos>> ] [ data>> ] bi* set-nth-unsafe ; inline
 
 M: unrolled-list push-front*
@@ -81,12 +81,12 @@ M: unrolled-list peek-front
 
 : pop-front/existing ( list front -- )
     [ dup front-pos>> ] [ data>> ] bi* [ 0 ] 2dip set-nth-unsafe
-    [ 1+ ] change-front-pos
+    [ 1 + ] change-front-pos
     drop ; inline
 
 M: unrolled-list pop-front*
     dup front>> [ empty-unrolled-list ] unless*
-    over front-pos>> unroll-factor 1- eq?
+    over front-pos>> unroll-factor 1 - eq?
     [ pop-front/new ] [ pop-front/existing ] if ;
 
 : <back-node> ( elt back -- node )
@@ -106,8 +106,8 @@ M: unrolled-list pop-front*
     normalize-front ; inline
 
 : push-back/existing ( elt list back -- )
-    [ [ 1+ ] change-back-pos ] dip
-    [ back-pos>> 1- ] [ data>> ] bi* set-nth-unsafe ; inline
+    [ [ 1 + ] change-back-pos ] dip
+    [ back-pos>> 1 - ] [ data>> ] bi* set-nth-unsafe ; inline
 
 M: unrolled-list push-back*
     dup [ back>> ] [ back-pos>> unroll-factor eq? not ] bi
@@ -116,7 +116,7 @@ M: unrolled-list push-back*
 
 M: unrolled-list peek-back
     dup back>>
-    [ [ back-pos>> 1- ] dip data>> nth-unsafe ]
+    [ [ back-pos>> 1 - ] dip data>> nth-unsafe ]
     [ empty-unrolled-list ]
     if* ;
 
@@ -126,7 +126,7 @@ M: unrolled-list peek-back
     dup back>> [ normalize-front ] [ f >>front drop ] if ; inline
 
 : pop-back/existing ( list back -- )
-    [ [ 1- ] change-back-pos ] dip
+    [ [ 1 - ] change-back-pos ] dip
     [ dup back-pos>> ] [ data>> ] bi* [ 0 ] 2dip set-nth-unsafe
     drop ; inline
 
index 8e11dec431fbd2688094d00f7b7c25344d08efb5..f87c21d2ffbdd9e6acb167388d2f6c833d7c1a37 100644 (file)
@@ -57,7 +57,7 @@ PRIVATE>
     2dup length 2 - >= [
         2drop
     ] [
-        [ 1+ dup 2 + ] dip subseq  hex> [ , ] when*
+        [ 1 + dup 2 + ] dip subseq  hex> [ , ] when*
     ] if ;
 
 : url-decode-% ( index str -- index str )
@@ -70,7 +70,7 @@ PRIVATE>
         2dup nth dup CHAR: % = [
             drop url-decode-% [ 3 + ] dip
         ] [
-            , [ 1+ ] dip
+            , [ 1 + ] dip
         ] if url-decode-iter
     ] if ;
 
index 6ad5e7dee61fc74310d750798da49404a154e375..74c63e3d8f23558608ca8386a1c1b3753d5fd486 100644 (file)
@@ -5,5 +5,5 @@ VALUE: foo
 [ f ] [ foo ] unit-test\r
 [ ] [ 3 to: foo ] unit-test\r
 [ 3 ] [ foo ] unit-test\r
-[ ] [ \ foo [ 1+ ] change-value ] unit-test\r
+[ ] [ \ foo [ 1 + ] change-value ] unit-test\r
 [ 4 ] [ foo ] unit-test\r
index 47a6c2090ae57e49fbeba3a46ea0fe64bf07ab6b..b70c7c50509a1ed6b4571447b85913e3b0d650ed 100644 (file)
@@ -18,11 +18,11 @@ TUPLE: V { underlying A } { length array-capacity } ;
 M: V like
     drop dup V instance? [
         dup A instance? [ dup length V boa ] [ >V ] if
-    ] unless ;
+    ] unless ; inline
 
-M: V new-sequence drop [ <A> ] [ >fixnum ] bi V boa ;
+M: V new-sequence drop [ <A> ] [ >fixnum ] bi V boa ; inline
 
-M: A new-resizable drop <V> ;
+M: A new-resizable drop <V> ; inline
 
 M: V equal? over V instance? [ sequence= ] [ 2drop f ] if ;
 
index ae106cbf93b9dfbb3ce2ada86972815320dfaac2..79870b483f35561109d46d7061123456f1920f3e 100644 (file)
@@ -28,13 +28,13 @@ PRIVATE>
 M: vlist ppush
     >vlist<
     2dup length = [ unshare ] unless
-    [ [ 1+ swap ] dip push ] keep vlist boa ;
+    [ [ 1 + swap ] dip push ] keep vlist boa ;
 
 ERROR: empty-vlist-error ;
 
 M: vlist ppop
     [ empty-vlist-error ]
-    [ [ length>> 1- ] [ vector>> ] bi vlist boa ] if-empty ;
+    [ [ length>> 1 - ] [ vector>> ] bi vlist boa ] if-empty ;
 
 M: vlist clone
     [ length>> ] [ vector>> >vector ] bi vlist boa ;
@@ -65,7 +65,7 @@ M: valist assoc-size vlist>> length 2/ ;
 : valist-at ( key i array -- value ? )
     over 0 >= [
         3dup nth-unsafe = [
-            [ 1+ ] dip nth-unsafe nip t
+            [ 1 + ] dip nth-unsafe nip t
         ] [
             [ 2 - ] dip valist-at
         ] if
index 9d52378da912855bfbb39619b611fe53d83d7deb..beac4b6c27397c5a13b13c634946dd8a0a57f839 100755 (executable)
@@ -28,7 +28,7 @@ unless
 "windows.com.wrapper.callbacks" create-vocab drop
 
 : (next-vtbl-counter) ( -- n )
-    +vtbl-counter+ [ 1+ dup ] change ;
+    +vtbl-counter+ [ 1 + dup ] change ;
 
 : com-unwrap ( wrapped -- object )
     +wrapped-objects+ get-global at*
@@ -59,7 +59,7 @@ unless
 : (make-add-ref) ( interfaces -- quot )
     length "void*" heap-size * '[
         _
-        [ alien-unsigned-4 1+ dup ]
+        [ alien-unsigned-4 1 + dup ]
         [ set-alien-unsigned-4 ]
         2bi
     ] ;
@@ -68,7 +68,7 @@ unless
     length "void*" heap-size * '[
         _
         [ drop ]
-        [ alien-unsigned-4 1- dup ]
+        [ alien-unsigned-4 1 - dup ]
         [ set-alien-unsigned-4 ]
         2tri
         dup 0 = [ swap (free-wrapped-object) ] [ nip ] if
@@ -101,7 +101,7 @@ unless
     "windows.com.wrapper.callbacks" create ;
 
 : (finish-thunk) ( param-count thunk quot -- thunked-quot )
-    [ [ drop [ ] ] [ swap 1- '[ _ _ ndip ] ] if-empty ]
+    [ [ drop [ ] ] [ swap 1 - '[ _ _ ndip ] ] if-empty ]
     dip compose ;
 
 : (make-interface-callbacks) ( interface-name quots iunknown-methods n -- words )
index 4543aa703a0188db1a0bde7bdfb4ca19ffcb9656..e9c4930b6402d986189b7ac06b9d99c7f0d8e7f2 100644 (file)
@@ -7,7 +7,7 @@ IN: windows.dragdrop-listener
 : filenames-from-hdrop ( hdrop -- filenames )\r
     dup HEX: FFFFFFFF f 0 DragQueryFile ! get count of files\r
     [\r
-        2dup f 0 DragQueryFile 1+ ! get size of filename buffer\r
+        2dup f 0 DragQueryFile 1 + ! get size of filename buffer\r
         dup "WCHAR" <c-array>\r
         [ swap DragQueryFile drop ] keep\r
         alien>u16-string\r
index d180cb20e7b27b05b5f820d4b508650e8db5b445..8bdbb9f1e99838bbcd812d1afce3966d2f73ce03 100644 (file)
@@ -713,11 +713,7 @@ ERROR: error-message-failed id ;
     GetLastError n>win32-error-string ;
 
 : (win32-error) ( n -- )
-    dup zero? [
-        drop
-    ] [
-        win32-error-string throw
-    ] if ;
+    [ win32-error-string throw ] unless-zero ;
 
 : win32-error ( -- )
     GetLastError (win32-error) ;
index 864700cb0fa6afe362c6490daac0bd45550b8f00..d6a08325d964c994b8cf38b5012791ccf6a18f2f 100755 (executable)
@@ -1,5 +1,5 @@
 USING: alien alien.syntax alien.c-types alien.strings math
-kernel sequences windows.errors windows.types debugger io
+kernel sequences windows.errors windows.types io
 accessors math.order namespaces make math.parser windows.kernel32
 combinators locals specialized-arrays.direct.uchar ;
 IN: windows.ole32
@@ -116,11 +116,10 @@ FUNCTION: void ReleaseStgMedium ( LPSTGMEDIUM pmedium ) ;
 : succeeded? ( hresult -- ? )
     0 HEX: 7FFFFFFF between? ;
 
-TUPLE: ole32-error error-code ;
-C: <ole32-error> ole32-error
+TUPLE: ole32-error code message ;
 
-M: ole32-error error.
-    "COM method failed: " print error-code>> n>win32-error-string print ;
+: <ole32-error> ( code -- error )
+    dup n>win32-error-string \ ole32-error boa ;
 
 : ole32-error ( hresult -- )
     dup succeeded? [ drop ] [ <ole32-error> throw ] if ;
index feb0bef7a8ab7dd06c204a058107992f93250fd2..7c5c26c2da82733a2be5afc9cc7232ebe5a5f999 100755 (executable)
@@ -12,7 +12,7 @@ TUPLE: script-string font string metrics ssa size image disposed ;
 : line-offset>x ( n script-string -- x )
     2dup string>> length = [
         ssa>> ! ssa
-        swap 1- ! icp
+        swap 1 - ! icp
         TRUE ! fTrailing
     ] [
         ssa>>
index 7561d674820f7ff7fe7918ef0522bac0e9eafa28..5b2a0bcfb4d3dc2223dd82117cda190c497a83a5 100644 (file)
@@ -140,7 +140,7 @@ MACRO: interpolate-xml ( xml -- quot )
 : number<-> ( doc -- dup )
     0 over [
         dup var>> [
-            over >>var [ 1+ ] dip
+            over >>var [ 1 + ] dip
         ] unless drop
     ] each-interpolated drop ;
 
index 052cab15c29beffd273859ecf2828b96f8e50659..b0dbdf22ac83036076b8271eb0dfc3322a9c2fee 100644 (file)
@@ -13,7 +13,7 @@ IN: xml.tokenize
         swap
         [ version-1.0?>> over text? not ]
         [ check>> ] bi and [
-            spot get [ 1+ ] change-column drop
+            spot get [ 1 + ] change-column drop
             disallowed-char
         ] [ drop ] if
     ] [ drop ] if* ;
@@ -23,7 +23,7 @@ HINTS: assure-good-char { spot fixnum } ;
 : record ( spot char -- spot )
     over char>> [
         CHAR: \n =
-        [ [ 1+ ] change-line -1 ] [ dup column>> 1+ ] if
+        [ [ 1 + ] change-line -1 ] [ dup column>> 1 + ] if
         >>column
     ] [ drop ] if ;
 
@@ -91,7 +91,7 @@ HINTS: next* { spot } ;
 : take-string ( match -- string )
     dup length <circular-string>
     spot get '[ 2dup _ string-matches? ] take-until nip
-    dup length rot length 1- - head
+    dup length rot length 1 - - head
     get-char [ missing-close ] unless next ;
 
 : expect ( string -- )
index febfc2b40f6a189a38c8b19251ce62025a1c3ded..d3a4f1e9a22a17c99af1bc999e4a4a159a53bdac 100755 (executable)
@@ -257,7 +257,7 @@ M: mark-previous-rule handle-rule-start
         drop
 
         seen-whitespace-end? get [
-            position get 1+ whitespace-end set
+            position get 1 + whitespace-end set
         ] unless
 
         (check-word-break)
index 44d3a0285e41a040723c821896cdfb23e16d12c5..3e7e697baa80d3c36fe48be39121454a0b376589 100644 (file)
@@ -28,7 +28,7 @@ SYMBOLS: line last-offset position context
 
 : next-token, ( len id -- )
     [ position get 2dup + ] dip token,
-    position get + dup 1- position set last-offset set ;
+    position get + dup 1 - position set last-offset set ;
 
 : push-context ( rules -- )
     context [ <line-context> ] change ;
index d5b8bd5411c7e3c10b4c6bacb3a378174d640507..b179811bda31dbbc2bccd0e717aa4e8270ac4560 100755 (executable)
@@ -487,12 +487,12 @@ update_bootstrap() {
 }
 
 refresh_image() {
-    ./$FACTOR_BINARY -script -e="USE: vocabs.loader USE: system refresh-all USE: memory save 0 exit"
+    ./$FACTOR_BINARY -script -e="USING: vocabs.loader system memory ; refresh-all USE: memory save 0 exit"
     check_ret factor
 }
 
 make_boot_image() {
-    ./$FACTOR_BINARY -script -e="\"$MAKE_IMAGE_TARGET\" USE: system USE: bootstrap.image make-image save 0 exit"
+    ./$FACTOR_BINARY -script -e="\"$MAKE_IMAGE_TARGET\" USING: system bootstrap.image memory ; make-image save 0 exit"
     check_ret factor
 
 }
index ec38e3be5b8b5b9ff821339012ff6af25414a446..d98ea3d1032a019d7367aba509fa88e9c07e99c0 100644 (file)
@@ -20,11 +20,11 @@ UNION: pinned-c-ptr
 
 GENERIC: >c-ptr ( obj -- c-ptr )
 
-M: c-ptr >c-ptr ;
+M: c-ptr >c-ptr ; inline
 
 SLOT: underlying
 
-M: object >c-ptr underlying>> ;
+M: object >c-ptr underlying>> ; inline
 
 GENERIC: expired? ( c-ptr -- ? ) flushable
 
index 4a998a1ebb118d7e15a9bcb4f04681ff640d0471..fa4d4b2f6951d0938d557edd49ae89899a4246e0 100644 (file)
@@ -4,17 +4,17 @@ USING: accessors kernel kernel.private math math.private
 sequences sequences.private ;
 IN: arrays
 
-M: array clone (clone) ;
-M: array length length>> ;
-M: array nth-unsafe [ >fixnum ] dip array-nth ;
-M: array set-nth-unsafe [ >fixnum ] dip set-array-nth ;
-M: array resize resize-array ;
+M: array clone (clone) ; inline
+M: array length length>> ; inline
+M: array nth-unsafe [ >fixnum ] dip array-nth ; inline
+M: array set-nth-unsafe [ >fixnum ] dip set-array-nth ; inline
+M: array resize resize-array ; inline
 
 : >array ( seq -- array ) { } clone-like ;
 
-M: object new-sequence drop 0 <array> ;
+M: object new-sequence drop 0 <array> ; inline
 
-M: f new-sequence drop dup zero? [ drop f ] [ 0 <array> ] if ;
+M: f new-sequence drop [ f ] [ 0 <array> ] if-zero ; inline
 
 M: array equal?
     over array? [ sequence= ] [ 2drop f ] if ;
index 3c5ac31d23e2d94c0a2f31b9202e0b8d10c0db59..9e36f9f00cc6cbbe2ff28de7bc8a818cc934313f 100644 (file)
@@ -1,7 +1,7 @@
-IN: assocs.tests
 USING: kernel math namespaces make tools.test vectors sequences
 sequences.private hashtables io prettyprint assocs
 continuations specialized-arrays.double ;
+IN: assocs.tests
 
 [ t ] [ H{ } dup assoc-subset? ] unit-test
 [ f ] [ H{ { 1 3 } } H{ } assoc-subset? ] unit-test
@@ -149,4 +149,4 @@ unit-test
         H{ { 1 3 } { 2 5 } }
         H{ { 1 7 } { 5 6 } }
     } assoc-refine
-] unit-test
\ No newline at end of file
+] unit-test
index 8b6809236c4368a1301ad215721481f7e386dc4f..e633a54843a6dc1e7c70ba10453ef1cf95a9866e 100755 (executable)
@@ -17,7 +17,7 @@ GENERIC: assoc-like ( assoc exemplar -- newassoc )
 GENERIC: assoc-clone-like ( assoc exemplar -- newassoc )
 GENERIC: >alist ( assoc -- newassoc )
 
-M: assoc assoc-like drop ;
+M: assoc assoc-like drop ; inline
 
 : ?at ( key assoc -- value/key ? )
     2dup at* [ 2nip t ] [ 2drop f ] if ; inline
@@ -87,7 +87,7 @@ PRIVATE>
 
 M: assoc assoc-clone-like ( assoc exemplar -- newassoc )
     [ dup assoc-size ] dip new-assoc
-    [ [ set-at ] with-assoc assoc-each ] keep ;
+    [ [ set-at ] with-assoc assoc-each ] keep ; inline
 
 : keys ( assoc -- keys )
     [ drop ] { } assoc>map ;
@@ -189,48 +189,48 @@ M: sequence set-at
     [ 2nip set-second ]
     [ drop [ swap 2array ] dip push ] if ;
 
-M: sequence new-assoc drop <vector> ;
+M: sequence new-assoc drop <vector> ; inline
 
-M: sequence clear-assoc delete-all ;
+M: sequence clear-assoc delete-all ; inline
 
 M: sequence delete-at
     [ nip ] [ search-alist nip ] 2bi
     [ swap delete-nth ] [ drop ] if* ;
 
-M: sequence assoc-size length ;
+M: sequence assoc-size length ; inline
 
 M: sequence assoc-clone-like
-    [ >alist ] dip clone-like ;
+    [ >alist ] dip clone-like ; inline
 
 M: sequence assoc-like
-    [ >alist ] dip like ;
+    [ >alist ] dip like ; inline
 
-M: sequence >alist ;
+M: sequence >alist ; inline
 
 ! Override sequence => assoc instance for f
-M: f clear-assoc drop ;
+M: f clear-assoc drop ; inline
 
-M: f assoc-like drop dup assoc-empty? [ drop f ] when ;
+M: f assoc-like drop dup assoc-empty? [ drop f ] when ; inline
 
 INSTANCE: sequence assoc
 
-TUPLE: enum seq ;
+TUPLE: enum { seq read-only } ;
 
 C: <enum> enum
 
 M: enum at*
     seq>> 2dup bounds-check?
-    [ nth t ] [ 2drop f f ] if ;
+    [ nth t ] [ 2drop f f ] if ; inline
 
-M: enum set-at seq>> set-nth ;
+M: enum set-at seq>> set-nth ; inline
 
-M: enum delete-at seq>> delete-nth ;
+M: enum delete-at seq>> delete-nth ; inline
 
 M: enum >alist ( enum -- alist )
-    seq>> [ length ] keep zip ;
+    seq>> [ length ] keep zip ; inline
 
-M: enum assoc-size seq>> length ;
+M: enum assoc-size seq>> length ; inline
 
-M: enum clear-assoc seq>> delete-all ;
+M: enum clear-assoc seq>> delete-all ; inline
 
 INSTANCE: enum assoc
diff --git a/core/bootstrap/syntax-docs.factor b/core/bootstrap/syntax-docs.factor
deleted file mode 100644 (file)
index e69de29..0000000
index f5182a02100b548208c4e4355870680eee642b51..906b73934e9b26a1a2137e6b8faab200baee3e10 100644 (file)
@@ -67,6 +67,7 @@ IN: bootstrap.syntax
     "M\\"
     "]"
     "delimiter"
+    "deprecated"
     "f"
     "flushable"
     "foldable"
index 1c3e4d3bdfdc4ca3755f0b1402e66e04a0e19cd4..e28083b2dbf5a21a39f089224e261994479bcd13 100644 (file)
@@ -1,5 +1,5 @@
+USING: tools.test byte-arrays sequences kernel math ;\r
 IN: byte-arrays.tests\r
-USING: tools.test byte-arrays sequences kernel ;\r
 \r
 [ 6 B{ 1 2 3 } ] [\r
     6 B{ 1 2 3 } resize-byte-array\r
@@ -10,4 +10,8 @@ USING: tools.test byte-arrays sequences kernel ;
 \r
 [ -10 B{ } resize-byte-array ] must-fail\r
 \r
-[ B{ 123 } ] [ 123 1byte-array ] unit-test
\ No newline at end of file
+[ B{ 123 } ] [ 123 1byte-array ] unit-test\r
+\r
+[ B{ 123 } ] [ 123 0 B{ 0 } [ set-nth ] keep ] unit-test\r
+\r
+[ B{ 123 } ] [ 123 >bignum 0 B{ 0 } [ set-nth ] keep ] unit-test
\ No newline at end of file
index 72989ac447069d04fd48c9460b1136010589bca4..3c89a5f63e777dc9a28854fa9ee0b761e151d68c 100644 (file)
@@ -4,18 +4,18 @@ USING: accessors kernel kernel.private alien.accessors sequences
 sequences.private math ;
 IN: byte-arrays
 
-M: byte-array clone (clone) ;
-M: byte-array length length>> ;
-M: byte-array nth-unsafe swap >fixnum alien-unsigned-1 ;
-M: byte-array set-nth-unsafe swap >fixnum set-alien-unsigned-1 ;
+M: byte-array clone (clone) ; inline
+M: byte-array length length>> ; inline
+M: byte-array nth-unsafe swap >fixnum alien-unsigned-1 ; inline
+M: byte-array set-nth-unsafe swap >fixnum set-alien-unsigned-1 ; inline
 : >byte-array ( seq -- byte-array ) B{ } clone-like ; inline
-M: byte-array new-sequence drop (byte-array) ;
+M: byte-array new-sequence drop (byte-array) ; inline
 
 M: byte-array equal?
     over byte-array? [ sequence= ] [ 2drop f ] if ;
 
 M: byte-array resize
-    resize-byte-array ;
+    resize-byte-array ; inline
 
 INSTANCE: byte-array sequence
 
index bd7510c95f632cb8b90e77702429dbc7626815a0..fdf4ab6aca99c6c4600a20d76ae80abbf36d5b14 100644 (file)
@@ -1,6 +1,6 @@
-IN: byte-vectors.tests\r
 USING: tools.test byte-vectors vectors sequences kernel\r
 prettyprint ;\r
+IN: byte-vectors.tests\r
 \r
 [ 0 ] [ 123 <byte-vector> length ] unit-test\r
 \r
index fc3d9501c777cd1463509ce3adaad37b4c3f01a2..287e9724051a91ead34cad6453cafce3cefdd36d 100644 (file)
@@ -18,15 +18,15 @@ M: byte-vector like
     drop dup byte-vector? [\r
         dup byte-array?\r
         [ dup length byte-vector boa ] [ >byte-vector ] if\r
-    ] unless ;\r
+    ] unless ; inline\r
 \r
 M: byte-vector new-sequence\r
-    drop [ (byte-array) ] [ >fixnum ] bi byte-vector boa ;\r
+    drop [ (byte-array) ] [ >fixnum ] bi byte-vector boa ; inline\r
 \r
 M: byte-vector equal?\r
     over byte-vector? [ sequence= ] [ 2drop f ] if ;\r
 \r
-M: byte-vector contract 2drop ;\r
+M: byte-vector contract 2drop ; inline\r
 \r
 M: byte-array like\r
     #! If we have an byte-array, we're done.\r
@@ -39,8 +39,8 @@ M: byte-array like
             2dup length eq?\r
             [ nip ] [ resize-byte-array ] if\r
         ] [ >byte-array ] if\r
-    ] unless ;\r
+    ] unless ; inline\r
 \r
-M: byte-array new-resizable drop <byte-vector> ;\r
+M: byte-array new-resizable drop <byte-vector> ; inline\r
 \r
 INSTANCE: byte-vector growable\r
diff --git a/core/checksums/checksums-tests.factor b/core/checksums/checksums-tests.factor
deleted file mode 100644 (file)
index 8ba09d8..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-IN: checksums.tests
-USING: checksums tools.test ;
-
index 6bfc94d79a8a390dcfcd5b9762742c91be0d6074..df4f8f2563033899a221203021061625a98c4930 100755 (executable)
@@ -202,9 +202,11 @@ M: anonymous-complement (classes-intersect?)
 : class= ( first second -- ? )\r
     [ class<= ] [ swap class<= ] 2bi and ;\r
 \r
+ERROR: topological-sort-failed ;\r
+\r
 : largest-class ( seq -- n elt )\r
     dup [ [ class< ] with any? not ] curry find-last\r
-    [ "Topological sort failed" throw ] unless* ;\r
+    [ topological-sort-failed ] unless* ;\r
 \r
 : sort-classes ( seq -- newseq )\r
     [ name>> ] sort-with >vector\r
index 6f990d0d62d6dcdf4b8a76601fd38c0dc0e594df..c6ce302c269ed71556c9ea16bccdb642af7a1d74 100755 (executable)
@@ -1,5 +1,5 @@
-IN: classes.builtin.tests
 USING: tools.test words sequences kernel memory accessors ;
+IN: classes.builtin.tests
 
 [ f ] [
     [ word? ] instances
index c74c8f3b503ef83f108948f356e34c5b8659f9eb..8eeb4ce3575e3884e149cc3aebe3282c4b9ccf6b 100644 (file)
@@ -20,9 +20,9 @@ PREDICATE: hi-tag-class < builtin-class class>type 7 > ;
 
 : bootstrap-type>class ( n -- class ) builtins get nth ;
 
-M: hi-tag class hi-tag type>class ;
+M: hi-tag class hi-tag type>class ; inline
 
-M: object class tag type>class ;
+M: object class tag type>class ; inline
 
 M: builtin-class rank-class drop 0 ;
 
index d7fba97977959b0948afc89bcc819265ab2b5e8c..1c1db09cf49e739091494db7ccf1cfd6fb2d996d 100644 (file)
@@ -110,6 +110,12 @@ USE: multiline
     "class-intersect-no-method-c" parse-stream drop
 ] unit-test
 
+! Forget the above crap
+[
+    { "classes.test.a" "classes.test.b" "classes.test.c" "classes.test.d" }
+    [ forget-vocab ] each
+] with-compilation-unit
+
 TUPLE: forgotten-predicate-test ;
 
 [ ] [ [ \ forgotten-predicate-test forget ] with-compilation-unit ] unit-test
index 72457ff97431fcd9099d0867bc9e137dd9b3a0cb..4ee31936a99733fb72fd8dac0502d8dad0e78c8a 100644 (file)
@@ -1,7 +1,7 @@
-IN: classes.tuple.parser.tests
 USING: accessors classes.tuple.parser lexer words classes
 sequences math kernel slots tools.test parser compiler.units
 arrays classes.tuple eval multiline ;
+IN: classes.tuple.parser.tests
 
 TUPLE: test-1 ;
 
@@ -141,4 +141,4 @@ TUPLE: parsing-corner-case x ;
         "USE: classes.tuple.parser.tests T{ parsing-corner-case {"
         "    x 3 }"
     } "\n" join eval( -- tuple )
-] [ error>> unexpected-eof? ] must-fail-with
\ No newline at end of file
+] [ error>> unexpected-eof? ] must-fail-with
index 6b106e48d9be724b72315e51047ff09393245df4..7ba850f744da3ee144fb31f3ab116371bbb84fcf 100644 (file)
@@ -87,22 +87,24 @@ ERROR: bad-literal-tuple ;
 : parse-slot-values ( -- values )
     [ (parse-slot-values) ] { } make ;
 
-: boa>tuple ( class slots -- tuple )
+GENERIC# boa>object 1 ( class slots -- tuple )
+
+M: tuple-class boa>object
     swap prefix >tuple ;
 
-: assoc>tuple ( class slots -- tuple )
-    [ [ ] [ initial-values ] [ all-slots ] tri ] dip
-    swap [ [ slot-named offset>> 2 - ] curry dip ] curry assoc-map
-    [ dup <enum> ] dip update boa>tuple ;
+: assoc>object ( class slots values -- tuple )
+    [ [ [ initial>> ] map ] keep ] dip
+    swap [ [ slot-named* drop ] curry dip ] curry assoc-map
+    [ dup <enum> ] dip update boa>object ;
 
-: parse-tuple-literal-slots ( class -- tuple )
+: parse-tuple-literal-slots ( class slots -- tuple )
     scan {
         { f [ unexpected-eof ] }
-        { "f" [ \ } parse-until boa>tuple ] }
-        { "{" [ parse-slot-values assoc>tuple ] }
-        { "}" [ new ] }
+        { "f" [ drop \ } parse-until boa>object ] }
+        { "{" [ parse-slot-values assoc>object ] }
+        { "}" [ drop new ] }
         [ bad-literal-tuple ]
     } case ;
 
 : parse-tuple-literal ( -- tuple )
-    scan-word parse-tuple-literal-slots ;
+    scan-word dup all-slots parse-tuple-literal-slots ;
index 8e49e2f5f44990db37bfba9a42cf61dd95690111..0a437a3d6968918670a40cd91ebc7e5f4dae8fe5 100755 (executable)
@@ -29,7 +29,7 @@ PREDICATE: immutable-tuple-class < tuple-class ( class -- ? )
 : layout-of ( tuple -- layout )
     1 slot { array } declare ; inline
 
-M: tuple class layout-of 2 slot { word } declare ;
+M: tuple class layout-of 2 slot { word } declare ; inline
 
 : tuple-size ( tuple -- size )
     layout-of 3 slot { fixnum } declare ; inline
@@ -323,7 +323,7 @@ M: tuple-class (classes-intersect?)
         [ swap classes-intersect? ]
     } cond ;
 
-M: tuple clone (clone) ;
+M: tuple clone (clone) ; inline
 
 M: tuple equal? over tuple? [ tuple= ] [ 2drop f ] if ;
 
index 3eb92738595188d03b661e890ee1829df316e6b8..37d4fd1195d0b72bf2992b0d04475268d33f86ea 100644 (file)
@@ -1,5 +1,5 @@
-IN: effects.tests
 USING: effects tools.test prettyprint accessors sequences ;
+IN: effects.tests
 
 [ t ] [ 1 1 <effect> 2 2 <effect> effect<= ] unit-test
 [ f ] [ 1 0 <effect> 2 2 <effect> effect<= ] unit-test
@@ -22,4 +22,4 @@ USING: effects tools.test prettyprint accessors sequences ;
 
 [ t ] [ (( -- )) (( -- )) compose-effects (( -- )) effect= ] unit-test
 [ t ] [ (( -- * )) (( -- )) compose-effects (( -- * )) effect= ] unit-test
-[ t ] [ (( -- )) (( -- * )) compose-effects (( -- * )) effect= ] unit-test
\ No newline at end of file
+[ t ] [ (( -- )) (( -- * )) compose-effects (( -- * )) effect= ] unit-test
index c8ed6da2aa3ce77cbcc906e255f1a7baec8e404c..66179c5e523f2109c713c50016315883f2e80624 100644 (file)
@@ -24,9 +24,11 @@ ERROR: bad-effect ;
 : parse-effect-tokens ( end -- tokens )
     [ parse-effect-token dup ] curry [ ] produce nip ;
 
+ERROR: stack-effect-omits-dashes effect ;
+
 : parse-effect ( end -- effect )
     parse-effect-tokens { "--" } split1 dup
-    [ <effect> ] [ "Stack effect declaration must contain --" throw ] if ;
+    [ <effect> ] [ drop stack-effect-omits-dashes ] if ;
 
 : complete-effect ( -- effect )
     "(" expect ")" parse-effect ;
index 51e122431cfcffbc3b5b2bd5b775d421bbbb0778..2279fd019cf5c9d4680583ee9b1c6ef1d93b11ca 100644 (file)
@@ -1,5 +1,5 @@
-IN: generic.math.tests
 USING: generic.math math tools.test kernel ;
+IN: generic.math.tests
 
 ! Test math-combination
 [ [ [ >float ] dip ] ] [ \ real \ float math-upgrade ] unit-test
index 61ae4e1ba1090db669be21602f03af8ebc88ac22..f59268b770312caa7566d8bfe88a4d5adf969753 100644 (file)
@@ -1,10 +1,10 @@
-IN: generic.single.tests
 USING: tools.test math math.functions math.constants generic.standard
 generic.single strings sequences arrays kernel accessors words
 specialized-arrays.double byte-arrays bit-arrays parser namespaces
 make quotations stack-checker vectors growable hashtables sbufs
 prettyprint byte-vectors bit-vectors specialized-vectors.double
 definitions generic sets graphs assocs grouping see eval ;
+IN: generic.single.tests
 
 GENERIC: lo-tag-test ( obj -- obj' )
 
@@ -279,4 +279,4 @@ M: growable call-next-hooker call-next-method "growable " prepend ;
 ! Corner case
 [ "IN: generic.single.tests GENERIC# broken-generic# -1 ( a -- b )" eval( -- ) ]
 [ error>> bad-dispatch-position? ]
-must-fail-with
\ No newline at end of file
+must-fail-with
index 88387abd5cfcc0daee887e41046dff8acb12d214..8a53368062d285979c9505670b0765a797287654 100644 (file)
@@ -208,9 +208,11 @@ SYMBOL: predicate-engines
 : keep-going? ( assoc -- ? )
     assumed get swap second first class<= ;
 
+ERROR: unreachable ;
+
 : prune-redundant-predicates ( assoc -- default assoc' )
     {
-        { [ dup empty? ] [ drop [ "Unreachable" throw ] { } ] }
+        { [ dup empty? ] [ drop [ unreachable ] { } ] }
         { [ dup length 1 = ] [ first second { } ] }
         { [ dup keep-going? ] [ rest-slice prune-redundant-predicates ] }
         [ [ first second ] [ rest-slice ] bi ]
index 754a3293d1dada28cf8fee3d51d9890f7cf96d7d..68a8de3d43072c0913164aa78de6912da4a4490d 100644 (file)
@@ -9,9 +9,9 @@ MIXIN: growable
 SLOT: length
 SLOT: underlying
 
-M: growable length length>> ;
-M: growable nth-unsafe underlying>> nth-unsafe ;
-M: growable set-nth-unsafe underlying>> set-nth-unsafe ;
+M: growable length length>> ; inline
+M: growable nth-unsafe underlying>> nth-unsafe ; inline
+M: growable set-nth-unsafe underlying>> set-nth-unsafe ; inline
 
 : capacity ( seq -- n ) underlying>> length ; inline
 
@@ -49,21 +49,21 @@ M: growable set-length ( n seq -- )
         [ >fixnum ] dip
     ] if ; inline
 
-M: growable set-nth ensure set-nth-unsafe ;
+M: growable set-nth ensure set-nth-unsafe ; inline
 
-M: growable clone (clone) [ clone ] change-underlying ;
+M: growable clone (clone) [ clone ] change-underlying ; inline
 
 M: growable lengthen ( n seq -- )
     2dup length > [
         2dup capacity > [ over new-size over expand ] when
         2dup (>>length)
-    ] when 2drop ;
+    ] when 2drop ; inline
 
 M: growable shorten ( n seq -- )
     growable-check
     2dup length < [
         2dup contract
         2dup (>>length)
-    ] when 2drop ;
+    ] when 2drop ; inline
 
 INSTANCE: growable sequence
index 004b543c7f879936e1f255204e423ff10240fb0e..54e58c0282729653e990cf8052d7fab3c3bcd66f 100644 (file)
@@ -1,7 +1,7 @@
-IN: hashtables.tests
 USING: kernel math namespaces make tools.test vectors sequences
 sequences.private hashtables io prettyprint assocs
 continuations ;
+IN: hashtables.tests
 
 [ f ] [ "hi" V{ 1 2 3 } at ] unit-test
 
@@ -178,4 +178,4 @@ H{ } "x" set
 [ 1 ] [ 2 "h" get at ] unit-test
 
 ! Random test case
-[ "A" ] [ 100 [ dup ] H{ } map>assoc 32 over delete-at "A" 32 pick set-at 32 swap at ] unit-test
\ No newline at end of file
+[ "A" ] [ 100 [ dup ] H{ } map>assoc 32 over delete-at "A" 32 pick set-at 32 swap at ] unit-test
index 03bc3e01fd0d3a4a34488ffec18a6ac17ca60a4b..8547f53a0efb7c2a7e186dc1ab98b508a26e2063 100644 (file)
@@ -112,7 +112,7 @@ M: hashtable delete-at ( key hash -- )
     ] if ;
 
 M: hashtable assoc-size ( hash -- n )
-    [ count>> ] [ deleted>> ] bi - ;
+    [ count>> ] [ deleted>> ] bi - ; inline
 
 : rehash ( hash -- )
     dup >alist [
@@ -150,7 +150,7 @@ M: hashtable >alist
     ] keep { } like ;
 
 M: hashtable clone
-    (clone) [ clone ] change-array ;
+    (clone) [ clone ] change-array ; inline
 
 M: hashtable equal?
     over hashtable? [
@@ -159,15 +159,15 @@ M: hashtable equal?
     ] [ 2drop f ] if ;
 
 ! Default method
-M: assoc new-assoc drop <hashtable> ;
+M: assoc new-assoc drop <hashtable> ; inline
 
-M: f new-assoc drop <hashtable> ;
+M: f new-assoc drop <hashtable> ; inline
 
 : >hashtable ( assoc -- hashtable )
     H{ } assoc-clone-like ;
 
 M: hashtable assoc-like
-    drop dup hashtable? [ >hashtable ] unless ;
+    drop dup hashtable? [ >hashtable ] unless ; inline
 
 : ?set-at ( value key assoc/f -- assoc )
     [ [ set-at ] keep ] [ associate ] if* ;
index c3d7e8e89bf3f7b55205d3c45507c640b9dbea6a..7d668eeab117578d28cdd06843fd9bbbd928a009 100644 (file)
@@ -1,4 +1,4 @@
-IN: io.backend.tests
 USING: tools.test io.backend kernel ;
+IN: io.backend.tests
 
 [ ] [ "a" normalize-path drop ] unit-test
index 4846b06f32d29023bbf2d257a24c2554d3852b61..2911385c0990afd1f832108ba0282e5260d0bfe7 100755 (executable)
@@ -40,7 +40,7 @@ SINGLETON: utf8
     dup stream-read1 dup [ begin-utf8 ] when nip ; inline
 
 M: utf8 decode-char
-    drop decode-utf8 ;
+    drop decode-utf8 ; inline
 
 ! Encoding UTF-8
 
@@ -73,14 +73,14 @@ M: utf8 encode-char
 PRIVATE>
 
 : code-point-length ( n -- x )
-    dup zero? [ drop 1 ] [
+    [ 1 ] [
         log2 {
             { [ dup 0 6 between? ] [ 1 ] }
             { [ dup 7 10 between? ] [ 2 ] }
             { [ dup 11 15 between? ] [ 3 ] }
             { [ dup 16 20 between? ] [ 4 ] }
         } cond nip
-    ] if ;
+    ] if-zero ;
 
 : code-point-offsets ( string -- indices )
     0 [ code-point-length + ] accumulate swap suffix ;
index 43a8373232d9c9c397d32db00a0e3f466c8ff220..3a08dd10d97907caa3365e628ccc18b5efcd508e 100644 (file)
@@ -1,5 +1,5 @@
 USING: tools.test io.streams.byte-array io.encodings.binary
-io.encodings.utf8 io kernel arrays strings namespaces ;
+io.encodings.utf8 io kernel arrays strings namespaces math ;
 
 [ B{ } ] [ B{ } binary [ contents ] with-byte-reader ] unit-test
 [ B{ 1 2 3 } ] [ binary [ B{ 1 2 3 } write ] with-byte-writer ] unit-test
@@ -28,3 +28,8 @@ io.encodings.utf8 io kernel arrays strings namespaces ;
         read1
     ] with-byte-reader
 ] unit-test
+
+! Overly aggressive compiler optimizations
+[ B{ 123 } ] [
+    binary [ 123 >bignum write1 ] with-byte-writer
+] unit-test
\ No newline at end of file
index ad5453af6174eae2dc7b41127d2f212c01574d8e..e7b4338388c49a1ab22ed3a634299697aa915080 100644 (file)
@@ -12,4 +12,4 @@ M: memory-stream stream-element-type drop +byte+ ;
 
 M: memory-stream stream-read1
     [ [ alien>> ] [ index>> ] bi alien-unsigned-1 ]
-    [ [ 1+ ] change-index drop ] bi ;
+    [ [ 1 + ] change-index drop ] bi ;
index d6350e0420241ffbd5d2001f3c75f9d1805db265..838d877a40e71403264fcbe5a130206d4322203b 100644 (file)
@@ -192,19 +192,19 @@ UNION: boolean POSTPONE: t POSTPONE: f ;
 ! Object protocol
 GENERIC: hashcode* ( depth obj -- code )
 
-M: object hashcode* 2drop 0 ;
+M: object hashcode* 2drop 0 ; inline
 
-M: f hashcode* 2drop 31337 ;
+M: f hashcode* 2drop 31337 ; inline
 
 : hashcode ( obj -- code ) 3 swap hashcode* ; inline
 
 GENERIC: equal? ( obj1 obj2 -- ? )
 
-M: object equal? 2drop f ;
+M: object equal? 2drop f ; inline
 
 TUPLE: identity-tuple ;
 
-M: identity-tuple equal? 2drop f ;
+M: identity-tuple equal? 2drop f ; inline
 
 : = ( obj1 obj2 -- ? )
     2dup eq? [ 2drop t ] [
@@ -213,9 +213,9 @@ M: identity-tuple equal? 2drop f ;
 
 GENERIC: clone ( obj -- cloned )
 
-M: object clone ;
+M: object clone ; inline
 
-M: callstack clone (clone) ;
+M: callstack clone (clone) ; inline
 
 ! Tuple construction
 GENERIC: new ( class -- tuple )
index b0c5d8cfda69a13d7582b0c50aa35fc4df0b2e09..5a39f2462742afb8e2e93f04dad2242032aa61a9 100644 (file)
@@ -1,5 +1,5 @@
-IN: system.tests\r
 USING: layouts math tools.test ;\r
+IN: system.tests\r
 \r
 [ t ] [ cell integer? ] unit-test\r
 [ t ] [ bootstrap-cell integer? ] unit-test\r
index 42898fc085dba73c2d64e54df916ca6ba855a972..5738c2ec99ac0089964d335192af95f8b51ecff5 100644 (file)
@@ -78,6 +78,6 @@ M: bignum >integer
 
 M: real >integer
     dup most-negative-fixnum most-positive-fixnum between?
-    [ >fixnum ] [ >bignum ] if ;
+    [ >fixnum ] [ >bignum ] if ; inline
 
 UNION: immediate fixnum POSTPONE: f ;
index 036c7d9721bc48cf7575d2c942e33ea039b2d1d2..b3bd3cacdb7f49fe13762d53a6245b4880a35c9d 100644 (file)
@@ -49,7 +49,7 @@ M: lexer skip-word ( lexer -- )
     ] change-lexer-column ;
 
 : still-parsing? ( lexer -- ? )
-    [ line>> ] [ text>> ] bi length <= ;
+    [ line>> ] [ text>> length ] bi <= ;
 
 : still-parsing-line? ( lexer -- ? )
     [ column>> ] [ line-length>> ] bi < ;
index 1305f2a18d7eac4cb70a4123c0629efb1a4d0a5e..ed4947e1f569e8f43733c20a1067dfdc33c19394 100644 (file)
@@ -10,21 +10,21 @@ HELP: >float
 
 HELP: bits>double ( n -- x )
 { $values { "n" "a 64-bit integer representing an IEEE 754 double-precision float" } { "x" float } }
-{ $description "Creates a " { $link float } " object from a binary representation. This word is usually used to reconstruct floats read from streams." } ;
+{ $description "Creates a " { $link float } " object from a 64-bit binary representation. This word is usually used to reconstruct floats read from streams." } ;
 
 { bits>double bits>float double>bits float>bits } related-words
 
 HELP: bits>float ( n -- x )
 { $values { "n" "a 32-bit integer representing an IEEE 754 single-precision float" } { "x" float } }
-{ $description "Creates a " { $link float } " object from a binary representation. This word is usually used to reconstruct floats read from streams." } ;
+{ $description "Creates a " { $link float } " object from a 32-bit binary representation. This word is usually used to reconstruct floats read from streams." } ;
 
 HELP: double>bits ( x -- n )
 { $values { "x" float } { "n" "a 64-bit integer representing an IEEE 754 double-precision float" } }
-{ $description "Creates a " { $link float } " object from a binary representation. This word is usually used to reconstruct floats read from streams." } ;
+{ $description "Creates a 64-bit binary representation of a " { $link float } " object. This can be used in the process of writing a float to a stream." } ;
 
 HELP: float>bits ( x -- n )
 { $values { "x" float } { "n" "a 32-bit integer representing an IEEE 754 single-precision float" } }
-{ $description "Creates a " { $link float } " object from a binary representation. This word is usually used to reconstruct floats read from streams." } ;
+{ $description "Creates a 32-bit binary representation of a " { $link float } " object. This can be used in the process of writing a float to a stream." } ;
 
 ! Unsafe primitives
 HELP: float+ ( x y -- z )
index 2a22dc4330c12ebebe3b6c5cbc040401c6d59d51..661bccd88c59228542b759b7ddb28ea7de4f41fe 100644 (file)
@@ -1,30 +1,64 @@
-! Copyright (C) 2004, 2006 Slava Pestov.
+! Copyright (C) 2004, 2009 Slava Pestov, Joe Groff.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel math math.private ;
 IN: math.floats.private
 
-M: fixnum >float fixnum>float ;
-M: bignum >float bignum>float ;
+M: fixnum >float fixnum>float ; inline
+M: bignum >float bignum>float ; inline
 
-M: float >fixnum float>fixnum ;
-M: float >bignum float>bignum ;
-M: float >float ;
+M: float >fixnum float>fixnum ; inline
+M: float >bignum float>bignum ; inline
+M: float >float ; inline
 
-M: float hashcode* nip float>bits ;
-M: float equal? over float? [ float= ] [ 2drop f ] if ;
-M: float number= float= ;
+M: float hashcode* nip float>bits ; inline
+M: float equal? over float? [ float= ] [ 2drop f ] if ; inline
+M: float number= float= ; inline
 
-M: float < float< ;
-M: float <= float<= ;
-M: float > float> ;
-M: float >= float>= ;
+M: float < float< ; inline
+M: float <= float<= ; inline
+M: float > float> ; inline
+M: float >= float>= ; inline
 
-M: float + float+ ;
-M: float - float- ;
-M: float * float* ;
-M: float / float/f ;
-M: float /f float/f ;
-M: float /i float/f >integer ;
-M: float mod float-mod ;
+M: float + float+ ; inline
+M: float - float- ; inline
+M: float * float* ; inline
+M: float / float/f ; inline
+M: float /f float/f ; inline
+M: float /i float/f >integer ; inline
+M: float mod float-mod ; inline
 
-M: real abs dup 0 < [ neg ] when ;
+M: real abs dup 0 < [ neg ] when ; inline
+
+M: float fp-special?
+    double>bits -52 shift HEX: 7ff [ bitand ] keep = ; inline
+
+M: float fp-nan-payload
+    double>bits 52 2^ 1 - bitand ; inline
+
+M: float fp-nan?
+    dup fp-special? [ fp-nan-payload zero? not ] [ drop f ] if ; inline
+
+M: float fp-qnan?
+    dup fp-nan? [ fp-nan-payload 51 2^ bitand zero? not ] [ drop f ] if ; inline
+
+M: float fp-snan?
+    dup fp-nan? [ fp-nan-payload 51 2^ bitand zero? ] [ drop f ] if ; inline
+
+M: float fp-infinity?
+    dup fp-special? [ fp-nan-payload zero? ] [ drop f ] if ; inline
+
+M: float next-float ( m -- n )
+    double>bits
+    dup -0.0 double>bits > [ 1 - bits>double ] [ ! negative non-zero
+        dup -0.0 double>bits = [ drop 0.0 ] [ ! negative zero
+            1 + bits>double ! positive
+        ] if
+    ] if ; inline
+
+M: float prev-float ( m -- n )
+    double>bits
+    dup -0.0 double>bits >= [ 1 + bits>double ] [ ! negative
+        dup 0.0 double>bits = [ drop -0.0 ] [ ! positive zero
+            1 - bits>double ! positive non-zero
+        ] if
+    ] if ; inline
index bb7fc107b2aec2a255f1ba1f048dcd8ff79907b3..75abd8087e3cccf0edc9fd22af5fb2468077b1cb 100644 (file)
@@ -5,79 +5,79 @@ USING: kernel kernel.private sequences
 sequences.private math math.private combinators ;
 IN: math.integers.private
 
-M: integer numerator ;
-M: integer denominator drop 1 ;
+M: integer numerator ; inline
+M: integer denominator drop 1 ; inline
 
-M: fixnum >fixnum ;
-M: fixnum >bignum fixnum>bignum ;
-M: fixnum >integer ;
+M: fixnum >fixnum ; inline
+M: fixnum >bignum fixnum>bignum ; inline
+M: fixnum >integer ; inline
 
-M: fixnum hashcode* nip ;
-M: fixnum equal? over bignum? [ >bignum bignum= ] [ 2drop f ] if ;
-M: fixnum number= eq? ;
+M: fixnum hashcode* nip ; inline
+M: fixnum equal? over bignum? [ >bignum bignum= ] [ 2drop f ] if ; inline
+M: fixnum number= eq? ; inline
 
-M: fixnum < fixnum< ;
-M: fixnum <= fixnum<= ;
-M: fixnum > fixnum> ;
-M: fixnum >= fixnum>= ;
+M: fixnum < fixnum< ; inline
+M: fixnum <= fixnum<= ; inline
+M: fixnum > fixnum> ; inline
+M: fixnum >= fixnum>= ; inline
 
-M: fixnum + fixnum+ ;
-M: fixnum - fixnum- ;
-M: fixnum * fixnum* ;
-M: fixnum /i fixnum/i ;
-M: fixnum /f [ >float ] dip >float float/f ;
+M: fixnum + fixnum+ ; inline
+M: fixnum - fixnum- ; inline
+M: fixnum * fixnum* ; inline
+M: fixnum /i fixnum/i ; inline
+M: fixnum /f [ >float ] dip >float float/f ; inline
 
-M: fixnum mod fixnum-mod ;
+M: fixnum mod fixnum-mod ; inline
 
-M: fixnum /mod fixnum/mod ;
+M: fixnum /mod fixnum/mod ; inline
 
-M: fixnum bitand fixnum-bitand ;
-M: fixnum bitor fixnum-bitor ;
-M: fixnum bitxor fixnum-bitxor ;
-M: fixnum shift >fixnum fixnum-shift ;
+M: fixnum bitand fixnum-bitand ; inline
+M: fixnum bitor fixnum-bitor ; inline
+M: fixnum bitxor fixnum-bitxor ; inline
+M: fixnum shift >fixnum fixnum-shift ; inline
 
-M: fixnum bitnot fixnum-bitnot ;
+M: fixnum bitnot fixnum-bitnot ; inline
 
-M: fixnum bit? neg shift 1 bitand 0 > ;
+M: fixnum bit? neg shift 1 bitand 0 > ; inline
 
 : fixnum-log2 ( x -- n )
     0 swap [ dup 1 eq? ] [ [ 1 + ] [ 2/ ] bi* ] until drop ;
 
-M: fixnum (log2) fixnum-log2 ;
+M: fixnum (log2) fixnum-log2 ; inline
 
-M: bignum >fixnum bignum>fixnum ;
-M: bignum >bignum ;
+M: bignum >fixnum bignum>fixnum ; inline
+M: bignum >bignum ; inline
 
 M: bignum hashcode* nip >fixnum ;
 
 M: bignum equal?
     over bignum? [ bignum= ] [
         swap dup fixnum? [ >bignum bignum= ] [ 2drop f ] if
-    ] if ;
+    ] if ; inline
 
-M: bignum number= bignum= ;
+M: bignum number= bignum= ; inline
 
-M: bignum < bignum< ;
-M: bignum <= bignum<= ;
-M: bignum > bignum> ;
-M: bignum >= bignum>= ;
+M: bignum < bignum< ; inline
+M: bignum <= bignum<= ; inline
+M: bignum > bignum> ; inline
+M: bignum >= bignum>= ; inline
 
-M: bignum + bignum+ ;
-M: bignum - bignum- ;
-M: bignum * bignum* ;
-M: bignum /i bignum/i ;
-M: bignum mod bignum-mod ;
+M: bignum + bignum+ ; inline
+M: bignum - bignum- ; inline
+M: bignum * bignum* ; inline
+M: bignum /i bignum/i ; inline
+M: bignum mod bignum-mod ; inline
 
-M: bignum /mod bignum/mod ;
+M: bignum /mod bignum/mod ; inline
 
-M: bignum bitand bignum-bitand ;
-M: bignum bitor bignum-bitor ;
-M: bignum bitxor bignum-bitxor ;
-M: bignum shift >fixnum bignum-shift ;
+M: bignum bitand bignum-bitand ; inline
+M: bignum bitor bignum-bitor ; inline
+M: bignum bitxor bignum-bitxor ; inline
+M: bignum shift >fixnum bignum-shift ; inline
 
-M: bignum bitnot bignum-bitnot ;
-M: bignum bit? bignum-bit? ;
-M: bignum (log2) bignum-log2 ;
+M: bignum bitnot bignum-bitnot ; inline
+M: bignum bit? bignum-bit? ; inline
+M: bignum (log2) bignum-log2 ; inline
 
 ! Converting ratios to floats. Based on FLOAT-RATIO from
 ! sbcl/src/code/float.lisp, which has the following license:
@@ -121,14 +121,14 @@ M: bignum (log2) bignum-log2 ;
     over zero? [
         2drop 0.0
     ] [
-        dup zero? [
-            2drop 1/0.
+        [
+            drop 1/0.
         ] [
             pre-scale
             /f-loop over odd?
             [ zero? [ 1 + ] unless ] [ drop ] if
             post-scale
-        ] if
+        ] if-zero
     ] if ; inline
 
 M: bignum /f ( m n -- f )
index 55a50cd5d799f4575620315faf8c6ba2215d62bf..853aca5969d3516b6a0207dfd4bf2999833091ac 100644 (file)
@@ -151,7 +151,7 @@ HELP: bitnot
 { $description "Computes the bitwise complement of the input; that is, each bit in the input number is flipped." }
 { $notes "This word implements bitwise not, so applying it to booleans will throw an error. Boolean not is the " { $link not } " word."
 $nl
-"Due to the two's complement representation of signed integers, the following two lines are equivalent:" { $code "bitnot" "neg 1-" } } ;
+"Due to the two's complement representation of signed integers, the following two lines are equivalent:" { $code "bitnot" "neg 1 -" } } ;
 
 HELP: bit?
 { $values { "x" integer } { "n" integer } { "?" "a boolean" } }
@@ -163,22 +163,6 @@ HELP: log2
 { $description "Outputs the largest integer " { $snippet "n" } " such that " { $snippet "2^n" } " is less than or equal to " { $snippet "x" } "." }
 { $errors "Throws an error if " { $snippet "x" } " is zero or negative." } ;
 
-HELP: 1+
-{ $values { "x" number } { "y" number } }
-{ $description
-    "Increments a number by 1. The following two lines are equivalent:"
-    { $code "1+" "1 +" }
-    "There is no difference in behavior or efficiency."
-} ;
-
-HELP: 1-
-{ $values { "x" number } { "y" number } }
-{ $description
-    "Decrements a number by 1. The following two lines are equivalent:"
-    { $code "1-" "1 -" }
-    "There is no difference in behavior or efficiency."
-} ;
-
 HELP: ?1+
 { $values { "x" { $maybe number } } { "y" number } }
 { $description "If the input is not " { $link f } ", adds one. Otherwise, outputs a " { $snippet "0" } "." } ;
@@ -213,9 +197,9 @@ HELP: sgn
 { $description
     "Outputs one of the following:"
     { $list
-        "-1 if " { $snippet "x" } " is negative"
-        "0 if " { $snippet "x" } " is equal to 0"
-        "1 if " { $snippet "x" } " is positive"
+        { "-1 if " { $snippet "x" } " is negative" }
+        { "0 if " { $snippet "x" } " is equal to 0" }
+        { "1 if " { $snippet "x" } " is positive" }
     }
 } ;
 
@@ -237,6 +221,49 @@ HELP: zero?
 { $values { "x" number } { "?" "a boolean" } }
 { $description "Tests if the number is equal to zero." } ;
 
+HELP: if-zero
+{ $values { "n" number } { "quot1" quotation } { "quot2" quotation } }
+{ $description "Makes an implicit check if the number is zero. A zero is dropped and " { $snippet "quot1" } " is called. Otherwise, if the number is not zero, " { $snippet "quot2" } " is called on it." }
+{ $example
+    "USING: kernel math prettyprint sequences ;"
+    "3 [ \"zero\" ] [ sq ] if-zero ."
+    "9"
+} ;
+
+HELP: when-zero
+{ $values
+     { "n" number } { "quot" "the first quotation of an " { $link if-zero } } }
+{ $description "Makes an implicit check if the sequence is empty. A zero is dropped and the " { $snippet "quot" } " is called." }
+{ $examples "This word is equivalent to " { $link if-zero } " with an empty second quotation:"
+    { $example
+    "USING: math prettyprint ;"
+    "0 [ 4 ] [ ] if-zero ."
+    "4"
+    }
+    { $example
+    "USING: math prettyprint ;"
+    "0 [ 4 ] when-zero ."
+    "4"
+    }
+} ;
+
+HELP: unless-zero
+{ $values
+     { "n" number } { "quot" "the second quotation of an " { $link if-empty } } }
+{ $description "Makes an implicit check if the number is zero. A zero is dropped. Otherwise, the " { $snippet "quot" } " is called on the number." }
+{ $examples "This word is equivalent to " { $link if-zero } " with an empty first quotation:"
+    { $example
+    "USING: sequences math prettyprint ;"
+    "3 [ ] [ sq ] if-empty ."
+    "9"
+    }
+    { $example
+    "USING: sequences math prettyprint ;"
+    "3 [ sq ] unless-zero ."
+    "9"
+    }
+} ;
+
 HELP: times
 { $values { "n" integer } { "quot" quotation } }
 { $description "Calls the quotation " { $snippet "n" } " times." }
index 28efbaa26e4a099b8c7502b2f6cef23f13573a54..e6c34c112c11da5e4fae85a5e394f759fc6ea864 100755 (executable)
@@ -48,16 +48,16 @@ GENERIC: (log2) ( x -- n ) foldable
 
 PRIVATE>
 
+ERROR: log2-expects-positive x ;
+
 : log2 ( x -- n )
     dup 0 <= [
-        "log2 expects positive inputs" throw
+        log2-expects-positive
     ] [
         (log2)
     ] if ; inline
 
 : zero? ( x -- ? ) 0 number= ; inline
-: 1+ ( x -- y ) 1 + ; inline
-: 1- ( x -- y ) 1 - ; inline
 : 2/ ( x -- y ) -1 shift ; inline
 : sq ( x -- y ) dup * ; inline
 : neg ( x -- -x ) -1 * ; inline
@@ -69,6 +69,13 @@ PRIVATE>
 : even? ( n -- ? ) 1 bitand zero? ;
 : odd? ( n -- ? ) 1 bitand 1 number= ;
 
+: if-zero ( n quot1 quot2 -- )
+    [ dup zero? ] [ [ drop ] prepose ] [ ] tri* if ; inline
+
+: when-zero ( n quot -- ) [ ] if-zero ; inline
+
+: unless-zero ( n quot -- ) [ ] swap if-zero ; inline
+
 UNION: integer fixnum bignum ;
 
 TUPLE: ratio { numerator integer read-only } { denominator integer read-only } ;
@@ -90,55 +97,18 @@ GENERIC: fp-snan? ( x -- ? )
 GENERIC: fp-infinity? ( x -- ? )
 GENERIC: fp-nan-payload ( x -- bits )
 
-M: object fp-special?
-    drop f ;
-M: object fp-nan?
-    drop f ;
-M: object fp-qnan?
-    drop f ;
-M: object fp-snan?
-    drop f ;
-M: object fp-infinity?
-    drop f ;
-M: object fp-nan-payload
-    drop f ;
-
-M: float fp-special?
-    double>bits -52 shift HEX: 7ff [ bitand ] keep = ;
-
-M: float fp-nan-payload
-    double>bits HEX: fffffffffffff bitand ; foldable flushable
-
-M: float fp-nan?
-    dup fp-special? [ fp-nan-payload zero? not ] [ drop f ] if ;
-
-M: float fp-qnan?
-    dup fp-nan? [ fp-nan-payload HEX: 8000000000000 bitand zero? not ] [ drop f ] if ;
-
-M: float fp-snan?
-    dup fp-nan? [ fp-nan-payload HEX: 8000000000000 bitand zero? ] [ drop f ] if ;
-
-M: float fp-infinity?
-    dup fp-special? [ fp-nan-payload zero? ] [ drop f ] if ;
+M: object fp-special? drop f ; inline
+M: object fp-nan? drop f ; inline
+M: object fp-qnan? drop f ; inline
+M: object fp-snan? drop f ; inline
+M: object fp-infinity? drop f ; inline
+M: object fp-nan-payload drop f ; inline
 
 : <fp-nan> ( payload -- nan )
-    HEX: 7ff0000000000000 bitor bits>double ; foldable flushable
+    HEX: 7ff0000000000000 bitor bits>double ; inline
 
-: next-float ( m -- n )
-    double>bits
-    dup -0.0 double>bits > [ 1 - bits>double ] [ ! negative non-zero
-        dup -0.0 double>bits = [ drop 0.0 ] [ ! negative zero
-            1 + bits>double ! positive
-        ] if
-    ] if ; foldable flushable
-
-: prev-float ( m -- n )
-    double>bits
-    dup -0.0 double>bits >= [ 1 + bits>double ] [ ! negative
-        dup 0.0 double>bits = [ drop -0.0 ] [ ! positive zero
-            1 - bits>double ! positive non-zero
-        ] if
-    ] if ; foldable flushable
+GENERIC: next-float ( m -- n )
+GENERIC: prev-float ( m -- n )
 
 : next-power-of-2 ( m -- n )
     dup 2 <= [ drop 2 ] [ 1 - log2 1 + 2^ ] if ; inline
index 435eec9b96102af3922ad6b492ada0bbe04568d6..707dc02af217c4f6e232a45ddca1eb0a1a231a55 100644 (file)
@@ -15,24 +15,24 @@ GENERIC: <=> ( obj1 obj2 -- <=> )
 
 : >=< ( obj1 obj2 -- >=< ) <=> invert-comparison ; inline
 
-M: real <=> 2dup < [ 2drop +lt+ ] [ number= +eq+ +gt+ ? ] if ;
+M: real <=> 2dup < [ 2drop +lt+ ] [ number= +eq+ +gt+ ? ] if ; inline
 
 GENERIC: before? ( obj1 obj2 -- ? )
 GENERIC: after? ( obj1 obj2 -- ? )
 GENERIC: before=? ( obj1 obj2 -- ? )
 GENERIC: after=? ( obj1 obj2 -- ? )
 
-M: object before? ( obj1 obj2 -- ? ) <=> +lt+ eq? ;
-M: object after? ( obj1 obj2 -- ? ) <=> +gt+ eq? ;
-M: object before=? ( obj1 obj2 -- ? ) <=> +gt+ eq? not ;
-M: object after=? ( obj1 obj2 -- ? ) <=> +lt+ eq? not ;
+M: object before? ( obj1 obj2 -- ? ) <=> +lt+ eq? ; inline
+M: object after? ( obj1 obj2 -- ? ) <=> +gt+ eq? ; inline
+M: object before=? ( obj1 obj2 -- ? ) <=> +gt+ eq? not ; inline
+M: object after=? ( obj1 obj2 -- ? ) <=> +lt+ eq? not ; inline
 
-M: real before? ( obj1 obj2 -- ? ) < ;
-M: real after? ( obj1 obj2 -- ? ) > ;
-M: real before=? ( obj1 obj2 -- ? ) <= ;
-M: real after=? ( obj1 obj2 -- ? ) >= ;
+M: real before? ( obj1 obj2 -- ? ) < ; inline
+M: real after? ( obj1 obj2 -- ? ) > ; inline
+M: real before=? ( obj1 obj2 -- ? ) <= ; inline
+M: real after=? ( obj1 obj2 -- ? ) >= ; inline
 
-: min ( x y -- z ) [ before? ] most ; inline 
+: min ( x y -- z ) [ before? ] most ; inline
 : max ( x y -- z ) [ after? ] most ; inline
 : clamp ( x min max -- y ) [ max ] dip min ; inline
 
index c655965e353f817e10e9e190c4a33728f870eabd..2b440b24d43972f23021c6cc5206bbdc5015b201 100644 (file)
@@ -25,6 +25,14 @@ unit-test
 [ "e" string>number ]
 unit-test
 
+[ 100000 ]
+[ "100,000" string>number ]
+unit-test
+
+[ 100000.0 ]
+[ "100,000.0" string>number ]
+unit-test
+
 [ "100.0" ]
 [ "1.0e2" string>number number>string ]
 unit-test
index 437308d53f8f316f5c4c3e2b372630fc283db028..21062baf4bbe985c8d007023720a2d28eb560846 100644 (file)
@@ -28,13 +28,16 @@ IN: math.parser
         { CHAR: d 13 }
         { CHAR: e 14 }
         { CHAR: f 15 }
-    } at 255 or ; inline
+        { CHAR: , f }
+    } at* [ drop 255 ] unless ; inline
 
 : string>digits ( str -- digits )
     [ digit> ] B{ } map-as ; inline
 
 : (digits>integer) ( valid? accum digit radix -- valid? accum )
-    2dup < [ swapd * + ] [ 2drop 2drop f 0 ] if ; inline
+    over [
+        2dup < [ swapd * + ] [ 2drop 2drop f 0 ] if
+    ] [ 2drop ] if ; inline
 
 : each-digit ( seq radix quot -- n/f )
     [ t 0 ] 3dip curry each swap [ drop f ] unless ; inline
@@ -80,6 +83,7 @@ SYMBOL: negative?
     ] if ; inline
 
 : string>float ( str -- n/f )
+    [ CHAR: , eq? not ] filter
     >byte-array 0 suffix (string>float) ;
 
 PRIVATE>
@@ -131,7 +135,7 @@ M: ratio >base
     [
         dup 0 < negative? set
         abs 1 /mod
-        [ dup zero? [ drop "" ] [ (>base) sign append ] if ]
+        [ [ "" ] [ (>base) sign append ] if-zero ]
         [
             [ numerator (>base) ]
             [ denominator (>base) ] bi
index 0b2c170c1e6dacb46f29af1afae00b77256b4942..49b6ec137406cccc9901231e0bcdcc914f4b47a0 100644 (file)
@@ -11,24 +11,24 @@ TUPLE: sbuf
 : <sbuf> ( n -- sbuf ) 0 <string> 0 sbuf boa ; inline
 
 M: sbuf set-nth-unsafe
-    [ >fixnum ] [ >fixnum ] [ underlying>> ] tri* set-string-nth ;
+    [ >fixnum ] [ >fixnum ] [ underlying>> ] tri* set-string-nth ; inline
 
 M: sbuf new-sequence
-    drop [ 0 <string> ] [ >fixnum ] bi sbuf boa ;
+    drop [ 0 <string> ] [ >fixnum ] bi sbuf boa ; inline
 
 : >sbuf ( seq -- sbuf ) SBUF" " clone-like ; inline
 
 M: sbuf like
     drop dup sbuf? [
         dup string? [ dup length sbuf boa ] [ >sbuf ] if
-    ] unless ;
+    ] unless ; inline
 
-M: sbuf new-resizable drop <sbuf> ;
+M: sbuf new-resizable drop <sbuf> ; inline
 
 M: sbuf equal?
     over sbuf? [ sequence= ] [ 2drop f ] if ;
 
-M: string new-resizable drop <sbuf> ;
+M: string new-resizable drop <sbuf> ; inline
 
 M: string like
     #! If we have a string, we're done.
@@ -41,6 +41,6 @@ M: string like
             2dup length eq?
             [ nip dup reset-string-hashcode ] [ resize-string ] if
         ] [ >string ] if
-    ] unless ;
+    ] unless ; inline
 
 INSTANCE: sbuf growable
index 71d42705a2d71f0b98f149e95acc3bd5abd9fd3c..258b484764bffc04b4466d20b66d4657d76b176d 100755 (executable)
@@ -123,8 +123,6 @@ HELP: unless-empty
     }
 } ;
 
-{ if-empty when-empty unless-empty } related-words
-
 HELP: delete-all
 { $values { "seq" "a resizable sequence" } }
 { $description "Resizes the sequence to zero length, removing all elements. Not all sequences are resizable." }
@@ -1214,7 +1212,7 @@ HELP: follow
 { $examples "Get random numbers until zero is reached:"
     { $unchecked-example
     "USING: random sequences prettyprint math ;"
-    "100 [ random dup zero? [ drop f ] when ] follow ."
+    "100 [ random [ f ] when-zero ] follow ."
     "{ 100 86 34 32 24 11 7 2 }"
 } } ;
 
@@ -1393,6 +1391,14 @@ $nl
 $nl
 "More elaborate counted loops can be performed with " { $link "math.ranges" } "." ;
 
+ARTICLE: "sequences-if" "Control flow with sequences"
+"To reduce the boilerplate of checking if a sequence is empty, several combinators are provided."
+$nl
+"Checking if a sequence is empty:"
+{ $subsection if-empty }
+{ $subsection when-empty }
+{ $subsection unless-empty } ;
+
 ARTICLE: "sequences-access" "Accessing sequence elements"
 { $subsection ?nth }
 "Concise way of extracting one of the first four elements:"
@@ -1658,6 +1664,8 @@ $nl
 "Using sequences for looping:"
 { $subsection "sequences-integers" }
 { $subsection "math.ranges" }
+"Using sequences for control flow:"
+{ $subsection "sequences-if" }
 "For inner loops:"
 { $subsection "sequences-unsafe" } ;
 
index f0dc6d36c7da928ea0b4920b5afe6be1fb3462a3..031d5f7b4a2ce8102987ea1a8c02bc0ea2a94542 100755 (executable)
@@ -18,14 +18,14 @@ GENERIC: clone-like ( seq exemplar -- newseq ) flushable
 : new-like ( len exemplar quot -- seq )
     over [ [ new-sequence ] dip call ] dip like ; inline
 
-M: sequence like drop ;
+M: sequence like drop ; inline
 
 GENERIC: lengthen ( n seq -- )
 GENERIC: shorten ( n seq -- )
 
-M: sequence lengthen 2dup length > [ set-length ] [ 2drop ] if ;
+M: sequence lengthen 2dup length > [ set-length ] [ 2drop ] if ; inline
 
-M: sequence shorten 2dup length < [ set-length ] [ 2drop ] if ;
+M: sequence shorten 2dup length < [ set-length ] [ 2drop ] if ; inline
 
 : empty? ( seq -- ? ) length 0 = ; inline
 
@@ -82,25 +82,25 @@ GENERIC: resize ( n seq -- newseq ) flushable
 GENERIC: nth-unsafe ( n seq -- elt ) flushable
 GENERIC: set-nth-unsafe ( elt n seq -- )
 
-M: sequence nth bounds-check nth-unsafe ;
-M: sequence set-nth bounds-check set-nth-unsafe ;
+M: sequence nth bounds-check nth-unsafe ; inline
+M: sequence set-nth bounds-check set-nth-unsafe ; inline
 
-M: sequence nth-unsafe nth ;
-M: sequence set-nth-unsafe set-nth ;
+M: sequence nth-unsafe nth ; inline
+M: sequence set-nth-unsafe set-nth ; inline
 
 : change-nth-unsafe ( i seq quot -- )
     [ [ nth-unsafe ] dip call ] 3keep drop set-nth-unsafe ; inline
 
 ! The f object supports the sequence protocol trivially
-M: f length drop 0 ;
-M: f nth-unsafe nip ;
-M: f like drop [ f ] when-empty ;
+M: f length drop 0 ; inline
+M: f nth-unsafe nip ; inline
+M: f like drop [ f ] when-empty ; inline
 
 INSTANCE: f immutable-sequence
 
 ! Integers support the sequence protocol
-M: integer length ;
-M: integer nth-unsafe drop ;
+M: integer length ; inline
+M: integer nth-unsafe drop ; inline
 
 INSTANCE: integer immutable-sequence
 
@@ -113,8 +113,8 @@ TUPLE: iota { n integer read-only } ;
 
 <PRIVATE
 
-M: iota length n>> ;
-M: iota nth-unsafe drop ;
+M: iota length n>> ; inline
+M: iota nth-unsafe drop ; inline
 
 INSTANCE: iota immutable-sequence
 
@@ -185,12 +185,12 @@ MIXIN: virtual-sequence
 GENERIC: virtual-seq ( seq -- seq' )
 GENERIC: virtual@ ( n seq -- n' seq' )
 
-M: virtual-sequence nth virtual@ nth ;
-M: virtual-sequence set-nth virtual@ set-nth ;
-M: virtual-sequence nth-unsafe virtual@ nth-unsafe ;
-M: virtual-sequence set-nth-unsafe virtual@ set-nth-unsafe ;
-M: virtual-sequence like virtual-seq like ;
-M: virtual-sequence new-sequence virtual-seq new-sequence ;
+M: virtual-sequence nth virtual@ nth ; inline
+M: virtual-sequence set-nth virtual@ set-nth ; inline
+M: virtual-sequence nth-unsafe virtual@ nth-unsafe ; inline
+M: virtual-sequence set-nth-unsafe virtual@ set-nth-unsafe ; inline
+M: virtual-sequence like virtual-seq like ; inline
+M: virtual-sequence new-sequence virtual-seq new-sequence ; inline
 
 INSTANCE: virtual-sequence sequence
 
@@ -199,11 +199,9 @@ TUPLE: reversed { seq read-only } ;
 
 C: <reversed> reversed
 
-M: reversed virtual-seq seq>> ;
-
-M: reversed virtual@ seq>> [ length swap - 1 - ] keep ;
-
-M: reversed length seq>> length ;
+M: reversed virtual-seq seq>> ; inline
+M: reversed virtual@ seq>> [ length swap - 1 - ] keep ; inline
+M: reversed length seq>> length ; inline
 
 INSTANCE: reversed virtual-sequence
 
@@ -233,11 +231,11 @@ TUPLE: slice-error from to seq reason ;
     check-slice
     slice boa ; inline
 
-M: slice virtual-seq seq>> ;
+M: slice virtual-seq seq>> ; inline
 
-M: slice virtual@ [ from>> + ] [ seq>> ] bi ;
+M: slice virtual@ [ from>> + ] [ seq>> ] bi ; inline
 
-M: slice length [ to>> ] [ from>> ] bi - ;
+M: slice length [ to>> ] [ from>> ] bi - ; inline
 
 : short ( seq n -- seq n' ) over length min ; inline
 
@@ -260,16 +258,18 @@ TUPLE: repetition { len read-only } { elt read-only } ;
 
 C: <repetition> repetition
 
-M: repetition length len>> ;
-M: repetition nth-unsafe nip elt>> ;
+M: repetition length len>> ; inline
+M: repetition nth-unsafe nip elt>> ; inline
 
 INSTANCE: repetition immutable-sequence
 
 <PRIVATE
 
+ERROR: integer-length-expected obj ;
+
 : check-length ( n -- n )
     #! Ricing.
-    dup integer? [ "length not an integer" throw ] unless ; inline
+    dup integer? [ integer-length-expected ] unless ; inline
 
 : ((copy)) ( dst i src j n -- dst i src j n )
     dup -roll [
@@ -314,9 +314,9 @@ PRIVATE>
     (copy) drop ; inline
 
 M: sequence clone-like
-    [ dup length ] dip new-sequence [ 0 swap copy ] keep ;
+    [ dup length ] dip new-sequence [ 0 swap copy ] keep ; inline
 
-M: immutable-sequence clone-like like ;
+M: immutable-sequence clone-like like ; inline
 
 : push-all ( src dest -- ) [ length ] [ copy ] bi ;
 
index 1365e815242efa192f49d02f131fb66f8c9371ab..957b525cb3115043e8fc972ca5affe6073066f31 100644 (file)
@@ -1,6 +1,6 @@
-IN: slots.tests
 USING: math accessors slots strings generic.single kernel
 tools.test generic words parser eval math.functions ;
+IN: slots.tests
 
 TUPLE: r/w-test foo ;
 
@@ -18,23 +18,6 @@ TUPLE: hello length ;
 
 [ "xyz" 4 >>length ] [ no-method? ] must-fail-with
 
-[ t ] [ r/o-test \ foo>> method "foldable" word-prop ] unit-test
-[ t ] [ r/o-test \ foo>> method "flushable" word-prop ] unit-test
-
-[ f ] [ r/w-test \ foo>> method "foldable" word-prop ] unit-test
-[ t ] [ r/w-test \ foo>> method "flushable" word-prop ] unit-test
-
-! See if declarations are cleared on redefinition
-[ ] [ "IN: slots.tests TUPLE: r/w-test { foo read-only } ;" eval( -- ) ] unit-test
-
-[ t ] [ r/w-test \ foo>> method "foldable" word-prop ] unit-test
-[ t ] [ r/w-test \ foo>> method "flushable" word-prop ] unit-test
-
-[ ] [ "IN: slots.tests TUPLE: r/w-test foo ;" eval( -- ) ] unit-test
-
-[ f ] [ r/w-test \ foo>> method "foldable" word-prop ] unit-test
-[ t ] [ r/w-test \ foo>> method "flushable" word-prop ] unit-test
-
 ! Test protocol slots
 SLOT: my-protocol-slot-test
 
@@ -49,3 +32,10 @@ M: protocol-slot-test-tuple (>>my-protocol-slot-test) [ sqrt ] dip (>>x) ;
     T{ protocol-slot-test-tuple { x 3 } } clone
     [ 7 + ] change-my-protocol-slot-test x>>
 ] unit-test
+
+UNION: comme-ci integer float ;
+UNION: comme-ca integer float ;
+comme-ca 25.5 "initial-value" set-word-prop
+
+[ 0 ]    [ comme-ci initial-value ] unit-test
+[ 25.5 ] [ comme-ca initial-value ] unit-test
index 9215857018e4e375c36e58773deab61f6a912777..95a854f4936fdaea90f636b6f6ed41ec5bf86728 100755 (executable)
@@ -24,7 +24,8 @@ PREDICATE: writer-method < method-body "writing" word-prop ;
     [ create-method ] 2dip
     [ [ props>> ] [ drop ] [ ] tri* update ]
     [ drop define ]
-    3bi ;
+    [ 2drop make-inline ]
+    3tri ;
 
 GENERIC# reader-quot 1 ( class slot-spec -- quot )
 
@@ -41,11 +42,7 @@ M: object reader-quot
     dup t "reader" set-word-prop ;
 
 : reader-props ( slot-spec -- assoc )
-    [
-        [ "reading" set ]
-        [ read-only>> [ t "foldable" set ] when ] bi
-        t "flushable" set
-    ] H{ } make-assoc ;
+    "reading" associate ;
 
 : define-reader-generic ( name -- )
     reader-word (( object -- value )) define-simple-generic ;
@@ -169,6 +166,7 @@ M: class initial-value* no-initial-value ;
 
 : initial-value ( class -- object )
     {
+        { [ dup "initial-value" word-prop ] [ dup "initial-value" word-prop ] }
         { [ \ f bootstrap-word over class<= ] [ f ] }
         { [ \ array-capacity bootstrap-word over class<= ] [ 0 ] }
         { [ float bootstrap-word over class<= ] [ 0.0 ] }
@@ -236,5 +234,8 @@ M: slot-spec make-slot
 : finalize-slots ( specs base -- specs )
     over length iota [ + ] with map [ >>offset ] 2map ;
 
+: slot-named* ( name specs -- offset spec/f )
+    [ name>> = ] with find ;
+
 : slot-named ( name specs -- spec/f )
-    [ name>> = ] with find nip ;
+    slot-named* nip ;
index 5ec396e5ba6301376bc6f134f5c9581ad0ca8f3d..7aae30f20b356667fab9f1ef25ee456ff7ecc93d 100644 (file)
@@ -58,7 +58,7 @@ PRIVATE>
 : (split) ( separators n seq -- )
     3dup rot [ member? ] curry find-from drop
     [ [ swap subseq , ] 2keep 1 + swap (split) ]
-    [ swap dup zero? [ drop ] [ tail ] if , drop ] if* ; inline recursive
+    [ swap [ tail ] unless-zero , drop ] if* ; inline recursive
 
 : split, ( seq separators -- ) 0 rot (split) ;
 
index ffcefab78be4604309064e86112f9f9848b6f51f..8ab0409318d34c4ad98fa7a7800b55bf0289e91b 100644 (file)
@@ -37,24 +37,24 @@ M: string hashcode*
     [ ] [ dup rehash-string string-hashcode ] ?if ;
 
 M: string length
-    length>> ;
+    length>> ; inline
 
 M: string nth-unsafe
-    [ >fixnum ] dip string-nth ;
+    [ >fixnum ] dip string-nth ; inline
 
 M: string set-nth-unsafe
     dup reset-string-hashcode
-    [ >fixnum ] [ >fixnum ] [ ] tri* set-string-nth ;
+    [ >fixnum ] [ >fixnum ] [ ] tri* set-string-nth ; inline
 
 M: string clone
-    (clone) [ clone ] change-aux ;
+    (clone) [ clone ] change-aux ; inline
 
-M: string resize resize-string ;
+M: string resize resize-string ; inline
 
 : 1string ( ch -- str ) 1 swap <string> ;
 
 : >string ( seq -- str ) "" clone-like ;
 
-M: string new-sequence drop 0 <string> ;
+M: string new-sequence drop 0 <string> ; inline
 
 INSTANCE: string sequence
index 70905ceda95b5132c363b8d0def2f45345c836de..a988e5736581a7038b5c577267bde75ca96fc542 100644 (file)
@@ -191,6 +191,10 @@ HELP: delimiter
 { $syntax ": foo ... ; delimiter" }
 { $description "Declares the most recently defined word as a delimiter. Delimiters are words which are only ever valid as the end of a nested block to be read by " { $link parse-until } ". An unpaired occurrence of a delimiter is a parse error." } ;
 
+HELP: deprecated
+{ $syntax ": foo ... ; deprecated" }
+{ $description "Declares the most recently defined word as deprecated. If the " { $vocab-link "tools.deprecation" } " vocabulary is loaded, usages of deprecated words will be noted as they are made." } ;
+
 HELP: SYNTAX:
 { $syntax "SYNTAX: foo ... ;" }
 { $description "Defines a parsing word." }
index 7b9a0d36efc93512d32d466f3318dbbbcb2616e6..f01f90c027dae0c7a7419d1113a926ac0f32b21a 100644 (file)
@@ -111,6 +111,7 @@ IN: bootstrap.syntax
     "foldable" [ word make-foldable ] define-core-syntax
     "flushable" [ word make-flushable ] define-core-syntax
     "delimiter" [ word t "delimiter" set-word-prop ] define-core-syntax
+    "deprecated" [ word make-deprecated ] define-core-syntax
 
     "SYNTAX:" [
         CREATE-WORD parse-definition define-syntax
index 1bdda7b69da91567ffdfc642df421faa8a0917cd..4bbc787294b721c26265deb2c77c995e90ab9f64 100644 (file)
@@ -15,10 +15,10 @@ TUPLE: vector
 M: vector like
     drop dup vector? [
         dup array? [ dup length vector boa ] [ >vector ] if
-    ] unless ;
+    ] unless ; inline
 
 M: vector new-sequence
-    drop [ f <array> ] [ >fixnum ] bi vector boa ;
+    drop [ f <array> ] [ >fixnum ] bi vector boa ; inline
 
 M: vector equal?
     over vector? [ sequence= ] [ 2drop f ] if ;
@@ -34,9 +34,9 @@ M: array like
             2dup length eq?
             [ nip ] [ resize-array ] if
         ] [ >array ] if
-    ] unless ;
+    ] unless ; inline
 
-M: sequence new-resizable drop <vector> ;
+M: sequence new-resizable drop <vector> ; inline
 
 INSTANCE: vector growable
 
index 806d09bf9ecc6e926eb2ddc1f683afb3076e43c9..b756c0b681a8ed631de701a3cb98c66890e5051a 100644 (file)
@@ -294,6 +294,16 @@ HELP: delimiter?
 { $description "Tests if an object is a delimiter word declared by " { $link POSTPONE: delimiter } "." }
 { $notes "Outputs " { $link f } " if the object is not a word." } ;
 
+HELP: deprecated?
+{ $values { "obj" object } { "?" "a boolean" } }
+{ $description "Tests if an object is " { $link POSTPONE: deprecated } "." }
+{ $notes "Outputs " { $link f } " if the object is not a word." } ;
+
+HELP: make-deprecated
+{ $values { "word" word } }
+{ $description "Declares a word as " { $link POSTPONE: deprecated } "." }
+{ $side-effects "word" } ;
+
 HELP: make-flushable
 { $values { "word" word } }
 { $description "Declares a word as " { $link POSTPONE: flushable } "." }
index 0ecf7b65f0db5c77f3e125b1334d93c70ae17998..c3dacbaf148921a1492b45101b8f97980e42f973 100755 (executable)
@@ -122,6 +122,6 @@ DEFER: x
 [
     all-words [
         "compiled-uses" word-prop
-        keys [ "forgotten" word-prop ] any?
-    ] filter
+        keys [ "forgotten" word-prop ] filter
+    ] map harvest
 ] unit-test
index 2ebdb8b7a8ad0d9433be545d98c84ea3e1f26dd4..df5bc84edef5cd8a6a7bdc3cb46626f01cc09023 100755 (executable)
@@ -12,7 +12,7 @@ IN: words
 
 M: word execute (execute) ;
 
-M: word ?execute execute( -- value ) ;
+M: word ?execute execute( -- value ) ; inline
 
 M: word <=>
     [ [ name>> ] [ vocabulary>> ] bi 2array ] compare ;
@@ -123,6 +123,9 @@ M: word subwords drop f ;
 : define-declared ( word def effect -- )
     [ nip swap set-stack-effect ] [ drop define ] 3bi ;
 
+: make-deprecated ( word -- )
+    t "deprecated" set-word-prop ;
+
 : make-inline ( word -- )
     dup inline? [ drop ] [
         [ t "inline" set-word-prop ]
@@ -148,7 +151,7 @@ M: word reset-word
     {
         "unannotated-def" "parsing" "inline" "recursive"
         "foldable" "flushable" "reading" "writing" "reader"
-        "writer" "delimiter"
+        "writer" "delimiter" "deprecated"
     } reset-props ;
 
 : reset-generic ( word -- )
@@ -200,6 +203,9 @@ M: parsing-word definer drop \ SYNTAX: \ ; ;
 : delimiter? ( obj -- ? )
     dup word? [ "delimiter" word-prop ] [ drop f ] if ;
 
+: deprecated? ( obj -- ? )
+    dup word? [ "deprecated" word-prop ] [ drop f ] if ;
+
 ! Definition protocol
 M: word where "loc" word-prop ;
 
@@ -213,8 +219,8 @@ M: word forget*
     ] if ;
 
 M: word hashcode*
-    nip 1 slot { fixnum } declare ; foldable
+    nip 1 slot { fixnum } declare ; inline foldable
 
 M: word literalize <wrapper> ;
 
-INSTANCE: word definition
\ No newline at end of file
+INSTANCE: word definition
index c659e109ce3715d9f99f2184d935b47c633a7999..cc09ad52813e4df2fbabc61f431e77f168549c54 100755 (executable)
@@ -57,7 +57,7 @@ t to: remove-hidden-solids?
 \r
 : with-pv ( i quot -- ) [ swap >pv call ] with-scope  ; inline\r
 \r
-: dimension ( array -- x )      length 1- ; inline \r
+: dimension ( array -- x )      length 1 - ; inline \r
 : change-last ( seq quot -- ) \r
     [ [ dimension ] keep ] dip change-nth  ; inline\r
 \r
@@ -99,7 +99,7 @@ TUPLE: light name { direction array } color ;
 : point-inside-or-on-halfspace? ( halfspace v -- ? ) \r
     position-point VERY-SMALL-NUM neg > ;\r
 : project-vector (  seq -- seq )     \r
-    pv> [ head ] [ 1+  tail ] 2bi append ; \r
+    pv> [ head ] [ 1 +  tail ] 2bi append ; \r
 : get-intersection ( matrice -- seq )     \r
     [ 1 tail* ] map     flip first ;\r
 \r
@@ -336,7 +336,7 @@ TUPLE: solid dimension silhouettes
 : compute-adjacencies ( solid -- solid )\r
     dup dimension>> [ >= ] curry \r
     [ keep swap ] curry MAX-FACE-PER-CORNER swap\r
-    [ [ test-faces-combinaisons ] 2keep 1- ] while drop ;\r
+    [ [ test-faces-combinaisons ] 2keep 1 - ] while drop ;\r
 \r
 : find-adjacencies ( solid -- solid ) \r
     erase-old-adjacencies   \r
@@ -435,7 +435,7 @@ TUPLE: space name dimension solids ambient-color lights ;
     [ [ non-empty-solid? ] filter ] change-solids ;\r
 \r
 : projected-space ( space solids -- space ) \r
-   swap dimension>> 1-  <space>    \r
+   swap dimension>> 1 -  <space>    \r
    swap >>dimension    swap  >>solids ;\r
 \r
 : get-silhouette ( solid -- silhouette )    \r
index 4e4bbff72d57d8d3135263d8951e9d4ec19d6e42..d00eebc9763497ba1bced13f7d38161774874bdc 100755 (executable)
@@ -13,7 +13,7 @@ IN: adsoda.combinators
 !        { [ dup 0 = ] [ 2drop { { } } ] }\r
 !        { [ over empty? ] [ 2drop { } ] }\r
 !        { [ t ] [ \r
-!            [ [ 1- (combinations) ] [ drop first ] 2bi prefix-each ]\r
+!            [ [ 1 - (combinations) ] [ drop first ] 2bi prefix-each ]\r
 !            [ (combinations) ] 2bi append\r
 !        ] }\r
 !    } cond ;\r
@@ -26,7 +26,7 @@ IN: adsoda.combinators
         { [ over 1 = ] [ 3drop columnize ] }\r
         { [ over 0 = ] [ 2drop 2drop { } ] }\r
         { [ 2dup < ] [ 2drop [ 1 cut ] dip  \r
-                         [ 1- among [ append ] with map  ] \r
+                         [ 1 - among [ append ] with map  ] \r
                          [ among append ] 2bi\r
                        ] }\r
         { [ 2dup = ] [ 3drop 1array ] }\r
index 3e0648128de9746937e1e4b4a87b6f33212693be..fa73120df364a11d1c3421971cc3768b85d0119a 100755 (executable)
@@ -66,7 +66,7 @@ SYMBOL: matrix
 : do-row ( exchange-with row# -- )\r
     [ exchange-rows ] keep\r
     [ first-col ] keep\r
-    dup 1+ rows-from clear-col ;\r
+    dup 1 + rows-from clear-col ;\r
 \r
 : find-row ( row# quot -- i elt )\r
     [ rows-from ] dip find ; inline\r
@@ -76,8 +76,8 @@ SYMBOL: matrix
 \r
 : (echelon) ( col# row# -- )\r
     over cols < over rows < and [\r
-        2dup pivot-row [ over do-row 1+ ] when*\r
-        [ 1+ ] dip (echelon)\r
+        2dup pivot-row [ over do-row 1 + ] when*\r
+        [ 1 + ] dip (echelon)\r
     ] [\r
         2drop\r
     ] if ;\r
index d5a13e48d8988756b4e11a36a11b13d53c2929ff..48fd281c6cdf8c37b670c1fd8be2d772f1ae794b 100644 (file)
@@ -10,7 +10,7 @@ IN: annotations.tests
 
 : four ( -- x )
     !BROKEN this code is broken
-    2 2 + 1+ ;
+    2 2 + 1 + ;
 
 : five ( -- x )
     !TODO return 5
index 6b3fd41575fbc58ef6d70da405ccfbc895016f1c..14ebcb1c5b4e50bfbda653b63b6928af992f14a5 100755 (executable)
@@ -15,7 +15,7 @@ IN: benchmark.beust2
                     remaining 1 <= [
                         listener call f
                     ] [
-                        remaining 1-
+                        remaining 1 -
                         0
                         value' 10 *
                         used mask bitor
@@ -29,12 +29,12 @@ IN: benchmark.beust2
     ] any? ; inline recursive
 
 :: count-numbers ( max listener -- )
-    10 iota [ 1+ 1 1 0 max listener (count-numbers) ] any? drop ;
+    10 iota [ 1 + 1 1 0 max listener (count-numbers) ] any? drop ;
     inline
 
 :: beust ( -- )
     [let | i! [ 0 ] |
-        5000000000 [ i 1+ i! ] count-numbers
+        5000000000 [ i 1 + i! ] count-numbers
         i number>string " unique numbers." append print
     ] ;
 
diff --git a/extra/benchmark/chameneos-redux/authors.txt b/extra/benchmark/chameneos-redux/authors.txt
new file mode 100644 (file)
index 0000000..b4bd0e7
--- /dev/null
@@ -0,0 +1 @@
+Doug Coleman
\ No newline at end of file
diff --git a/extra/benchmark/chameneos-redux/chameneos-redux.factor b/extra/benchmark/chameneos-redux/chameneos-redux.factor
new file mode 100644 (file)
index 0000000..afd2f88
--- /dev/null
@@ -0,0 +1,106 @@
+! Copyright (C) 2009 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors arrays assocs combinators
+concurrency.mailboxes fry io kernel make math math.parser
+math.text.english sequences threads ;
+IN: benchmark.chameneos-redux
+
+SYMBOLS: red yellow blue ;
+
+ERROR: bad-color-pair pair ;
+
+TUPLE: creature n color count self-count mailbox ;
+
+TUPLE: meeting-place count mailbox ;
+
+: <meeting-place> ( count -- meeting-place )
+    meeting-place new
+        swap >>count
+        <mailbox> >>mailbox ;
+
+: <creature> ( n color -- creature )
+    creature new
+        swap >>color
+        swap >>n
+        0 >>count
+        0 >>self-count
+        <mailbox> >>mailbox ;
+
+: make-creatures ( colors -- seq )
+    [ length iota ] [ ] bi [ <creature> ] 2map ;
+
+: complement-color ( color1 color2 -- color3 )
+    2dup = [ drop ] [
+        2array {
+            { { red yellow } [ blue ] }
+            { { red blue } [ yellow ] }
+            { { yellow red } [ blue ] }
+            { { yellow blue } [ red ] }
+            { { blue red } [ yellow ] }
+            { { blue yellow } [ red ] }
+            [ bad-color-pair ]
+        } case
+    ] if ;
+
+: color-string ( color1 color2 -- string )
+    [
+        [ [ name>> ] bi@ " + " glue % " -> " % ]
+        [ complement-color name>> % ] 2bi
+    ] "" make ;
+
+: print-color-table ( -- )
+    { blue red yellow } dup
+    '[ _ '[ color-string print ] with each ] each ;
+
+: try-meet ( meeting-place creature -- )
+    over count>> 0 < [
+        2drop
+    ] [
+        [ swap mailbox>> mailbox-put ]
+        [ nip mailbox>> mailbox-get drop ]
+        [ try-meet ] 2tri
+    ] if ;
+
+: creature-meeting ( seq -- )
+    first2 {
+        [ [ [ 1 + ] change-count ] bi@ 2drop ]
+        [ 2dup = [ [ 1 + ] change-self-count ] when 2drop ]
+        [ [ [ color>> ] bi@ complement-color ] [ [ (>>color) ] bi-curry@ bi ] 2bi ]
+        [ [ mailbox>> f swap mailbox-put ] bi@ ]
+    } 2cleave ;
+
+: run-meeting-place ( meeting-place -- )
+    [ 1 - ] change-count
+    dup count>> 0 < [
+        mailbox>> mailbox-get-all
+        [ f swap mailbox>> mailbox-put ] each
+    ] [
+        [ mailbox>> 2 swap '[ _ mailbox-get ] replicate creature-meeting ]
+        [ run-meeting-place ] bi
+    ] if ;
+
+: number>chameneos-string ( n -- string )
+    number>string string>digits [ number>text ] { } map-as " " join ;
+
+: chameneos-redux ( n colors -- )
+    [ <meeting-place> ] [ make-creatures ] bi*
+    {
+        [ nip nl bl [ bl ] [ color>> name>> write ] interleave nl ]
+        [ [ '[ _ _ try-meet ] in-thread ] with each ]
+        [ drop run-meeting-place ]
+    
+        [ nip [ [ count>> number>string write bl ] [ self-count>> number>text write nl ] bi ] each ]
+        [ nip 0 [ count>> + ] reduce bl number>chameneos-string print ]
+    } 2cleave ;
+
+! 6000000 for shootout, too slow right now
+
+: chameneos-redux-main ( -- )
+    print-color-table
+    60000 [
+        { blue red yellow } chameneos-redux
+    ] [
+        { blue red yellow red yellow blue red yellow red blue } chameneos-redux
+    ] bi ;
+
+MAIN: chameneos-redux-main
index a69c53852deab7ad5e91b56d2e0d154940fb2abf..63e635f3de4ccbe8444d173203dcf8a2d403c356 100644 (file)
@@ -7,7 +7,7 @@ IN: benchmark.fannkuch
 : count ( quot: ( -- ? ) -- n )
     #! Call quot until it returns false, return number of times
     #! it was true
-    [ 0 ] dip '[ _ dip swap [ [ 1+ ] when ] keep ] loop ; inline
+    [ 0 ] dip '[ _ dip swap [ [ 1 + ] when ] keep ] loop ; inline
 
 : count-flips ( perm -- flip# )
     '[
@@ -19,12 +19,12 @@ IN: benchmark.fannkuch
     [ CHAR: 0 + write1 ] each nl ; inline
 
 : fannkuch-step ( counter max-flips perm -- counter max-flips )
-    pick 30 < [ [ 1+ ] [ ] [ dup write-permutation ] tri* ] when
+    pick 30 < [ [ 1 + ] [ ] [ dup write-permutation ] tri* ] when
     count-flips max ; inline
 
 : fannkuch ( n -- )
     [
-        [ 0 0 ] dip [ 1+ ] B{ } map-as
+        [ 0 0 ] dip [ 1 + ] B{ } map-as
         [ fannkuch-step ] each-permutation nip
     ] keep
     "Pfannkuchen(" write pprint ") = " write . ;
index f457b90c309fe7b1d12d517e94db7afd9e3359fb..c1d554a5a3919dc7ddd3631a7abbcee6a3250460 100755 (executable)
@@ -63,7 +63,7 @@ CONSTANT: homo-sapiens
 :: split-lines ( n quot -- )
     n line-length /mod
     [ [ line-length quot call ] times ] dip
-    dup zero? [ drop ] quot if ; inline
+    quot unless-zero ; inline
 
 : write-random-fasta ( seed n chars floats desc id -- seed )
     write-description
index c988e5722e6c693762f0e3bf648bf13c12fb5215..fa49503797be993608ee5981de72145f4dde6009 100644 (file)
@@ -9,10 +9,10 @@ C: <box> box
     dup i>> 1 <= [
         drop 1 <box>
     ] [
-        i>> 1- <box>
+        i>> 1 - <box>
         dup tuple-fib
         swap
-        i>> 1- <box>
+        i>> 1 - <box>
         tuple-fib
         swap i>> swap i>> + <box>
     ] if ; inline recursive
index f81b6a21a2f09a40b3cd6e6f197ad31afdcc1d7f..7ddd58468abc87015d89059498146c34a864d084 100755 (executable)
@@ -1,10 +1,10 @@
-IN: benchmark.fib6\r
 USING: math kernel alien ;\r
+IN: benchmark.fib6\r
 \r
 : fib ( x -- y )\r
     "int" { "int" } "cdecl" [\r
         dup 1 <= [ drop 1 ] [\r
-            1- dup fib swap 1- fib +\r
+            1 - dup fib swap 1 - fib +\r
         ] if\r
     ] alien-callback\r
     "int" { "int" } "cdecl" alien-indirect ;\r
index d201a08ecf79d7e4ddab211871e5390191966220..8b0a3e6a432ee95b70e0b499867980b194bdde14 100644 (file)
@@ -3,6 +3,6 @@
 USING: math sequences kernel ;
 IN: benchmark.gc1
 
-: gc1 ( -- ) 6000000 [ >bignum 1+ ] map drop ;
+: gc1 ( -- ) 6000000 [ >bignum 1 + ] map drop ;
 
-MAIN: gc1
\ No newline at end of file
+MAIN: gc1
index 99b0ee15f4ea60ecc616e8f55210903469748ccb..fb4f17cca5c768615975aa03451108ebf4bea86a 100644 (file)
@@ -23,12 +23,12 @@ IN: benchmark.knucleotide
 : tally ( x exemplar -- b )
     clone tuck
     [
-      [ [ 1+ ] [ 1 ] if* ] change-at
+      [ [ 1 + ] [ 1 ] if* ] change-at
     ] curry each ;
 
 : small-groups ( x n -- b )
     swap
-    [ length swap - 1+ ] 2keep
+    [ length swap - 1 + ] 2keep
     [ [ over + ] dip subseq ] 2curry map ;
 
 : handle-table ( inputs n -- )
index 9e0f2472e27c4c8563cb51d95c0287ab20bf070b..0300538ce101d0f9d3b07df6039a1fc47ccc3345 100644 (file)
@@ -12,7 +12,7 @@ CONSTANT: val 0.85
 
 : <color-map> ( nb-cols -- map )
     dup [
-        360 * swap 1+ / sat val
+        360 * swap 1 + / sat val
         1 <hsva> >rgba scale-rgb
     ] with map ;
 
index f72ceb46297301bfe24e933a6d0f89e11b2491c6..983da8882176f1a7697d8fea8cdd6746c6599740 100644 (file)
@@ -59,7 +59,7 @@ TUPLE: nbody-system { bodies array read-only } ;
 :: each-pair ( bodies pair-quot: ( other-body body -- ) each-quot: ( body -- ) -- )
     bodies [| body i |
         body each-quot call
-        bodies i 1+ tail-slice [
+        bodies i 1 + tail-slice [
             body pair-quot call
         ] each
     ] each-index ; inline
index 246a962a55b554e00e8b4b1e239a4dbb222162c1..9ccc2d8616171bf851e298534d39dc7d7635b400 100644 (file)
@@ -1,6 +1,6 @@
-IN: benchmark.nsieve-bits
 USING: math math.parser sequences sequences.private kernel
 bit-arrays make io ;
+IN: benchmark.nsieve-bits
 
 : clear-flags ( step i seq -- )
     2dup length >= [
@@ -13,14 +13,14 @@ bit-arrays make io ;
     2dup length < [
         2dup nth-unsafe [
             over dup 2 * pick clear-flags
-            rot 1+ -rot ! increment count
-        ] when [ 1+ ] dip (nsieve-bits)
+            rot 1 + -rot ! increment count
+        ] when [ 1 + ] dip (nsieve-bits)
     ] [
         2drop
     ] if ; inline recursive
 
 : nsieve-bits ( m -- count )
-    0 2 rot 1+ <bit-array> dup set-bits (nsieve-bits) ;
+    0 2 rot 1 + <bit-array> dup set-bits (nsieve-bits) ;
 
 : nsieve-bits. ( m -- )
     [ "Primes up to " % dup # " " % nsieve-bits # ] "" make
@@ -28,7 +28,7 @@ bit-arrays make io ;
 
 : nsieve-bits-main ( n -- )
     dup 2^ 10000 * nsieve-bits.
-    dup 1- 2^ 10000 * nsieve-bits.
+    dup 1 - 2^ 10000 * nsieve-bits.
     2 - 2^ 10000 * nsieve-bits. ;
 
 : nsieve-bits-main* ( -- ) 11 nsieve-bits-main ;
index bbeccf750b3fca290c370e98b9901cb377752cd4..15c0f9ee0b1dc0670c933152d1a5274fcef9759b 100644 (file)
@@ -13,14 +13,14 @@ byte-arrays make io ;
     2dup length < [
         2dup nth-unsafe 0 > [
             over dup 2 * pick clear-flags
-            rot 1+ -rot ! increment count
-        ] when [ 1+ ] dip (nsieve)
+            rot 1 + -rot ! increment count
+        ] when [ 1 + ] dip (nsieve)
     ] [
         2drop
     ] if ; inline recursive
 
 : nsieve ( m -- count )
-    0 2 rot 1+ <byte-array> dup [ drop 1 ] change-each (nsieve) ;
+    0 2 rot 1 + <byte-array> dup [ drop 1 ] change-each (nsieve) ;
 
 : nsieve. ( m -- )
     [ "Primes up to " % dup # " " % nsieve # ] "" make print ;
index 6fbc144e8078ba76573de611446d0560cda9893e..646c98f3a4214f2da60b9e0b06fecb31676d0b7c 100644 (file)
@@ -1,6 +1,6 @@
-IN: benchmark.nsieve
 USING: math math.parser sequences sequences.private kernel
 arrays make io ;
+IN: benchmark.nsieve
 
 : clear-flags ( step i seq -- )
     2dup length >= [
@@ -13,14 +13,14 @@ arrays make io ;
     2dup length < [
         2dup nth-unsafe [
             over dup 2 * pick clear-flags
-            rot 1+ -rot ! increment count
-        ] when [ 1+ ] dip (nsieve)
+            rot 1 + -rot ! increment count
+        ] when [ 1 + ] dip (nsieve)
     ] [
         2drop
     ] if ; inline recursive
 
 : nsieve ( m -- count )
-    0 2 rot 1+ t <array> (nsieve) ;
+    0 2 rot 1 + t <array> (nsieve) ;
 
 : nsieve. ( m -- )
     [ "Primes up to " % dup # " " % nsieve # ] "" make print ;
index 7c7c68b12d741a7e87a48ca32bed0139cb26d918..023f5de5c24d8b21ba88629225294ef6fff92a38 100644 (file)
@@ -5,21 +5,21 @@ combinators hints fry namespaces sequences ;
 IN: benchmark.partial-sums
 
 ! Helper words
-: summing-integers ( n quot -- y ) [ 0.0 ] 2dip '[ 1+ @ + ] each ; inline
+: summing-integers ( n quot -- y ) [ 0.0 ] 2dip '[ 1 + @ + ] each ; inline
 : summing-floats ( n quot -- y ) '[ >float @ ] summing-integers ; inline
 : cube ( x -- y ) dup dup * * ; inline
-: -1^ ( n -- -1/1 ) 2 mod 2 * 1- ; inline
+: -1^ ( n -- -1/1 ) 2 mod 2 * 1 - ; inline
 
 ! The functions
-: 2/3^k ( n -- y ) [ 2.0 3.0 / swap 1- ^ ] summing-floats ; inline
+: 2/3^k ( n -- y ) [ 2.0 3.0 / swap 1 - ^ ] summing-floats ; inline
 : k^-0.5 ( n -- y ) [ -0.5 ^ ] summing-floats ; inline
-: 1/k(k+1) ( n -- y ) [ dup 1+ * recip ] summing-floats ; inline
+: 1/k(k+1) ( n -- y ) [ dup 1 + * recip ] summing-floats ; inline
 : flint-hills ( n -- y ) [ [ cube ] [ sin sq ] bi * recip ] summing-floats ; inline
 : cookson-hills ( n -- y ) [ [ cube ] [ cos sq ] bi * recip ] summing-floats ; inline
 : harmonic ( n -- y ) [ recip ] summing-floats ; inline
 : riemann-zeta ( n -- y ) [ sq recip ] summing-floats ; inline
 : alternating-harmonic ( n -- y ) [ [ -1^ ] keep /f ] summing-integers ; inline
-: gregory ( n -- y ) [ [ -1^ ] [ 2.0 * 1- ] bi / ] summing-integers ; inline
+: gregory ( n -- y ) [ [ -1^ ] [ 2.0 * 1 - ] bi / ] summing-integers ; inline
 
 : partial-sums ( n -- results )
     [
index 128ec571f2293d7969554199a0de008947b15cd7..219c73ae0aa62a32ead0bf410b281e45cffe2be0 100755 (executable)
@@ -7,18 +7,18 @@ IN: benchmark.recursive
 
 : ack ( m n -- x )
     {
-        { [ over zero? ] [ nip 1+ ] }
-        { [ dup zero? ] [ drop 1- 1 ack ] }
-        [ [ drop 1- ] [ 1- ack ] 2bi ack ]
+        { [ over zero? ] [ nip 1 + ] }
+        { [ dup zero? ] [ drop 1 - 1 ack ] }
+        [ [ drop 1 - ] [ 1 - ack ] 2bi ack ]
     } cond ; inline recursive
 
 : tak ( x y z -- t )
     2over <= [
         2nip
     ] [
-        [  rot 1- -rot tak ]
-        [ -rot 1- -rot tak ]
-        [      1- -rot tak ]
+        [  rot 1 - -rot tak ]
+        [ -rot 1 - -rot tak ]
+        [      1 - -rot tak ]
         3tri
         tak
     ] if ; inline recursive
@@ -26,7 +26,7 @@ IN: benchmark.recursive
 : recursive ( n -- )
     [ 3 swap ack . flush ]
     [ 27.0 + fib . flush ]
-    [ 1- [ 3 * ] [ 2 * ] [ ] tri tak . flush ] tri
+    [ 1 - [ 3 * ] [ 2 * ] [ ] tri tak . flush ] tri
     3 fib . flush
     3.0 2.0 1.0 tak . flush ;
 
index 483311d4f4c9d7fed812fc892ef89c0213b33036..bd9a7139b3c3511214088df988538e4e61a6d289 100644 (file)
@@ -11,10 +11,10 @@ TUPLE-ARRAY: point
 : tuple-array-benchmark ( -- )
     100 [
         drop 5000 <point-array> [
-            [ 1+ ] change-x
-            [ 1- ] change-y
-            [ 1+ 2 / ] change-z
+            [ 1 + ] change-x
+            [ 1 - ] change-y
+            [ 1 + 2 / ] change-z
         ] map [ z>> ] sigma
     ] sigma . ;
 
-MAIN: tuple-array-benchmark
\ No newline at end of file
+MAIN: tuple-array-benchmark
index ca57de822f153c495430c7e1d4bf0e7b408a3d12..9562e42c4e8db1d5f9c850e42cf7cea1545cb955 100644 (file)
@@ -36,8 +36,7 @@ C-STRUCT: yuv_buffer
     255 min 0 max ; inline
 
 : stride ( line yuv  -- uvy yy )
-    [ yuv_buffer-uv_stride swap 2/ * >fixnum ]
-    [ yuv_buffer-y_stride * >fixnum ] 2bi ; inline
+    [ yuv_buffer-uv_stride swap 2/ * ] [ yuv_buffer-y_stride * ] 2bi ; inline
 
 : compute-y ( yuv uvy yy x -- y )
     + >fixnum nip swap yuv_buffer-y swap alien-unsigned-1 16 - ; inline
@@ -74,16 +73,16 @@ C-STRUCT: yuv_buffer
     drop ; inline
 
 : yuv>rgb-pixel ( index rgb yuv uvy yy x -- index )
-    compute-yuv compute-rgb store-rgb 3 + >fixnum ; inline
+    compute-yuv compute-rgb store-rgb 3 + ; inline
 
 : yuv>rgb-row ( index rgb yuv y -- index )
     over stride
-    pick yuv_buffer-y_width >fixnum
+    pick yuv_buffer-y_width
     [ yuv>rgb-pixel ] with with with with each ; inline
 
 : yuv>rgb ( rgb yuv -- )
     [ 0 ] 2dip
-    dup yuv_buffer-y_height >fixnum
+    dup yuv_buffer-y_height
     [ yuv>rgb-row ] with with each
     drop ;
 
index 620f737fe3783ddff6ea7750f7542a84d9aacfbf..b7400c4acb53e054c7497d95dd2d451b8cc41848 100755 (executable)
@@ -11,7 +11,7 @@ TUPLE: bunny-world < demo-world model-triangles geom draw-seq draw-n ;
 
 : next-draw ( gadget -- )
     dup [ draw-seq>> ] [ draw-n>> ] bi
-    1+ swap length mod
+    1 + swap length mod
     >>draw-n relayout-1 ;
 
 : make-draws ( gadget -- draw-seq )
index 3dbcbf32fcc76ce09f45a0f6fa1d910caad51ef5..17c5ee901f75620f4fedb45295d674af34ea7c97 100644 (file)
@@ -9,11 +9,11 @@ CENTRAL: test-central
 TUPLE: test-disp-cent value disposed ;
 
 ! A phony destructor that adds 1 to the value so we can make sure it got called.
-M: test-disp-cent dispose* dup value>> 1+ >>value drop ;
+M: test-disp-cent dispose* dup value>> 1 + >>value drop ;
 
 DISPOSABLE-CENTRAL: t-d-c
 
 : test-t-d-c ( -- n )
     test-disp-cent new 3 >>value [ t-d-c ] with-t-d-c value>> ;
 
-[ 4 ] [ test-t-d-c ] unit-test
\ No newline at end of file
+[ 4 ] [ test-t-d-c ] unit-test
diff --git a/extra/classes/c-types/c-types-docs.factor b/extra/classes/c-types/c-types-docs.factor
new file mode 100644 (file)
index 0000000..58ebf7a
--- /dev/null
@@ -0,0 +1,72 @@
+! (c)Joe Groff bsd license
+USING: alien arrays classes help.markup help.syntax kernel math
+specialized-arrays.direct ;
+IN: classes.c-types
+
+HELP: c-type-class
+{ $class-description "This metaclass encompasses the " { $link "classes.c-types" } "." } ;
+
+HELP: char
+{ $class-description "A signed one-byte integer quantity." } ;
+
+HELP: direct-array-of
+{ $values
+    { "alien" c-ptr } { "len" integer } { "class" c-type-class }
+    { "array" "a direct array" }
+}
+{ $description "Constructs one of the " { $link "specialized-arrays.direct" } " over " { $snippet "len" } " elements of type " { $snippet "class" } " located at the referenced location in raw memory." } ;
+
+HELP: int
+{ $class-description "A signed four-byte integer quantity." } ;
+
+HELP: long
+{ $class-description "A signed integer quantity. On 64-bit Unix platforms, this is an eight-byte type; on Windows and on 32-bit Unix platforms, it is four bytes." } ;
+
+HELP: longlong
+{ $class-description "A signed eight-byte integer quantity." } ;
+
+HELP: short
+{ $class-description "A signed two-byte integer quantity." } ;
+
+HELP: single-complex
+{ $class-description "A single-precision complex floating point quantity." } ;
+
+HELP: single-float
+{ $class-description "A single-precision floating point quantity." } ;
+
+HELP: uchar
+{ $class-description "An unsigned one-byte integer quantity." } ;
+
+HELP: uint
+{ $class-description "An unsigned four-byte integer quantity." } ;
+
+HELP: ulong
+{ $class-description "An unsigned integer quantity. On 64-bit Unix platforms, this is an eight-byte type; on Windows and on 32-bit Unix platforms, it is four bytes." } ;
+
+HELP: ulonglong
+{ $class-description "An unsigned eight-byte integer quantity." } ;
+
+HELP: ushort
+{ $class-description "An unsigned two-byte integer quantity." } ;
+
+ARTICLE: "classes.c-types" "C type classes"
+"The " { $vocab-link "classes.c-types" } " vocabulary defines Factor classes that correspond to C types in the FFI."
+{ $subsection char }
+{ $subsection uchar }
+{ $subsection short }
+{ $subsection ushort }
+{ $subsection int }
+{ $subsection uint }
+{ $subsection long }
+{ $subsection ulong }
+{ $subsection longlong }
+{ $subsection ulonglong }
+{ $subsection single-float }
+{ $subsection float }
+{ $subsection single-complex }
+{ $subsection complex }
+{ $subsection pinned-c-ptr }
+"The vocabulary also provides a word for constructing " { $link "specialized-arrays.direct" } " of C types over raw memory:"
+{ $subsection direct-array-of } ;
+
+ABOUT: "classes.c-types"
diff --git a/extra/classes/c-types/c-types.factor b/extra/classes/c-types/c-types.factor
new file mode 100644 (file)
index 0000000..e53a813
--- /dev/null
@@ -0,0 +1,118 @@
+! (c)Joe Groff bsd license
+USING: alien alien.c-types classes classes.predicate kernel
+math math.bitwise math.order namespaces sequences words
+specialized-arrays.direct.alien
+specialized-arrays.direct.bool
+specialized-arrays.direct.char
+specialized-arrays.direct.complex-double
+specialized-arrays.direct.complex-float
+specialized-arrays.direct.double
+specialized-arrays.direct.float
+specialized-arrays.direct.int
+specialized-arrays.direct.long
+specialized-arrays.direct.longlong
+specialized-arrays.direct.short
+specialized-arrays.direct.uchar
+specialized-arrays.direct.uint
+specialized-arrays.direct.ulong
+specialized-arrays.direct.ulonglong
+specialized-arrays.direct.ushort ;
+IN: classes.c-types
+
+PREDICATE: char < fixnum
+    HEX: -80 HEX: 7f between? ;
+
+PREDICATE: uchar < fixnum
+    HEX: 0 HEX: ff between? ;
+
+PREDICATE: short < fixnum
+    HEX: -8000 HEX: 7fff between? ;
+
+PREDICATE: ushort < fixnum
+    HEX: 0 HEX: ffff between? ;
+
+PREDICATE: int < integer
+    HEX: -8000,0000 HEX: 7fff,ffff between? ;
+
+PREDICATE: uint < integer
+    HEX: 0 HEX: ffff,ffff between? ;
+
+PREDICATE: longlong < integer
+    HEX: -8000,0000,0000,0000 HEX: 7fff,ffff,ffff,ffff between? ;
+
+PREDICATE: ulonglong < integer
+    HEX: 0 HEX: ffff,ffff,ffff,ffff between? ;
+
+UNION: single-float float ;
+UNION: single-complex complex ;
+
+SYMBOLS: long ulong long-bits ;
+
+<<
+    "long" heap-size 8 =
+    [
+        \  long integer [ HEX: -8000,0000,0000,0000 HEX: 7fff,ffff,ffff,ffff between? ] define-predicate-class
+        \ ulong integer [ HEX:                    0 HEX: ffff,ffff,ffff,ffff between? ] define-predicate-class
+        64 \ long-bits set-global
+    ] [
+        \  long integer [ HEX: -8000,0000 HEX: 7fff,ffff between? ] define-predicate-class
+        \ ulong integer [ HEX:          0 HEX: ffff,ffff between? ] define-predicate-class
+        32 \ long-bits set-global
+    ] if
+>>
+
+: set-class-c-type ( class initial c-type <direct-array> -- )
+    [ "initial-value" set-word-prop ]
+    [ c-type "class-c-type" set-word-prop ]
+    [ "class-direct-array" set-word-prop ] tri-curry* tri ;
+
+: class-c-type ( class -- c-type )
+    "class-c-type" word-prop ;
+: class-direct-array ( class -- <direct-array> )
+    "class-direct-array" word-prop ;
+
+\ f            f            "void*"          \ <direct-void*-array>          set-class-c-type
+pinned-c-ptr   f            "void*"          \ <direct-void*-array>          set-class-c-type
+boolean        f            "bool"           \ <direct-bool-array>           set-class-c-type
+char           0            "char"           \ <direct-char-array>           set-class-c-type
+uchar          0            "uchar"          \ <direct-uchar-array>          set-class-c-type
+short          0            "short"          \ <direct-short-array>          set-class-c-type
+ushort         0            "ushort"         \ <direct-ushort-array>         set-class-c-type
+int            0            "int"            \ <direct-int-array>            set-class-c-type
+uint           0            "uint"           \ <direct-uint-array>           set-class-c-type
+long           0            "long"           \ <direct-long-array>           set-class-c-type
+ulong          0            "ulong"          \ <direct-ulong-array>          set-class-c-type
+longlong       0            "longlong"       \ <direct-longlong-array>       set-class-c-type
+ulonglong      0            "ulonglong"      \ <direct-ulonglong-array>      set-class-c-type
+float          0.0          "double"         \ <direct-double-array>         set-class-c-type
+single-float   0.0          "float"          \ <direct-float-array>          set-class-c-type
+complex        C{ 0.0 0.0 } "complex-double" \ <direct-complex-double-array> set-class-c-type
+single-complex C{ 0.0 0.0 } "complex-float"  \ <direct-complex-float-array>  set-class-c-type
+
+char      [  8 bits  8 >signed ] "coercer" set-word-prop
+uchar     [  8 bits            ] "coercer" set-word-prop
+short     [ 16 bits 16 >signed ] "coercer" set-word-prop
+ushort    [ 16 bits            ] "coercer" set-word-prop
+int       [ 32 bits 32 >signed ] "coercer" set-word-prop
+uint      [ 32 bits            ] "coercer" set-word-prop
+long      [ [ bits ] [ >signed ] ] long-bits get-global prefix "coercer" set-word-prop
+ulong     [   bits               ] long-bits get-global prefix "coercer" set-word-prop
+longlong  [ 64 bits 64 >signed ] "coercer" set-word-prop
+ulonglong [ 64 bits            ] "coercer" set-word-prop
+
+PREDICATE: c-type-class < class
+    "class-c-type" word-prop ;
+
+GENERIC: direct-array-of ( alien len class -- array ) inline
+
+M: c-type-class direct-array-of
+    class-direct-array execute( alien len -- array ) ; inline
+
+M: c-type-class c-type class-c-type ;
+M: c-type-class c-type-align class-c-type c-type-align ;
+M: c-type-class c-type-getter class-c-type c-type-getter ;
+M: c-type-class c-type-setter class-c-type c-type-setter ;
+M: c-type-class c-type-boxer-quot class-c-type c-type-boxer-quot ;
+M: c-type-class c-type-unboxer-quot class-c-type c-type-unboxer-quot ;
+M: c-type-class heap-size class-c-type heap-size ;
+
diff --git a/extra/classes/struct/prettyprint/prettyprint.factor b/extra/classes/struct/prettyprint/prettyprint.factor
new file mode 100644 (file)
index 0000000..6bf62f6
--- /dev/null
@@ -0,0 +1,31 @@
+! (c)Joe Groff bsd license
+USING: accessors assocs classes classes.struct kernel math
+prettyprint.backend prettyprint.custom prettyprint.sections
+see.private sequences words ;
+IN: classes.struct.prettyprint
+
+<PRIVATE
+
+: struct-definer-word ( class -- word )
+    struct-slots dup length 2 >=
+    [ second offset>> 0 = \ UNION-STRUCT: \ STRUCT: ? ]
+    [ drop \ STRUCT: ] if ;
+
+: struct>assoc ( struct -- assoc )
+    [ class struct-slots ] [ struct-slot-values ] bi zip filter-tuple-assoc ;
+
+PRIVATE>
+
+M: struct-class see-class*
+    <colon dup struct-definer-word pprint-word dup pprint-word
+    <block struct-slots [ pprint-slot ] each
+    block> pprint-; block> ;
+
+M: struct pprint-delims
+    drop \ S{ \ } ;
+
+M: struct >pprint-sequence
+    [ class ] [ struct-slot-values ] bi class-slot-sequence ;
+
+M: struct pprint*
+    [ [ \ S{ ] dip [ class ] [ struct>assoc ] bi \ } (pprint-tuple) ] ?pprint-tuple ;
diff --git a/extra/classes/struct/struct-docs.factor b/extra/classes/struct/struct-docs.factor
new file mode 100644 (file)
index 0000000..83d5859
--- /dev/null
@@ -0,0 +1,89 @@
+! (c)Joe Groff bsd license
+USING: alien classes help.markup help.syntax kernel libc
+quotations slots ;
+IN: classes.struct
+
+HELP: <struct-boa>
+{ $values
+    { "class" class }
+}
+{ $description "This macro implements " { $link boa } " for " { $link struct } " classes. A struct of the given class is constructed, and its slots are initialized using values off the top of the datastack." } ;
+
+HELP: <struct>
+{ $values
+    { "class" class }
+    { "struct" struct }
+}
+{ $description "Allocates garbage-collected heap memory for a new " { $link struct } " of the specified " { $snippet "class" } ". The new struct's slots are initialized with the initial values specified in the struct definition." } ;
+
+{ <struct> <struct-boa> malloc-struct memory>struct } related-words
+
+HELP: STRUCT:
+{ $syntax "STRUCT: class { slot type } { slot type } ... ;" }
+{ $values { "class" "a new " { $link struct } " class to define" } { "slots" "a list of slot specifiers" } }
+{ $description "Defines a new " { $link struct } " type. The syntax is nearly identical to " { $link POSTPONE: TUPLE: } "; however, there are some additional restrictions on struct types:"
+{ $list
+{ "Struct classes cannot have a superclass defined." }
+{ "The slots of a struct must all have a type declared. The type must be either another struct class, or one of the " { $link "classes.c-types" } "." } 
+{ { $link read-only } " slots on structs are not enforced, though they may be declared." }
+} } ;
+
+HELP: S{
+{ $syntax "S{ class slots... }" }
+{ $values { "class" "a " { $link struct } " class word" } { "slots" "slot values" } }
+{ $description "Marks the beginning of a literal struct. The syntax is identical to tuple literal syntax with " { $link POSTPONE: T{ } { $snippet " }" } "; either the assoc syntax (that is, " { $snippet "S{ class { slot value } { slot value } ... }" } ") or the simple syntax (" { $snippet "S{ class f value value ... }" } ") can be used." } ;
+
+HELP: UNION-STRUCT:
+{ $syntax "UNION-STRUCT: class { slot type } { slot type } ... ;" }
+{ $values { "class" "a new " { $link struct } " class to define" } { "slots" "a list of slot specifiers" } }
+{ $description "Defines a new " { $link struct } " type where all of the slots share the same storage. See " { $link POSTPONE: STRUCT: } " for details on the syntax." } ;
+
+HELP: define-struct-class
+{ $values
+    { "class" class } { "slots" "a sequence of " { $link slot-spec } "s" }
+}
+{ $description "Defines a new " { $link struct } " class. This is the runtime equivalent of the " { $link POSTPONE: STRUCT: } " syntax." } ;
+
+HELP: define-union-struct-class
+{ $values
+    { "class" class } { "slots" "a sequence of " { $link slot-spec } "s" }
+}
+{ $description "Defines a new " { $link struct } " class where all of the slots share the same storage. This is the runtime equivalent of the " { $link POSTPONE: UNION-STRUCT: } " syntax." } ;
+
+HELP: malloc-struct
+{ $values
+    { "class" class }
+    { "struct" struct }
+}
+{ $description "Allocates unmanaged C heap memory for a new " { $link struct } " of the specified " { $snippet "class" } ". The new struct's slots are left uninitialized. The struct should be " { $link free } "d when it is no longer needed." } ;
+
+HELP: memory>struct
+{ $values
+    { "ptr" c-ptr } { "class" class }
+    { "struct" struct }
+}
+{ $description "Constructs a new " { $link struct } " of the specified " { $snippet "class" } " at the memory location referenced by " { $snippet "ptr" } ". The referenced memory is unchanged." } ;
+
+HELP: struct
+{ $class-description "The parent class of all struct types." } ;
+
+{ struct POSTPONE: STRUCT: POSTPONE: UNION-STRUCT: } related-words
+
+HELP: struct-class
+{ $class-description "The metaclass of all " { $link struct } " classes." } ;
+
+ARTICLE: "classes.struct" "Struct classes"
+{ $link struct } " classes are similar to " { $link tuple } "s, but their slots exhibit value semantics, and they are backed by a contiguous structured block of memory. Structs can be used for structured access to C memory or Factor byte arrays and for passing struct values in and out of the FFI. Struct types are defined using a syntax similar to tuple syntax:"
+{ $subsection POSTPONE: STRUCT: }
+"Structs can be allocated with " { $link new } "- and " { $link boa } "-like constructor words. Additional words are provided for building structs from C memory and from existing buffers:"
+{ $subsection <struct> }
+{ $subsection <struct-boa> }
+{ $subsection malloc-struct }
+{ $subsection memory>struct }
+"Structs have literal syntax like tuples:"
+{ $subsection POSTPONE: S{ }
+"Union structs are also supported, which behave like structs but share the same memory for all the type's slots."
+{ $subsection POSTPONE: UNION-STRUCT: }
+;
+
+ABOUT: "classes.struct"
diff --git a/extra/classes/struct/struct-tests.factor b/extra/classes/struct/struct-tests.factor
new file mode 100644 (file)
index 0000000..912d33c
--- /dev/null
@@ -0,0 +1,112 @@
+! (c)Joe Groff bsd license
+USING: accessors alien.c-types alien.structs.fields classes.c-types
+classes.struct combinators io.streams.string kernel libc literals math
+multiline namespaces prettyprint prettyprint.config see tools.test ;
+IN: classes.struct.tests
+
+STRUCT: struct-test-foo
+    { x char }
+    { y int initial: 123 }
+    { z boolean } ;
+
+STRUCT: struct-test-bar
+    { w ushort initial: HEX: ffff }
+    { foo struct-test-foo } ;
+
+[ 12 ] [ struct-test-foo heap-size ] unit-test
+[ 16 ] [ struct-test-bar heap-size ] unit-test
+[ 123 ] [ struct-test-foo <struct> y>> ] unit-test
+[ 123 ] [ struct-test-bar <struct> foo>> y>> ] unit-test
+
+[ 1 2 3 t ] [
+    1   2 3 t struct-test-foo <struct-boa>   struct-test-bar <struct-boa>
+    {
+        [ w>> ] 
+        [ foo>> x>> ]
+        [ foo>> y>> ]
+        [ foo>> z>> ]
+    } cleave
+] unit-test
+
+[ 7654 ] [ S{ struct-test-foo f 98 7654 f } y>> ] unit-test
+[ 7654 ] [ S{ struct-test-foo { y 7654 } } y>> ] unit-test
+
+UNION-STRUCT: struct-test-float-and-bits
+    { f single-float }
+    { bits uint } ;
+
+[ 1.0 ] [ struct-test-float-and-bits <struct> 1.0 float>bits >>bits f>> ] unit-test
+[ 4 ] [ struct-test-float-and-bits heap-size ] unit-test
+
+[ ] [ struct-test-foo malloc-struct free ] unit-test
+
+[ "S{ struct-test-foo { y 7654 } }" ]
+[
+    f boa-tuples?
+    [ struct-test-foo <struct> 7654 >>y [ pprint ] with-string-writer ]
+    with-variable
+] unit-test
+
+[ "S{ struct-test-foo f 0 7654 f }" ]
+[
+    t boa-tuples?
+    [ struct-test-foo <struct> 7654 >>y [ pprint ] with-string-writer ]
+    with-variable
+] unit-test
+
+[ <" USING: classes.c-types classes.struct kernel ;
+IN: classes.struct.tests
+STRUCT: struct-test-foo
+    { x char initial: 0 } { y int initial: 123 }
+    { z boolean initial: f } ;
+"> ]
+[ [ struct-test-foo see ] with-string-writer ] unit-test
+
+[ <" USING: classes.c-types classes.struct ;
+IN: classes.struct.tests
+UNION-STRUCT: struct-test-float-and-bits
+    { f single-float initial: 0.0 } { bits uint initial: 0 } ;
+"> ]
+[ [ struct-test-float-and-bits see ] with-string-writer ] unit-test
+
+[ {
+    T{ field-spec
+        { name "x" }
+        { offset 0 }
+        { type $[ char c-type ] }
+        { reader x>> }
+        { writer (>>x) }
+    }
+    T{ field-spec
+        { name "y" }
+        { offset 4 }
+        { type $[ int c-type ] }
+        { reader y>> }
+        { writer (>>y) }
+    }
+    T{ field-spec
+        { name "z" }
+        { offset 8 }
+        { type $[ boolean c-type ] }
+        { reader z>> }
+        { writer (>>z) }
+    }
+} ] [ "struct-test-foo" c-type fields>> ] unit-test
+
+[ {
+    T{ field-spec
+        { name "f" }
+        { offset 0 }
+        { type $[ single-float c-type ] }
+        { reader f>> }
+        { writer (>>f) }
+    }
+    T{ field-spec
+        { name "bits" }
+        { offset 0 }
+        { type $[ uint c-type ] }
+        { reader bits>> }
+        { writer (>>bits) }
+    }
+} ] [ "struct-test-float-and-bits" c-type fields>> ] unit-test
+
diff --git a/extra/classes/struct/struct.factor b/extra/classes/struct/struct.factor
new file mode 100644 (file)
index 0000000..3d4ffe1
--- /dev/null
@@ -0,0 +1,213 @@
+! (c)Joe Groff bsd license
+USING: accessors alien alien.c-types alien.structs alien.structs.fields arrays
+byte-arrays classes classes.c-types classes.parser classes.tuple
+classes.tuple.parser classes.tuple.private combinators
+combinators.smart fry generalizations generic.parser kernel
+kernel.private libc macros make math math.order parser
+quotations sequences slots slots.private struct-arrays words ;
+FROM: slots => reader-word writer-word ;
+IN: classes.struct
+
+! struct class
+
+TUPLE: struct
+    { (underlying) c-ptr read-only } ;
+
+PREDICATE: struct-class < tuple-class
+    \ struct subclass-of? ;
+
+: struct-slots ( struct -- slots )
+    "struct-slots" word-prop ;
+
+! struct allocation
+
+M: struct >c-ptr
+    2 slot { c-ptr } declare ; inline
+
+: memory>struct ( ptr class -- struct )
+    over c-ptr? [ swap \ c-ptr bad-slot-value ] unless
+    tuple-layout <tuple> [ 2 set-slot ] keep ;
+
+: malloc-struct ( class -- struct )
+    [ heap-size malloc ] keep memory>struct ; inline
+
+: (struct) ( class -- struct )
+    [ heap-size <byte-array> ] keep memory>struct ; inline
+
+: <struct> ( class -- struct )
+    dup "prototype" word-prop
+    [ >c-ptr clone swap memory>struct ] [ (struct) ] if* ; inline
+
+MACRO: <struct-boa> ( class -- quot: ( ... -- struct ) )
+    [
+        [ <wrapper> \ (struct) [ ] 2sequence ]
+        [
+            struct-slots
+            [ length \ ndip ]
+            [ [ name>> setter-word 1quotation ] map \ spread ] bi
+        ] bi
+    ] [ ] output>sequence ;
+
+: pad-struct-slots ( values class -- values' class )
+    [ struct-slots [ initial>> ] map over length tail append ] keep ;
+
+: (reader-quot) ( slot -- quot )
+    [ class>> c-type-getter-boxer ]
+    [ offset>> [ >c-ptr ] swap suffix ] bi prepend ;
+
+: (writer-quot) ( slot -- quot )
+    [ class>> c-setter ]
+    [ offset>> [ >c-ptr ] swap suffix ] bi prepend ;
+
+: (boxer-quot) ( class -- quot )
+    '[ _ memory>struct ] ;
+
+: (unboxer-quot) ( class -- quot )
+    drop [ >c-ptr ] ;
+
+M: struct-class boa>object
+    swap pad-struct-slots
+    [ (struct) ] [ struct-slots ] bi 
+    [ [ (writer-quot) call( value struct -- ) ] with 2each ] curry keep ;
+
+! Struct slot accessors
+
+GENERIC: struct-slot-values ( struct -- sequence )
+
+M: struct-class reader-quot
+    nip (reader-quot) ;
+
+M: struct-class writer-quot
+    nip (writer-quot) ;
+
+: struct-slot-values-quot ( class -- quot )
+    struct-slots
+    [ name>> reader-word 1quotation ] map
+    \ cleave [ ] 2sequence
+    \ output>array [ ] 2sequence ;
+
+: (define-struct-slot-values-method) ( class -- )
+    [ \ struct-slot-values create-method-in ]
+    [ struct-slot-values-quot ] bi define ;
+
+! Struct as c-type
+
+: slot>field ( slot -- field )
+    field-spec new swap {
+        [ name>> >>name ]
+        [ offset>> >>offset ]
+        [ class>> c-type >>type ]
+        [ name>> reader-word >>reader ]
+        [ name>> writer-word >>writer ]
+    } cleave ;
+
+: define-struct-for-class ( class -- )
+    [
+        {
+            [ name>> ]
+            [ "struct-size" word-prop ]
+            [ "struct-align" word-prop ]
+            [ struct-slots [ slot>field ] map ]
+        } cleave
+        (define-struct)
+    ] [
+        [ name>> c-type ]
+        [ (unboxer-quot) >>unboxer-quot ]
+        [ (boxer-quot) >>boxer-quot ] tri drop
+    ] bi ;
+
+: align-offset ( offset class -- offset' )
+    c-type-align align ;
+
+: struct-offsets ( slots -- size )
+    0 [
+        [ class>> align-offset ] keep
+        [ (>>offset) ] [ class>> heap-size + ] 2bi
+    ] reduce ;
+
+: union-struct-offsets ( slots -- size )
+    [ 0 >>offset class>> heap-size ] [ max ] map-reduce ;
+
+: struct-align ( slots -- align )
+    [ class>> c-type-align ] [ max ] map-reduce ;
+
+M: struct-class c-type
+    name>> c-type ;
+
+M: struct-class c-type-align
+    "struct-align" word-prop ;
+
+M: struct-class c-type-getter
+    drop [ swap <displaced-alien> ] ;
+
+M: struct-class c-type-setter
+    [ c-type-getter ] [ c-type-unboxer-quot ] [ heap-size ] tri
+    '[ @ swap @ _ memcpy ] ;
+
+M: struct-class c-type-boxer-quot
+    (boxer-quot) ;
+
+M: struct-class c-type-unboxer-quot
+    (unboxer-quot) ;
+
+M: struct-class heap-size
+    "struct-size" word-prop ;
+
+M: struct-class direct-array-of
+    <direct-struct-array> ;
+
+! class definition
+
+: struct-prototype ( class -- prototype )
+    [ heap-size <byte-array> ]
+    [ memory>struct ]
+    [ struct-slots ] tri
+    [
+        [ initial>> ]
+        [ (writer-quot) ] bi
+        over [ swapd [ call( value struct -- ) ] curry keep ] [ 2drop ] if
+    ] each ;
+
+: (struct-word-props) ( class slots size align -- )
+    [
+        [ "struct-slots" set-word-prop ]
+        [ define-accessors ] 2bi
+    ]
+    [ "struct-size" set-word-prop ]
+    [ "struct-align" set-word-prop ] tri-curry*
+    [ tri ] 3curry
+    [ dup struct-prototype "prototype" set-word-prop ]
+    [ (define-struct-slot-values-method) ] tri ;
+
+: check-struct-slots ( slots -- )
+    [ class>> c-type drop ] each ;
+
+: (define-struct-class) ( class slots offsets-quot -- )
+    [ drop struct f define-tuple-class ]
+    swap '[
+        make-slots dup
+        [ check-struct-slots ] _ [ struct-align [ align ] keep ] tri
+        (struct-word-props)
+    ]
+    [ drop define-struct-for-class ] 2tri ; inline
+
+: define-struct-class ( class slots -- )
+    [ struct-offsets ] (define-struct-class) ;
+
+: define-union-struct-class ( class slots -- )
+    [ union-struct-offsets ] (define-struct-class) ;
+
+: parse-struct-definition ( -- class slots )
+    CREATE-CLASS [ parse-tuple-slots ] { } make ;
+
+SYNTAX: STRUCT:
+    parse-struct-definition define-struct-class ;
+SYNTAX: UNION-STRUCT:
+    parse-struct-definition define-union-struct-class ;
+
+USING: vocabs vocabs.loader ;
+
+"prettyprint" vocab [ "classes.struct.prettyprint" require ] when
+
+SYNTAX: S{
+    scan-word dup struct-slots parse-tuple-literal-slots parsed ;
index f4ac97354dc65bfd8ece9054fbe43448094020db..90e88f64fb27e8cc33e6ab8a100aae535efc5002 100644 (file)
@@ -7,7 +7,7 @@ USING: coroutines kernel sequences prettyprint tools.test math ;
   [ drop 1 coyield* 2 coyield* 3 coterminate ] cocreate ;
 
 : test2 ( -- co )
-  [ 1+ coyield* ] cocreate ;
+  [ 1 + coyield* ] cocreate ;
 
 test1 dup *coresume . dup *coresume . dup *coresume . dup *coresume 2drop
 [ test2 42 over coresume . dup *coresume . drop ] must-fail
@@ -18,4 +18,4 @@ test1 dup *coresume . dup *coresume . dup *coresume . dup *coresume 2drop
 
 { "c" "b" "a" } [ test3 { "a" "b" "c" } over coresume [ dup *coresume [ *coresume ] dip ] dip ] unit-test
 
-{ 4+2/3 } [ [ 1+ coyield 2 * coyield 3 / coreset ] cocreate 1 5 [ over coresume ] times nip ] unit-test
\ No newline at end of file
+{ 4+2/3 } [ [ 1 + coyield 2 * coyield 3 / coreset ] cocreate 1 5 [ over coresume ] times nip ] unit-test
index 9d5c65aa94da179f01580122d64af8dadcccc793..10f99058b5e51140026e97b3b037f55824425ddd 100644 (file)
@@ -6,5 +6,5 @@ IN: crypto.barrett
 : barrett-mu ( n size -- mu )
     #! Calculates Barrett's reduction parameter mu
     #! size = word size in bits (8, 16, 32, 64, ...)
-    [ [ log2 1+ ] [ / 2 * ] bi* ]
+    [ [ log2 1 + ] [ / 2 * ] bi* ]
     [ 2^ rot ^ swap /i ] 2bi ;
index 286a313fda10376b80d77f717b572ab35beebe0f..30650c1e401daa806ef75eeb5e84cf6631359f9c 100644 (file)
@@ -11,7 +11,7 @@ IN: crypto.passwd-md5
     "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" nth ; inline
 
 : to64 ( v n -- string )
-    [ [ -6 shift ] [ 6 2^ 1- bitand lookup-table ] bi ]
+    [ [ -6 shift ] [ 6 2^ 1 - bitand lookup-table ] bi ]
     replicate nip ; inline
 
 PRIVATE>
index f4ef4687b5b98a2c1b60b9094be7540eb57116ce..917e98a6ee52cc7f251e7abf19a99ee737de90e4 100644 (file)
@@ -26,7 +26,7 @@ CONSTANT: public-key 65537
 : modulus-phi ( numbits -- n phi ) 
     #! Loop until phi is not divisible by the public key.
     dup rsa-primes [ * ] 2keep
-    [ 1- ] bi@ *
+    [ 1 - ] bi@ *
     dup public-key gcd nip 1 = [
         rot drop
     ] [
index 40c0b791cfd43ca4a72b200e2bac21c530b46115..615b38daf6d94ea1ca57f4349405707432e2f141 100644 (file)
@@ -29,7 +29,7 @@ IN: ctags.etags
   H{ } clone swap [ swap [ etag-add ] keep ] each ;
 
 : lines>bytes ( seq n -- bytes )
-  head 0 [ length 1+ + ] reduce ;
+  head 0 [ length 1 + + ] reduce ;
 
 : file>lines ( path -- lines )
   ascii file-lines ;
@@ -40,7 +40,7 @@ IN: ctags.etags
     1 HEX: 7f <string> %
     second dup number>string %
     1 CHAR: , <string> %
-    1- lines>bytes number>string %
+    1 - lines>bytes number>string %
   ] "" make ;
 
 : etag-length ( vector -- n )
@@ -72,4 +72,4 @@ IN: ctags.etags
   [ etag-strings ] dip ascii set-file-lines ; 
 
 : etags ( path -- )
-  [ (ctags) sort-values etag-hash >alist ] dip etags-write ;
\ No newline at end of file
+  [ (ctags) sort-values etag-hash >alist ] dip etags-write ;
index dc08656f7e578dae3b220cd93a005fb2c6b08962..77defb081d952a977e2a11f73ed1e183ed7ebb1f 100644 (file)
@@ -68,7 +68,7 @@ M: from-sequence cursor-get-unsafe
     >from-sequence< nth-unsafe ;
 
 M: from-sequence cursor-advance
-    [ 1+ ] change-n drop ;
+    [ 1 + ] change-n drop ;
 
 : >input ( seq -- cursor )
     0 from-sequence boa ; inline
index 755c57cedaee74534efdc1ceeb600fa2ee3b617d..6630d2addb9c81157f86fa46df70bc501ac1f6dc 100755 (executable)
@@ -1,16 +1,34 @@
-USING: descriptive kernel math tools.test continuations prettyprint io.streams.string see ;\r
+USING: descriptive kernel math tools.test continuations prettyprint io.streams.string see\r
+math.ratios ;\r
 IN: descriptive.tests\r
 \r
 DESCRIPTIVE: divide ( num denom -- fraction ) / ;\r
 \r
 [ 3 ] [ 9 3 divide ] unit-test\r
-[ T{ descriptive-error f { { "num" 3 } { "denom" 0 } } "Division by zero" divide } ] [ [ 3 0 divide ] [ ] recover ] unit-test\r
 \r
-[ "USING: descriptive math ;\nIN: descriptive.tests\nDESCRIPTIVE: divide ( num denom -- fraction ) / ;\n" ] [ \ divide [ see ] with-string-writer ] unit-test\r
+[\r
+    T{ descriptive-error f\r
+        { { "num" 3 } { "denom" 0 } }\r
+        T{ division-by-zero f 3 }\r
+        divide\r
+    }\r
+] [\r
+    [ 3 0 divide ] [ ] recover\r
+] unit-test\r
+\r
+[ "USING: descriptive math ;\nIN: descriptive.tests\nDESCRIPTIVE: divide ( num denom -- fraction ) / ;\n" ]\r
+[ \ divide [ see ] with-string-writer ] unit-test\r
 \r
 DESCRIPTIVE:: divide* ( num denom -- fraction ) num denom / ;\r
 \r
 [ 3 ] [ 9 3 divide* ] unit-test\r
-[ T{ descriptive-error f { { "num" 3 } { "denom" 0 } } "Division by zero" divide* } ] [ [ 3 0 divide* ] [ ] recover ] unit-test\r
+\r
+[\r
+    T{ descriptive-error f\r
+        { { "num" 3 } { "denom" 0 } }\r
+        T{ division-by-zero f 3 }\r
+        divide*\r
+    }\r
+] [ [ 3 0 divide* ] [ ] recover ] unit-test\r
 \r
 [ "USING: descriptive math ;\nIN: descriptive.tests\nDESCRIPTIVE:: divide* ( num denom -- fraction ) num denom / ;\n" ] [ \ divide* [ see ] with-string-writer ] unit-test\r
index af080f61ebb25a60bdc76b8c07b24018820a16b7..72f553c0f773daecd69fd6705937977fc250075f 100644 (file)
@@ -16,7 +16,7 @@ IN: dns.misc
 
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
-: cdr-name ( name -- name ) dup CHAR: . index 1+ tail ;
+: cdr-name ( name -- name ) dup CHAR: . index 1 + tail ;
 
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
index 644533d3a235d75df09aeef4709bd593619a7f23..773fe31ea6a1c1ddc53ccf896aea12b1155afe52 100644 (file)
@@ -120,7 +120,7 @@ DEFER: query->rrs
 ! have-delegates?
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
-: cdr-name ( name -- name ) dup CHAR: . index 1+ tail ;
+: cdr-name ( name -- name ) dup CHAR: . index 1 + tail ;
 
 : is-soa? ( name -- ? ) SOA IN query boa matching-rrs empty? not ;
 
index d76b93a4d78af2a3dcf527a8b2101bdafc99d62a..1000bb9d71c9bcaac5401d1fbc6354e09ca032a0 100644 (file)
@@ -57,7 +57,7 @@ PRIVATE>
     KEY EC_KEY_get0_public_key dup 
     [| PUB |
         KEY EC_KEY_get0_group :> GROUP
-        GROUP EC_GROUP_get_degree bits>bytes 1+ :> LEN
+        GROUP EC_GROUP_get_degree bits>bytes 1 + :> LEN
         LEN <byte-array> :> BIN
         GROUP PUB POINT_CONVERSION_COMPRESSED BIN LEN f
         EC_POINT_point2oct ssl-error
@@ -72,4 +72,4 @@ PRIVATE>
     LEN *uint SIG resize ;
 
 : ecdsa-verify ( dgst sig -- ? )
-    ec-key-handle [ 0 -rot [ dup length ] bi@ ] dip ECDSA_verify 0 > ;
\ No newline at end of file
+    ec-key-handle [ 0 -rot [ dup length ] bi@ ] dip ECDSA_verify 0 > ;
index 982319541b12c3c4b80b3a6c185103fb6d50ab62..5f78c6770cadcfbadc2dc70b4584377fb18eff52 100644 (file)
@@ -1,5 +1,6 @@
 USING: accessors calendar continuations destructors kernel math
-math.order namespaces system threads ui ui.gadgets.worlds ;
+math.order namespaces system threads ui ui.gadgets.worlds
+sequences ;
 IN: game-loop
 
 TUPLE: game-loop
@@ -40,23 +41,23 @@ TUPLE: game-loop-error game-loop error ;
 <PRIVATE
 
 : redraw ( loop -- )
-    [ 1+ ] change-frame-number
+    [ 1 + ] change-frame-number
     [ tick-slice ] [ delegate>> ] bi draw* ;
 
 : tick ( loop -- )
     delegate>> tick* ;
 
 : increment-tick ( loop -- )
-    [ 1+ ] change-tick-number
+    [ 1 + ] change-tick-number
     dup tick-length>> [ + ] curry change-last-tick
     drop ;
 
 : ?tick ( loop count -- )
-    dup zero? [ drop millis >>last-tick drop ] [
+    [ millis >>last-tick drop ] [
         over [ since-last-tick ] [ tick-length>> ] bi >=
-        [ [ drop increment-tick ] [ drop tick ] [ 1- ?tick ] 2tri ]
+        [ [ drop increment-tick ] [ drop tick ] [ 1 - ?tick ] 2tri ]
         [ 2drop ] if
-    ] if ;
+    ] if-zero ;
 
 : (run-loop) ( loop -- )
     dup running?>>
index a77ebf2577071e2d6cd12ab9b43a131a12697175..2f94f3f2d695924bb3fb87e98546f0bdf6bbcadc 100755 (executable)
@@ -69,7 +69,7 @@ M: hashcash string>>
 
 : (mint) ( tuple counter -- tuple ) 
     2dup set-suffix checksummed-bits pick 
-    valid-guess? [ drop ] [ 1+ (mint) ] if ;
+    valid-guess? [ drop ] [ 1 + (mint) ] if ;
 
 PRIVATE>
 
index 02b45ee9396c57d407f49f052138ea69cefbeed1..d206ae5f45110a4901429b911f5ef8cc7aada0f8 100755 (executable)
@@ -16,7 +16,7 @@ TUPLE: link attributes clickable ;
 
 : find-nth ( seq quot n -- i elt )
     [ <enum> >alist ] 2dip -rot
-    '[ _ [ second @ ] find-from rot drop swap 1+ ]
+    '[ _ [ second @ ] find-from rot drop swap 1 + ]
     [ f 0 ] 2dip times drop first2 ; inline
 
 : find-first-name ( vector string -- i/f tag/f )
@@ -29,7 +29,7 @@ TUPLE: link attributes clickable ;
 : find-between* ( vector i/f tag/f -- vector )
     over integer? [
         [ tail-slice ] [ name>> ] bi*
-        dupd find-matching-close drop dup [ 1+ ] when
+        dupd find-matching-close drop dup [ 1 + ] when
         [ head ] [ first ] if*
     ] [
         3drop V{ } clone
index 6d9b778ee8d1f2ba08bc5f818149d233230dcab4..38aa291a3aff4afa9afdd7bfbabf70a65a4ac001 100644 (file)
@@ -104,7 +104,7 @@ CONSTANT: id3v1+-offset $[ 128 227 + ]
     0 [ [ 7 shift ] dip bitor ] reduce ;
 
 : synchsafe>seq ( n -- seq )
-    dup 1+ log2 1+ 7 / ceiling
+    dup 1 + log2 1 + 7 / ceiling
     [ [ -7 shift ] keep HEX: 7f bitand  ] replicate nip reverse ;
 
 : filter-text-data ( data -- filtered )
index b065dfe2f0b22168193b7f6014c50b90e0805853..6ce851e7dd0137a758e981bb637189db1d8b0e73 100644 (file)
@@ -10,7 +10,7 @@ IN: irc.client.internals
 : do-connect ( server port quot: ( host port -- stream ) attempts -- stream/f )
     dup 0 > [
         [ drop call( host port -- stream ) ]
-        [ drop 15 sleep 1- do-connect ]
+        [ drop 15 sleep 1 - do-connect ]
         recover
     ] [ 2drop 2drop f ] if ;
 
index 986574ee9148c847dc74fae2b047ed5136a3c0e9..ac5be9df2e18b8630ed65dd01e95e6397ad9c6a0 100644 (file)
@@ -13,7 +13,7 @@ TUPLE: segment < oint number color radius ;
 C: <segment> segment
 
 : segment-number++ ( segment -- )
-    [ number>> 1+ ] keep (>>number) ;
+    [ number>> 1 + ] keep (>>number) ;
 
 : clamp-length ( n seq -- n' )
     0 swap length clamp ;
@@ -31,7 +31,7 @@ CONSTANT: random-rotation-angle $[ pi 20 / ]
 
 : (random-segments) ( segments n -- segments )
     dup 0 > [
-        [ dup last 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
@@ -78,7 +78,7 @@ CONSTANT: default-segment-radius 1
     rot dup length swap <slice> find-nearest-segment ;
 
 : nearest-segment-backward ( segments oint start -- segment )
-    swapd 1+ 0 spin <slice> <reversed> find-nearest-segment ;
+    swapd 1 + 0 spin <slice> <reversed> find-nearest-segment ;
 
 : nearest-segment ( segments oint start-segment -- segment )
     #! find the segment nearest to 'oint', and return it.
@@ -91,10 +91,10 @@ CONSTANT: default-segment-radius 1
     over clamp-length swap nth ;
 
 : next-segment ( segments current-segment -- segment )
-    number>> 1+ get-segment ;
+    number>> 1 + get-segment ;
 
 : previous-segment ( segments current-segment -- segment )
-    number>> 1- get-segment ;
+    number>> 1 - get-segment ;
 
 : heading-segment ( segments current-segment heading -- segment )
     #! the next segment on the given heading
index 1ecd56d416d2df77e1fa02023eebe02cd7f304d9..59efec1c02302124c896aa0956fc71e538470e8b 100755 (executable)
@@ -75,7 +75,7 @@ SYMBOL: terms
 
 : inversions ( seq -- n )
     0 swap [ length ] keep [
-        [ nth ] 2keep swap 1+ tail-slice (inversions) +
+        [ nth ] 2keep swap 1 + tail-slice (inversions) +
     ] curry each ;
 
 : duplicates? ( seq -- ? )
@@ -141,7 +141,7 @@ DEFER: (d)
 
 ! Computing a basis
 : graded ( seq -- seq )
-    dup 0 [ length max ] reduce 1+ [ V{ } clone ] replicate
+    dup 0 [ length max ] reduce 1 + [ V{ } clone ] replicate
     [ dup length pick nth push ] reduce ;
 
 : nth-basis-elt ( generators n -- elt )
@@ -176,7 +176,7 @@ DEFER: (d)
 ! Graded by degree
 : (graded-ker/im-d) ( n seq -- null/rank )
     #! d: C(n) ---> C(n+1)
-    [ ?nth ] [ [ 1+ ] dip ?nth ] 2bi
+    [ ?nth ] [ [ 1 + ] dip ?nth ] 2bi
     dim-im/ker-d ;
 
 : graded-ker/im-d ( graded-basis -- seq )
@@ -240,7 +240,7 @@ DEFER: (d)
     ] if ;
 
 : graded-triple ( seq n -- triple )
-    3 [ 1- + ] with map swap [ ?nth ] curry map ;
+    3 [ 1 - + ] with map swap [ ?nth ] curry map ;
 
 : graded-triples ( seq -- triples )
     dup length [ graded-triple ] with map ;
index a1fc0bd07b904c0301e533bfa74e6e993fa0e652..39d6450ba0cffc20d317b4e4608f473964bf746c 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2008 Doug Coleman, Slava Pestov, Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: combinators.short-circuit kernel math math.constants math.functions
-    math.vectors sequences ;
+USING: combinators.short-circuit kernel math math.constants
+math.functions math.vectors sequences ;
 IN: math.analysis
 
 <PRIVATE
@@ -117,5 +117,5 @@ PRIVATE>
 : stirling-fact ( n -- fact )
     [ pi 2 * * sqrt ]
     [ [ e / ] keep ^ ]
-    [ 12 * recip 1+ ] tri * * ;
+    [ 12 * recip 1 + ] tri * * ;
 
index 3e0e5437b4bff5491f635499f7db2ce05d865b19..55789778af26ad7f1dc7eaecf978f44c1bf6a95e 100644 (file)
@@ -45,7 +45,7 @@ MACRO: duals>nweave ( n -- )
 MACRO: chain-rule ( word -- e )
     [ input-length '[ _ duals>nweave ] ]
     [ "derivative" word-prop ]
-    [ input-length 1+ '[ _ nspread ] ]
+    [ input-length 1 + '[ _ nspread ] ]
     tri
     '[ [ @ _ @ ] sum-outputs ] ;
 
@@ -80,4 +80,4 @@ MACRO: dual-op ( word -- )
 
 ! Specialize math functions to operate on dual numbers.
 [ all-words [ "derivative" word-prop ] filter
-    [ define-dual ] each ] with-compilation-unit
\ No newline at end of file
+    [ define-dual ] each ] with-compilation-unit
index 4823e358b007137783752f7258d3998eb9727daa..5954b08c9b3649331aafe2c0d666dc73c6defd7b 100644 (file)
@@ -7,10 +7,10 @@ IN: math.finance
 <PRIVATE
 
 : weighted ( x y a -- z )
-    tuck [ * ] [ 1- neg * ] 2bi* + ;
+    tuck [ * ] [ 1 - neg * ] 2bi* + ;
 
 : a ( n -- a )
-    1+ 2 swap / ;
+    1 + 2 swap / ;
 
 PRIVATE>
 
index 13f314f6bae8778bff5a470cbea7a099b5f3f7c7..c2733058b3c4ed6cbcf1aa8368fdbafb0aca5a65 100644 (file)
@@ -6,4 +6,4 @@ IN: math.primes.lists
 : lprimes ( -- list ) 2 [ next-prime ] lfrom-by ;
 
 : lprimes-from ( n -- list )
-    dup 3 < [ drop lprimes ] [ 1- next-prime [ next-prime ] lfrom-by ] if ;
+    dup 3 < [ drop lprimes ] [ 1 - next-prime [ next-prime ] lfrom-by ] if ;
index 492453450b9ecf0f6e0433999741d4ad1b745c34..422036d5cc39ae6c44c819f5632c926439653c17 100755 (executable)
@@ -87,7 +87,7 @@ SYMBOL: and-needed?
     ] if ;
 
 : (number>text) ( n -- str )
-    [ negative-text ] [ abs 3digit-groups recombine ] bi append ;
+    [ negative-text ] [ abs 3 digit-groups recombine ] bi append ;
 
 PRIVATE>
 
index f8b97103eb30183f635a95160c49a360e505851e..8d313b91970f4fcc3dfe4eba2fa4417e7bf8879f 100644 (file)
@@ -73,7 +73,7 @@ MEMO: units ( -- seq ) ! up to 10^99
     } cond ;
 
 : over-1000000 ( n -- str )
-    3digit-groups [ 1+ units nth n-units ] map-index sift
+    3 digit-groups [ 1 + units nth n-units ] map-index sift
     reverse " " join ;
 
 : decompose ( n -- str ) 1000000 /mod [ over-1000000 ] dip complete ;
old mode 100644 (file)
new mode 100755 (executable)
index e1d1a00..2352ab9
@@ -1,6 +1,6 @@
 USING: help.markup help.syntax ;
 IN: math.text.utils
 
-HELP: 3digit-groups
-{ $values { "n" "a positive integer" } { "seq" "a sequence" } }
-{ $description "Decompose a number into 3 digits groups and return them in a sequence, starting with the units, then the tenths, etc." } ;
+HELP: digit-groups
+{ $values { "n" "a positive integer" } { "k" "a positive integer" } { "seq" "a sequence" } }
+{ $description "Decompose a number into groups of " { $snippet "k" } " digits and return them in a sequence starting with the least significant grouped digits first." } ;
old mode 100644 (file)
new mode 100755 (executable)
index d14bb06..04fbcdc
@@ -1,3 +1,3 @@
 USING: math.text.utils tools.test ;
 
-[ { 1 999 2 } ] [ 2999001 3digit-groups ] unit-test
+[ { 1 999 2 } ] [ 2999001 3 digit-groups ] unit-test
old mode 100644 (file)
new mode 100755 (executable)
index 422a79a..13551f1
@@ -1,7 +1,7 @@
 ! Copyright (c) 2007, 2008 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel math sequences ;
+USING: kernel fry math.functions math sequences ;
 IN: math.text.utils
 
-: 3digit-groups ( n -- seq )
-    [ dup 0 > ] [ 1000 /mod ] produce nip ;
+: digit-groups ( n k -- seq )
+    [ dup 0 > ] swap '[ _ 10^ /mod ] produce nip ;
diff --git a/extra/memory/piles/authors.txt b/extra/memory/piles/authors.txt
new file mode 100644 (file)
index 0000000..f13c9c1
--- /dev/null
@@ -0,0 +1 @@
+Joe Groff
diff --git a/extra/memory/piles/piles-docs.factor b/extra/memory/piles/piles-docs.factor
new file mode 100644 (file)
index 0000000..c2bc29a
--- /dev/null
@@ -0,0 +1,49 @@
+! (c)2009 Joe Groff bsd license
+USING: alien destructors help.markup help.syntax kernel math ;
+IN: memory.piles
+
+HELP: <pile>
+{ $values
+    { "size" integer }
+    { "pile" pile }
+}
+{ $description "Allocates " { $snippet "size" } " bytes of raw memory for a new " { $link pile } ". The pile should be " { $link dispose } "d when it is no longer needed." } ;
+
+HELP: not-enough-pile-space
+{ $values
+    { "pile" pile }
+}
+{ $description "This error is thrown by " { $link pile-alloc } " when the " { $link pile } " does not have enough remaining space for the requested allocation." } ;
+
+HELP: pile
+{ $class-description "A " { $snippet "pile" } " is a block of raw memory that can be apportioned out in constant time. A pile is allocated using the " { $link <pile> } " word. Blocks of memory can be requested from the pile using " { $link pile-alloc } ", and all the pile's memory can be reclaimed with " { $link pile-empty } "." } ;
+
+HELP: pile-align
+{ $values
+    { "pile" pile } { "align" "a power of two" }
+    { "pile" pile }
+}
+{ $description "Adjusts a " { $link pile } "'s internal state so that the next call to " { $link pile-alloc } " will return a pointer aligned to " { $snippet "align" } " bytes relative to the pile's initial offset." } ;
+
+HELP: pile-alloc
+{ $values
+    { "pile" pile } { "size" integer }
+    { "alien" alien }
+}
+{ $description "Requests " { $snippet "size" } " bytes from a " { $link pile } ". If the pile does not have enough space to satisfy the request, a " { $link not-enough-pile-space } " error is thrown." } ;
+
+HELP: pile-empty
+{ $values
+    { "pile" pile }
+}
+{ $description "Reclaims all the memory allocated out of a " { $link pile } ". Allocations will resume from the beginning of the pile." } ;
+
+ARTICLE: "memory.piles" "Piles"
+"A " { $link pile } " is a block of raw memory. Portions of its memory can be allocated from the beginning of the pile in constant time, and the pile can be emptied and its pointer reset to the beginning."
+{ $subsection <pile> }
+{ $subsection pile-alloc }
+{ $subsection pile-align }
+{ $subsection pile-empty }
+"An example of the utility of piles is in video games. For example, the game Abuse was scripted with a Lisp dialect. In order to avoid stalls from traditional GC or heap-based allocators, the Abuse Lisp VM would allocate values from a preallocated pile over the course of a frame, and release the entire pile at the end of the frame." ;
+
+ABOUT: "memory.piles"
diff --git a/extra/memory/piles/piles-tests.factor b/extra/memory/piles/piles-tests.factor
new file mode 100644 (file)
index 0000000..4bb9cc2
--- /dev/null
@@ -0,0 +1,47 @@
+! (c)2009 Joe Groff bsd license
+USING: accessors alien destructors kernel math
+memory.piles tools.test ;
+IN: memory.piles.tests
+
+[ 25 ] [
+    [
+        100 <pile> &dispose
+        [ 25 pile-alloc ] [ 50 pile-alloc ] bi
+        swap [ alien-address ] bi@ -
+    ] with-destructors
+] unit-test
+
+[ 32 ] [
+    [
+        100 <pile> &dispose
+        [ 25 pile-alloc ] [ 8 pile-align 50 pile-alloc ] bi
+        swap [ alien-address ] bi@ -
+    ] with-destructors
+] unit-test
+
+[ 75 ] [
+    [
+        100 <pile> &dispose
+        dup 25 pile-alloc drop
+        dup 50 pile-alloc drop
+        offset>>
+    ] with-destructors
+] unit-test
+
+[ 100 ] [
+    [
+        100 <pile> &dispose
+        dup 25 pile-alloc drop
+        dup 75 pile-alloc drop
+        offset>>
+    ] with-destructors
+] unit-test
+
+[
+    [
+        100 <pile> &dispose
+        dup 25 pile-alloc drop
+        dup 76 pile-alloc drop
+    ] with-destructors
+] [ not-enough-pile-space? ] must-fail-with
+
diff --git a/extra/memory/piles/piles.factor b/extra/memory/piles/piles.factor
new file mode 100644 (file)
index 0000000..b8a79b4
--- /dev/null
@@ -0,0 +1,33 @@
+! (c)2009 Joe Groff bsd license
+USING: accessors alien destructors kernel libc math ;
+IN: memory.piles
+
+TUPLE: pile
+    { underlying c-ptr }
+    { size integer }
+    { offset integer } ;
+
+ERROR: not-enough-pile-space pile ;
+
+M: pile dispose
+    [ [ free ] when* f ] change-underlying drop ;
+
+: <pile> ( size -- pile )
+    [ malloc ] keep 0 pile boa ;
+
+: pile-empty ( pile -- )
+    0 >>offset drop ;
+
+: pile-alloc ( pile size -- alien )
+    [
+        [ [ ] [ size>> ] [ offset>> ] tri ] dip +
+        < [ not-enough-pile-space ] [ drop ] if
+    ] [
+        drop [ offset>> ] [ underlying>> ] bi <displaced-alien>
+    ] [
+        [ + ] curry change-offset drop
+    ] 2tri ;
+
+: pile-align ( pile align -- pile )
+    [ align ] curry change-offset ;
+    
diff --git a/extra/memory/piles/summary.txt b/extra/memory/piles/summary.txt
new file mode 100644 (file)
index 0000000..f217f30
--- /dev/null
@@ -0,0 +1 @@
+Preallocated raw memory blocks
diff --git a/extra/memory/pools/authors.txt b/extra/memory/pools/authors.txt
new file mode 100644 (file)
index 0000000..f13c9c1
--- /dev/null
@@ -0,0 +1 @@
+Joe Groff
diff --git a/extra/memory/pools/pools-docs.factor b/extra/memory/pools/pools-docs.factor
new file mode 100644 (file)
index 0000000..a2cc5d7
--- /dev/null
@@ -0,0 +1,76 @@
+! (c)2009 Joe Groff bsd license
+USING: classes help.markup help.syntax kernel math ;
+IN: memory.pools
+
+HELP: <pool>
+{ $values
+    { "size" integer } { "class" class }
+    { "pool" pool }
+}
+{ $description "Creates a " { $link pool } " of " { $snippet "size" } " objects of " { $snippet "class" } "." } ;
+
+HELP: POOL:
+{ $syntax "POOL: class size" }
+{ $description "Creates a " { $link pool } " of " { $snippet "size" } " objects of " { $snippet "class" } ", and associates it with the class using " { $link set-class-pool } "." } ;
+
+HELP: class-pool
+{ $values
+    { "class" class }
+    { "pool" pool }
+}
+{ $description "Returns the " { $link pool } " associated with " { $snippet "class" } ", or " { $link f } " if no pool is associated." } ;
+
+HELP: free-to-pool
+{ $values
+    { "object" object }
+}
+{ $description "Frees an object from the " { $link pool } " it was allocated from. The object must have been allocated by " { $link new-from-pool } "." } ;
+
+HELP: new-from-pool
+{ $values
+    { "class" class }
+    { "object" object }
+}
+{ $description "Allocates an object from the " { $link pool } " associated with " { $snippet "class" } ". If the pool is exhausted, " { $link f } " is returned." } ;
+
+{ POSTPONE: POOL: class-pool set-class-pool new-from-pool free-to-pool } related-words
+
+HELP: pool
+{ $class-description "A " { $snippet "pool" } " contains a fixed-size set of preallocated tuple objects. Once the pool has been allocated, its objects can be allocated with " { $link pool-new } " and freed with " { $link pool-free } " in constant time. A pool can also be associated with its class with the " { $link POSTPONE: POOL: } " syntax or the " { $link set-class-pool } " word, after which the words " { $link new-from-pool } " and " { $link free-to-pool } " can be used with the class name to allocate and free objects." } ;
+
+HELP: pool-free
+{ $values
+    { "object" object } { "pool" pool }
+}
+{ $description "Frees an object back into " { $link pool } "." } ;
+
+HELP: pool-size
+{ $values
+    { "pool" pool }
+    { "size" integer }
+}
+{ $description "Returns the number of unallocated objects inside a " { $link pool } "." } ;
+
+HELP: pool-new
+{ $values
+    { "pool" pool }
+    { "object" object }
+}
+{ $description "Returns an unallocated object out of a " { $link pool } ". If the pool is exhausted, " { $link f } " is returned." } ;
+
+{ pool <pool> pool-new pool-free pool-size } related-words
+
+HELP: set-class-pool
+{ $values
+    { "class" class } { "pool" pool }
+}
+{ $description "Associates a " { $link pool } " with " { $snippet "class" } "." } ;
+
+ARTICLE: "memory.pools" "Pools"
+"The " { $vocab-link "memory.pools" } " vocabulary provides " { $link pool } " objects which manage preallocated collections of objects."
+{ $subsection pool }
+{ $subsection POSTPONE: POOL: }
+{ $subsection new-from-pool }
+{ $subsection free-to-pool } ;
+
+ABOUT: "memory.pools"
diff --git a/extra/memory/pools/pools-tests.factor b/extra/memory/pools/pools-tests.factor
new file mode 100644 (file)
index 0000000..29f99a5
--- /dev/null
@@ -0,0 +1,28 @@
+! (c)2009 Joe Groff bsd license
+USING: kernel memory.pools tools.test ;
+IN: memory.pools.tests
+
+TUPLE: foo x ;
+
+[ 1 ] [
+    foo 2 foo <pool> set-class-pool
+
+    foo new-from-pool drop
+    foo class-pool pool-size
+] unit-test
+
+[ T{ foo } T{ foo } f ] [
+    foo 2 foo <pool> set-class-pool
+
+    foo new-from-pool
+    foo new-from-pool
+    foo new-from-pool
+] unit-test
+
+[ f ] [
+    foo 2 foo <pool> set-class-pool
+
+    foo new-from-pool
+    foo new-from-pool
+    eq?
+] unit-test
diff --git a/extra/memory/pools/pools.factor b/extra/memory/pools/pools.factor
new file mode 100644 (file)
index 0000000..33d1fbe
--- /dev/null
@@ -0,0 +1,54 @@
+! (c)2009 Joe Groff bsd license
+USING: accessors arrays bit-arrays classes
+classes.tuple.private fry kernel locals parser
+sequences sequences.private vectors words ;
+IN: memory.pools
+
+TUPLE: pool
+    prototype
+    { objects vector } ;
+
+: <pool> ( size class -- pool )
+    [ nip new ]
+    [ [ iota ] dip '[ _ new ] V{ } replicate-as ] 2bi
+    pool boa ;
+
+: pool-size ( pool -- size )
+    objects>> length ;
+
+<PRIVATE
+
+:: copy-tuple ( from to -- to )
+    from tuple-size :> size
+    size [| n | n from array-nth n to set-array-nth ] each
+    to ; inline
+
+: (pool-new) ( pool -- object )
+    objects>> [ f ] [ pop ] if-empty ;
+
+: (pool-init) ( pool object -- object )
+    [ prototype>> ] dip copy-tuple ; inline
+
+PRIVATE>
+
+: pool-new ( pool -- object )
+    dup (pool-new) [ (pool-init) ] [ drop f ] if* ; inline
+
+: pool-free ( object pool -- )
+    objects>> push ;
+
+: class-pool ( class -- pool )
+    "pool" word-prop ;
+
+: set-class-pool ( class pool -- )
+    "pool" set-word-prop ;
+
+: new-from-pool ( class -- object )
+    class-pool pool-new ;
+
+: free-to-pool ( object -- )
+    dup class class-pool pool-free ;
+
+SYNTAX: POOL:
+    scan-word scan-word '[ _ swap <pool> ] [ swap set-class-pool ] bi ;
+
diff --git a/extra/memory/pools/summary.txt b/extra/memory/pools/summary.txt
new file mode 100644 (file)
index 0000000..e9e83c3
--- /dev/null
@@ -0,0 +1 @@
+Preallocated pools of tuple objects
index 0f1eb8edda53fcf203689f1d7640ecf212b4e903..5504633bb636fdac67bc5007f3c930467c142776 100644 (file)
@@ -78,7 +78,7 @@ IN: monads.tests
 ] unit-test
 
 LAZY: nats-from ( n -- list )
-    dup 1+ nats-from cons ;
+    dup 1 + nats-from cons ;
 
 : nats ( -- list ) 0 nats-from ;
 
index 994d2143355c5925e2c583b855625ac325215d14..36dedb2a653b92e2f661317f227a2a1256ce23f0 100644 (file)
@@ -28,6 +28,6 @@ ERROR: not-an-integer x ;
     [
         [ dup string>number [ nip ] [ not-an-integer ] if* ] bi@
     ] keep length
-    10 swap ^ / + swap [ neg ] when ;
+    10^ / + swap [ neg ] when ;
 
 SYNTAX: DECIMAL: scan parse-decimal parsed ;
diff --git a/extra/multi-methods/authors.txt b/extra/multi-methods/authors.txt
new file mode 100755 (executable)
index 0000000..1901f27
--- /dev/null
@@ -0,0 +1 @@
+Slava Pestov
diff --git a/extra/multi-methods/multi-methods.factor b/extra/multi-methods/multi-methods.factor
new file mode 100755 (executable)
index 0000000..d3e1d44
--- /dev/null
@@ -0,0 +1,281 @@
+! Copyright (C) 2008, 2009 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: kernel math sequences vectors classes classes.algebra
+combinators arrays words assocs parser namespaces make
+definitions prettyprint prettyprint.backend prettyprint.custom
+quotations generalizations debugger io compiler.units
+kernel.private effects accessors hashtables sorting shuffle
+math.order sets see effects.parser ;
+IN: multi-methods
+
+! PART I: Converting hook specializers
+: canonicalize-specializer-0 ( specializer -- specializer' )
+    [ \ f or ] map ;
+
+SYMBOL: args
+
+SYMBOL: hooks
+
+SYMBOL: total
+
+: canonicalize-specializer-1 ( specializer -- specializer' )
+    [
+        [ class? ] filter
+        [ length <reversed> [ 1 + neg ] map ] keep zip
+        [ length args [ max ] change ] keep
+    ]
+    [
+        [ pair? ] filter
+        [ keys [ hooks get adjoin ] each ] keep
+    ] bi append ;
+
+: canonicalize-specializer-2 ( specializer -- specializer' )
+    [
+        [
+            {
+                { [ dup integer? ] [ ] }
+                { [ dup word? ] [ hooks get index ] }
+            } cond args get +
+        ] dip
+    ] assoc-map ;
+
+: canonicalize-specializer-3 ( specializer -- specializer' )
+    [ total get object <array> dup <enum> ] dip update ;
+
+: canonicalize-specializers ( methods -- methods' hooks )
+    [
+        [ [ canonicalize-specializer-0 ] dip ] assoc-map
+
+        0 args set
+        V{ } clone hooks set
+
+        [ [ canonicalize-specializer-1 ] dip ] assoc-map
+
+        hooks [ natural-sort ] change
+
+        [ [ canonicalize-specializer-2 ] dip ] assoc-map
+
+        args get hooks get length + total set
+
+        [ [ canonicalize-specializer-3 ] dip ] assoc-map
+
+        hooks get
+    ] with-scope ;
+
+: drop-n-quot ( n -- quot ) \ drop <repetition> >quotation ;
+
+: prepare-method ( method n -- quot )
+    [ 1quotation ] [ drop-n-quot ] bi* prepend ;
+
+: prepare-methods ( methods -- methods' prologue )
+    canonicalize-specializers
+    [ length [ prepare-method ] curry assoc-map ] keep
+    [ [ get ] curry ] map concat [ ] like ;
+
+! Part II: Topologically sorting specializers
+: maximal-element ( seq quot -- n elt )
+    dupd [
+        swapd [ call +lt+ = ] 2curry filter empty?
+    ] 2curry find [ "Topological sort failed" throw ] unless* ;
+    inline
+
+: topological-sort ( seq quot -- newseq )
+    [ >vector [ dup empty? not ] ] dip
+    [ dupd maximal-element [ over delete-nth ] dip ] curry
+    produce nip ; inline
+
+: classes< ( seq1 seq2 -- lt/eq/gt )
+    [
+        {
+            { [ 2dup eq? ] [ +eq+ ] }
+            { [ 2dup [ class<= ] [ swap class<= ] 2bi and ] [ +eq+ ] }
+            { [ 2dup class<= ] [ +lt+ ] }
+            { [ 2dup swap class<= ] [ +gt+ ] }
+            [ +eq+ ]
+        } cond 2nip
+    ] 2map [ +eq+ eq? not ] find nip +eq+ or ;
+
+: sort-methods ( alist -- alist' )
+    [ [ first ] bi@ classes< ] topological-sort ;
+
+! PART III: Creating dispatch quotation
+: picker ( n -- quot )
+    {
+        { 0 [ [ dup ] ] }
+        { 1 [ [ over ] ] }
+        { 2 [ [ pick ] ] }
+        [ 1 - picker [ dip swap ] curry ]
+    } case ;
+
+: (multi-predicate) ( class picker -- quot )
+    swap "predicate" word-prop append ;
+
+: multi-predicate ( classes -- quot )
+    dup length <reversed>
+    [ picker 2array ] 2map
+    [ drop object eq? not ] assoc-filter
+    [ [ t ] ] [
+        [ (multi-predicate) ] { } assoc>map
+        unclip [ swap [ f ] \ if 3array append [ ] like ] reduce
+    ] if-empty ;
+
+: argument-count ( methods -- n )
+    keys 0 [ length max ] reduce ;
+
+ERROR: no-method arguments generic ;
+
+: make-default-method ( methods generic -- quot )
+    [ argument-count ] dip [ [ narray ] dip no-method ] 2curry ;
+
+: multi-dispatch-quot ( methods generic -- quot )
+    [ make-default-method ]
+    [ drop [ [ multi-predicate ] dip ] assoc-map reverse ]
+    2bi alist>quot ;
+
+! Generic words
+PREDICATE: generic < word
+    "multi-methods" word-prop >boolean ;
+
+: methods ( word -- alist )
+    "multi-methods" word-prop >alist ;
+
+: make-generic ( generic -- quot )
+    [
+        [ methods prepare-methods % sort-methods ] keep
+        multi-dispatch-quot %
+    ] [ ] make ;
+
+: update-generic ( word -- )
+    dup make-generic define ;
+
+! Methods
+PREDICATE: method-body < word
+    "multi-method-generic" word-prop >boolean ;
+
+M: method-body stack-effect
+    "multi-method-generic" word-prop stack-effect ;
+
+M: method-body crossref?
+    "forgotten" word-prop not ;
+
+: method-word-name ( specializer generic -- string )
+    [ name>> % "-" % unparse % ] "" make ;
+
+: method-word-props ( specializer generic -- assoc )
+    [
+        "multi-method-generic" set
+        "multi-method-specializer" set
+    ] H{ } make-assoc ;
+
+: <method> ( specializer generic -- word )
+    [ method-word-props ] 2keep
+    method-word-name f <word>
+    swap >>props ;
+
+: with-methods ( word quot -- )
+    over [
+        [ "multi-methods" word-prop ] dip call
+    ] dip update-generic ; inline
+
+: reveal-method ( method classes generic -- )
+    [ set-at ] with-methods ;
+
+: method ( classes word -- method )
+    "multi-methods" word-prop at ;
+
+: create-method ( classes generic -- method )
+    2dup method dup [
+        2nip
+    ] [
+        drop [ <method> dup ] 2keep reveal-method
+    ] if ;
+
+: niceify-method ( seq -- seq )
+    [ dup \ f eq? [ drop f ] when ] map ;
+
+M: no-method error.
+    "Type check error" print
+    nl
+    "Generic word " write dup generic>> pprint
+    " does not have a method applicable to inputs:" print
+    dup arguments>> short.
+    nl
+    "Inputs have signature:" print
+    dup arguments>> [ class ] map niceify-method .
+    nl
+    "Available methods: " print
+    generic>> methods canonicalize-specializers drop sort-methods
+    keys [ niceify-method ] map stack. ;
+
+: forget-method ( specializer generic -- )
+    [ delete-at ] with-methods ;
+
+: method>spec ( method -- spec )
+    [ "multi-method-specializer" word-prop ]
+    [ "multi-method-generic" word-prop ] bi prefix ;
+
+: define-generic ( word effect -- )
+    over set-stack-effect
+    dup "multi-methods" word-prop [ drop ] [
+        [ H{ } clone "multi-methods" set-word-prop ]
+        [ update-generic ]
+        bi
+    ] if ;
+
+! Syntax
+SYNTAX: GENERIC: CREATE-WORD complete-effect define-generic ;
+
+: parse-method ( -- quot classes generic )
+    parse-definition [ 2 tail ] [ second ] [ first ] tri ;
+
+: create-method-in ( specializer generic -- method )
+    create-method dup save-location f set-word ;
+
+: CREATE-METHOD ( -- method )
+    scan-word scan-object swap create-method-in ;
+
+: (METHOD:) ( -- method def ) CREATE-METHOD parse-definition ;
+
+SYNTAX: METHOD: (METHOD:) define ;
+
+! For compatibility
+SYNTAX: M:
+    scan-word 1array scan-word create-method-in
+    parse-definition
+    define ;
+
+! Definition protocol. We qualify core generics here
+QUALIFIED: syntax
+
+syntax:M: generic definer drop \ GENERIC: f ;
+
+syntax:M: generic definition drop f ;
+
+PREDICATE: method-spec < array
+    unclip generic? [ [ class? ] all? ] dip and ;
+
+syntax:M: method-spec where
+    dup unclip method [ ] [ first ] ?if where ;
+
+syntax:M: method-spec set-where
+    unclip method set-where ;
+
+syntax:M: method-spec definer
+    unclip method definer ;
+
+syntax:M: method-spec definition
+    unclip method definition ;
+
+syntax:M: method-spec synopsis*
+    unclip method synopsis* ;
+
+syntax:M: method-spec forget*
+    unclip method forget* ;
+
+syntax:M: method-body definer
+    drop \ METHOD: \ ; ;
+
+syntax:M: method-body synopsis*
+    dup definer.
+    [ "multi-method-generic" word-prop pprint-word ]
+    [ "multi-method-specializer" word-prop pprint* ] bi ;
diff --git a/extra/multi-methods/summary.txt b/extra/multi-methods/summary.txt
new file mode 100755 (executable)
index 0000000..ec8214b
--- /dev/null
@@ -0,0 +1 @@
+Experimental multiple dispatch implementation
diff --git a/extra/multi-methods/tags.txt b/extra/multi-methods/tags.txt
new file mode 100644 (file)
index 0000000..f427429
--- /dev/null
@@ -0,0 +1 @@
+extensions
diff --git a/extra/multi-methods/tests/canonicalize.factor b/extra/multi-methods/tests/canonicalize.factor
new file mode 100644 (file)
index 0000000..6ddd5d6
--- /dev/null
@@ -0,0 +1,66 @@
+USING: multi-methods tools.test math sequences namespaces system
+kernel strings ;
+IN: multi-methods.tests
+
+[ { POSTPONE: f integer } ] [ { f integer } canonicalize-specializer-0 ] unit-test
+
+: setup-canon-test ( -- )
+    0 args set
+    V{ } clone hooks set ;
+
+: canon-test-1 ( -- seq )
+    { integer { cpu x86 } sequence } canonicalize-specializer-1 ;
+
+[ { { -2 integer } { -1 sequence } { cpu x86 } } ] [
+    [
+        setup-canon-test
+        canon-test-1
+    ] with-scope
+] unit-test
+
+[ { { 0 integer } { 1 sequence } { 2 x86 } } ] [
+    [
+        setup-canon-test
+        canon-test-1
+        canonicalize-specializer-2
+    ] with-scope
+] unit-test
+
+[ { integer sequence x86 } ] [
+    [
+        setup-canon-test
+        canon-test-1
+        canonicalize-specializer-2
+        args get hooks get length + total set
+        canonicalize-specializer-3
+    ] with-scope
+] unit-test
+
+CONSTANT: example-1
+    {
+        { { { cpu x86 } { os linux } } "a" }
+        { { { cpu ppc } } "b" }
+        { { string { os windows } } "c" }
+    }
+
+[
+    {
+        { { object x86 linux } "a"  }
+        { { object ppc object } "b" }
+        { { string object windows } "c" }
+    }
+    { cpu os }
+] [
+    example-1 canonicalize-specializers
+] unit-test
+
+[
+    {
+        { { object x86 linux } [ drop drop "a" ] }
+        { { object ppc object } [ drop drop "b" ] }
+        { { string object windows } [ drop drop "c" ] }
+    }
+    [ \ cpu get \ os get ]
+] [
+    example-1 prepare-methods
+] unit-test
diff --git a/extra/multi-methods/tests/definitions.factor b/extra/multi-methods/tests/definitions.factor
new file mode 100644 (file)
index 0000000..a483a49
--- /dev/null
@@ -0,0 +1,30 @@
+USING: multi-methods tools.test math sequences namespaces system
+kernel strings words compiler.units quotations ;
+IN: multi-methods.tests
+
+DEFER: fake
+\ fake H{ } clone "multi-methods" set-word-prop
+<< (( -- )) \ fake set-stack-effect >>
+
+[ "fake-{ }" ] [ { } \ fake method-word-name ] unit-test
+
+[ H{ { "multi-method-generic" fake } { "multi-method-specializer" { } } } ]
+[ { } \ fake method-word-props ] unit-test
+
+[ t ] [ { } \ fake <method> method-body? ] unit-test
+
+[
+    [ { } [ ] ] [ \ fake methods prepare-methods [ sort-methods ] dip ] unit-test
+
+    [ t ] [ { } \ fake multi-dispatch-quot callable? ] unit-test
+
+    [ t ] [ \ fake make-generic quotation? ] unit-test
+
+    [ ] [ \ fake update-generic ] unit-test
+
+    DEFER: testing
+
+    [ ] [ \ testing (( -- )) define-generic ] unit-test
+
+    [ t ] [ \ testing generic? ] unit-test
+] with-compilation-unit
diff --git a/extra/multi-methods/tests/legacy.factor b/extra/multi-methods/tests/legacy.factor
new file mode 100644 (file)
index 0000000..28bfa28
--- /dev/null
@@ -0,0 +1,10 @@
+USING: math strings sequences tools.test ;
+IN: multi-methods.tests
+
+GENERIC: legacy-test ( a -- b )
+
+M: integer legacy-test sq ;
+M: string legacy-test " hey" append ;
+
+[ 25 ] [ 5 legacy-test ] unit-test
+[ "hello hey" ] [ "hello" legacy-test ] unit-test
diff --git a/extra/multi-methods/tests/syntax.factor b/extra/multi-methods/tests/syntax.factor
new file mode 100644 (file)
index 0000000..afe6037
--- /dev/null
@@ -0,0 +1,65 @@
+USING: multi-methods tools.test math sequences namespaces system
+kernel strings definitions prettyprint debugger arrays
+hashtables continuations classes assocs accessors see ;
+RENAME: GENERIC: multi-methods => multi-methods:GENERIC:
+IN: multi-methods.tests
+
+multi-methods:GENERIC: first-test ( -- )
+
+[ t ] [ \ first-test generic? ] unit-test
+
+MIXIN: thing
+
+SINGLETON: paper    INSTANCE: paper thing
+SINGLETON: scissors INSTANCE: scissors thing
+SINGLETON: rock     INSTANCE: rock thing
+
+multi-methods:GENERIC: beats? ( obj1 obj2 -- ? )
+
+METHOD: beats? { paper scissors } 2drop t ;
+METHOD: beats? { scissors rock } 2drop t ;
+METHOD: beats? { rock paper } 2drop t ;
+METHOD: beats? { thing thing } 2drop f ;
+
+: play ( obj1 obj2 -- ? ) beats? ;
+
+[ { } 3 play ] must-fail
+[ t ] [ error get no-method? ] unit-test
+[ ] [ error get error. ] unit-test
+[ { { } 3 } ] [ error get arguments>> ] unit-test
+[ t ] [ paper scissors play ] unit-test
+[ f ] [ scissors paper play ] unit-test
+
+[ t ] [ { beats? paper scissors } method-spec? ] unit-test
+[ ] [ { beats? paper scissors } see ] unit-test
+
+SYMBOL: some-var
+
+multi-methods:GENERIC: hook-test ( obj -- obj )
+
+METHOD: hook-test { array { some-var array } } reverse ;
+METHOD: hook-test { { some-var array } } class ;
+METHOD: hook-test { hashtable { some-var number } } assoc-size ;
+
+{ 1 2 3 } some-var set
+[ { f t t } ] [ { t t f } hook-test ] unit-test
+[ fixnum ] [ 3 hook-test ] unit-test
+5.0 some-var set
+[ 0 ] [ H{ } hook-test ] unit-test
+
+"error" some-var set
+[ H{ } hook-test ] must-fail
+[ t ] [ error get no-method? ] unit-test
+[ { H{ } "error" } ] [ error get arguments>> ] unit-test
+
+MIXIN: busted
+
+TUPLE: busted-1 ;
+TUPLE: busted-2 ; INSTANCE: busted-2 busted
+TUPLE: busted-3 ;
+
+multi-methods:GENERIC: busted-sort ( obj1 obj2 -- obj1 obj2 )
+
+METHOD: busted-sort { busted-1 busted-2 } ;
+METHOD: busted-sort { busted-2 busted-3 } ;
+METHOD: busted-sort { busted busted } ;
diff --git a/extra/multi-methods/tests/topological-sort.factor b/extra/multi-methods/tests/topological-sort.factor
new file mode 100644 (file)
index 0000000..f161837
--- /dev/null
@@ -0,0 +1,19 @@
+USING: kernel multi-methods tools.test math arrays sequences
+math.order ;
+IN: multi-methods.tests
+
+[ { 1 2 3 4 5 6 } ] [
+    { 6 4 5 1 3 2 } [ <=> ] topological-sort
+] unit-test
+
+[ +lt+ ] [
+    { fixnum array } { number sequence } classes<
+] unit-test
+
+[ +eq+ ] [
+    { number sequence } { number sequence } classes<
+] unit-test
+
+[ +gt+ ] [
+    { object object } { number sequence } classes<
+] unit-test
index e627a745cdc5fa13f5fc4abb1b8f89e9edac5398..2c7258bb68e1b7aca591eae5ba6b259a2a081763 100755 (executable)
@@ -3,7 +3,7 @@ namespaces opengl opengl.gl sequences ui ui.gadgets ui.gestures
 ui.gadgets.worlds ui.render accessors combinators literals ;
 IN: opengl.demo-support
 
-CONSTANT: FOV $[ 2.0 sqrt 1+ ]
+CONSTANT: FOV $[ 2.0 sqrt 1 + ]
 CONSTANT: MOUSE-MOTION-SCALE 0.5
 CONSTANT: KEY-ROTATE-STEP 10.0
 
index 814821fba963888825ea4cf53ed9b1d38539ea4d..7a73561e56fbbdfaf2c1f436ef95ce570d0c2110 100755 (executable)
@@ -339,7 +339,7 @@ LAZY: surrounded-by ( parser start end -- parser' )
         2drop epsilon
     ] [
         2dup exactly-n
-        -rot 1- at-most-n <|>
+        -rot 1 - at-most-n <|>
     ] if ;
 
 : at-least-n ( parser n -- parser' )
index eff0043ac373a9adcffc51ec78dd9aceb21ffc9e..dcde55c91ada82f2a6c696b928ebb2d58549a219 100644 (file)
@@ -11,8 +11,8 @@ CONSULT: assoc-protocol lex-hash hash>> ;
 
 :: prepare-pos ( v i -- c l )
     [let | n [ i v head-slice ] |
-           v CHAR: \n n last-index -1 or 1+ -
-           n [ CHAR: \n = ] count 1+
+           v CHAR: \n n last-index -1 or 1 + -
+           n [ CHAR: \n = ] count 1 +
     ] ;
       
 : store-pos ( v a -- )
@@ -25,12 +25,12 @@ M: lex-hash set-at
         [ swap hash>> set-at ]
     } case ;
 
-:: at-pos ( t l c -- p ) t l head-slice [ length ] map sum l 1- + c + ;
+:: at-pos ( t l c -- p ) t l head-slice [ length ] map sum l 1 - + c + ;
 
 M: lex-hash at*
     swap {
       { input [ drop lexer get text>> "\n" join t ] }
-      { pos [ drop lexer get [ text>> ] [ line>> 1- ] [ column>> 1+ ] tri at-pos t ] }
+      { pos [ drop lexer get [ text>> ] [ line>> 1 - ] [ column>> 1 + ] tri at-pos t ] }
       [ swap hash>> at* ]
     } case ;
 
@@ -61,4 +61,4 @@ space = " " | "\n" | "\t"
 spaces = space* => [[ drop ignore ]]
 chunk = (!(space) .)+ => [[ >string ]]
 expr = spaces chunk
-;EBNF
\ No newline at end of file
+;EBNF
diff --git a/extra/prettyprint/callables/authors.txt b/extra/prettyprint/callables/authors.txt
new file mode 100644 (file)
index 0000000..f13c9c1
--- /dev/null
@@ -0,0 +1 @@
+Joe Groff
diff --git a/extra/prettyprint/callables/callables-docs.factor b/extra/prettyprint/callables/callables-docs.factor
new file mode 100644 (file)
index 0000000..9865f0e
--- /dev/null
@@ -0,0 +1,6 @@
+USING: help help.markup help.syntax kernel quotations ;
+IN: prettyprint.callables
+
+HELP: simplify-callable
+{ $values { "quot" callable } { "quot'" callable } }
+{ $description "Converts " { $snippet "quot" } " into an equivalent quotation by simplifying usages of " { $link dip } ", " { $link call } ", " { $link curry } ", and " { $link compose } " with literal parameters. This word is used when callable objects are prettyprinted." } ;
diff --git a/extra/prettyprint/callables/callables-tests.factor b/extra/prettyprint/callables/callables-tests.factor
new file mode 100644 (file)
index 0000000..9d9abb3
--- /dev/null
@@ -0,0 +1,15 @@
+! (c) 2009 Joe Groff bsd license
+USING: kernel math prettyprint prettyprint.callables
+tools.test ;
+IN: prettyprint.callables.tests
+
+[ [ dip ] ] [ [ dip ] simplify-callable ] unit-test
+[ [ [ + ] dip ] ] [ [ [ + ] dip ] simplify-callable ] unit-test
+[ [ + 5 ] ] [ [ 5 [ + ] dip ] simplify-callable ] unit-test
+[ [ + ] ] [ [ [ + ] call ] simplify-callable ] unit-test
+[ [ call ] ] [ [ call ] simplify-callable ] unit-test
+[ [ 5 + ] ] [ [ 5 [ + ] curry call ] simplify-callable ] unit-test
+[ [ 4 5 + ] ] [ [ 4 5 [ + ] 2curry call ] simplify-callable ] unit-test
+[ [ 4 5 6 + ] ] [ [ 4 5 6 [ + ] 3curry call ] simplify-callable ] unit-test
+[ [ + . ] ] [ [ [ + ] [ . ] compose call ] simplify-callable ] unit-test
+[ [ . + ] ] [ [ [ + ] [ . ] prepose call ] simplify-callable ] unit-test
diff --git a/extra/prettyprint/callables/callables.factor b/extra/prettyprint/callables/callables.factor
new file mode 100644 (file)
index 0000000..195a6ce
--- /dev/null
@@ -0,0 +1,75 @@
+! (c) 2009 Joe Groff bsd license
+USING: combinators combinators.short-circuit generalizations
+kernel macros math math.ranges prettyprint.custom quotations
+sequences words ;
+IN: prettyprint.callables
+
+<PRIVATE
+
+CONSTANT: simple-combinators { dip call curry 2curry 3curry compose prepose }
+
+: literal? ( obj -- ? ) word? not ;
+
+MACRO: slice-match? ( quots -- quot: ( seq end -- ? ) )
+    dup length
+    [ 0 [a,b) [ [ - swap nth ] swap prefix prepend ] 2map ]
+    [ nip \ nip swap \ >= [ ] 3sequence ] 2bi
+    prefix \ 2&& [ ] 2sequence ;
+
+: end-len>from-to ( seq end len -- from to seq )
+    [ - ] [ drop 1 + ] 2bi rot ;
+
+: slice-change ( seq end len quot -- seq' )
+    [ end-len>from-to ] dip
+    [ [ subseq ] dip call ] curry
+    [ replace-slice ] 3bi ; inline
+
+: when-slice-match ( seq i criteria quot -- seq' )
+    [ [ 2dup ] dip slice-match? ] dip [ drop ] if ; inline
+    
+: simplify-dip ( quot i -- quot' )
+    { [ literal? ] [ callable? ] }
+    [ 2 [ first2 swap suffix ] slice-change ] when-slice-match ;
+
+: simplify-call ( quot i -- quot' )
+    { [ callable? ] }
+    [ 1 [ first ] slice-change ] when-slice-match ;
+
+: simplify-curry ( quot i -- quot' )
+    { [ literal? ] [ callable? ] }
+    [ 2 [ first2 swap prefix 1quotation ] slice-change ] when-slice-match ;
+
+: simplify-2curry ( quot i -- quot' )
+    { [ literal? ] [ literal? ] [ callable? ] }
+    [ 3 [ [ 2 head ] [ third ] bi append 1quotation ] slice-change ] when-slice-match ;
+
+: simplify-3curry ( quot i -- quot' )
+    { [ literal? ] [ literal? ] [ literal? ] [ callable? ] }
+    [ 4 [ [ 3 head ] [ fourth ] bi append 1quotation ] slice-change ] when-slice-match ;
+
+: simplify-compose ( quot i -- quot' )
+    { [ callable? ] [ callable? ] }
+    [ 2 [ first2 append 1quotation ] slice-change ] when-slice-match ;
+
+: simplify-prepose ( quot i -- quot' )
+    { [ callable? ] [ callable? ] }
+    [ 2 [ first2 swap append 1quotation ] slice-change ] when-slice-match ;
+
+: (simplify-callable) ( quot -- quot' )
+    dup [ simple-combinators member? ] find {
+        { \ dip     [ simplify-dip     ] }
+        { \ call    [ simplify-call    ] }
+        { \ curry   [ simplify-curry   ] }
+        { \ 2curry  [ simplify-2curry  ] }
+        { \ 3curry  [ simplify-3curry  ] }
+        { \ compose [ simplify-compose ] }
+        { \ prepose [ simplify-prepose ] }
+        [ 2drop ]
+    } case ;
+
+PRIVATE>
+
+: simplify-callable ( quot -- quot' )
+    [ (simplify-callable) ] to-fixed-point ;
+
+M: callable >pprint-sequence simplify-callable ;
diff --git a/extra/prettyprint/callables/summary.txt b/extra/prettyprint/callables/summary.txt
new file mode 100644 (file)
index 0000000..870a5fa
--- /dev/null
@@ -0,0 +1 @@
+Quotation simplification for prettyprinting automatically-constructed callable objects
index 204527418b2828de68ede1571adb1a49cdaf6111..d59b9103449c5832c57fc9770bc35693764afa3e 100644 (file)
@@ -23,7 +23,7 @@ IN: project-euler.001
 <PRIVATE
 
 : sum-divisible-by ( target n -- m )
-    [ /i dup 1+ * ] keep * 2 /i ;
+    [ /i dup 1 + * ] keep * 2 /i ;
 
 PRIVATE>
 
index d2679f6309eade32c9880dc7bbb410cf5f388a07..223404b9d6888579994421db040eb36aa40aba1c 100644 (file)
@@ -34,7 +34,7 @@ IN: project-euler.012
 ! --------
 
 : euler012 ( -- answer )
-    8 [ dup nth-triangle tau* 500 < ] [ 1+ ] while nth-triangle ;
+    8 [ dup nth-triangle tau* 500 < ] [ 1 + ] while nth-triangle ;
 
 ! [ euler012 ] 10 ave-time
 ! 6573 ms ave run time - 346.27 SD (10 trials)
index b0305d5c3941daeb3154244dc6677e7e34068e90..49680177d525fb57bb69218141e32e270b1ab91c 100644 (file)
@@ -36,7 +36,7 @@ IN: project-euler.014
 <PRIVATE
 
 : next-collatz ( n -- n )
-    dup even? [ 2 / ] [ 3 * 1+ ] if ;
+    dup even? [ 2 / ] [ 3 * 1 + ] if ;
 
 : longest ( seq seq -- seq )
     2dup [ length ] bi@ > [ drop ] [ nip ] if ;
@@ -59,7 +59,7 @@ PRIVATE>
 <PRIVATE
 
 : worth-calculating? ( n -- ? )
-    1- 3 { [ divisor? ] [ / even? ] } 2&& ;
+    1 - 3 { [ divisor? ] [ / even? ] } 2&& ;
 
 PRIVATE>
 
index 1b675d41c47333ff9171c85a652ae12ca873b70a..b548591b5e3ba6eff89a05315a6afd883169bfc0 100644 (file)
@@ -32,7 +32,7 @@ IN: project-euler.022
     ascii file-contents [ quotable? ] filter "," split ;
 
 : name-scores ( seq -- seq )
-    [ 1+ swap alpha-value * ] map-index ;
+    [ 1 + swap alpha-value * ] map-index ;
 
 PRIVATE>
 
index 5dfe7b9f56343ea334886858a2fe2a6d42f1d826..e381e323d15f3fa61b586d675d2c06585a585f98 100644 (file)
@@ -44,7 +44,7 @@ MEMO: fib ( m -- n )
 <PRIVATE
 
 : (digit-fib) ( n term -- term )
-    2dup fib number>string length > [ 1+ (digit-fib) ] [ nip ] if ;
+    2dup fib number>string length > [ 1 + (digit-fib) ] [ nip ] if ;
 
 : digit-fib ( n -- term )
     1 (digit-fib) ;
@@ -68,7 +68,7 @@ PRIVATE>
 <PRIVATE
 
 : digit-fib* ( n -- term )
-    1- 5 log10 2 / + phi log10 / ceiling >integer ;
+    1 - 5 log10 2 / + phi log10 / ceiling >integer ;
 
 PRIVATE>
 
index 8e0cf37fa2724b6ad466989052747d93c0d6812e..4f4466c3952a73523430f43b12542f05898f5736 100644 (file)
@@ -37,7 +37,7 @@ IN: project-euler.026
     1 1000 (a,b) [ prime? ] filter [ 1 swap / ] map ;
 
 : (mult-order) ( n a m -- k )
-    3dup ^ swap mod 1 = [ 2nip ] [ 1+ (mult-order) ] if ;
+    3dup ^ swap mod 1 = [ 2nip ] [ 1 + (mult-order) ] if ;
 
 PRIVATE>
 
index f7bffbf66587d55452c1015796e34c44d7953c46..f97d8e9e0ddd700dc6b2b339a817d980c0d36908 100644 (file)
@@ -53,7 +53,7 @@ IN: project-euler.027
     dup sq -rot * + + ;
 
 : (consecutive-primes) ( b a n -- m )
-    3dup quadratic prime? [ 1+ (consecutive-primes) ] [ 2nip ] if ;
+    3dup quadratic prime? [ 1 + (consecutive-primes) ] [ 2nip ] if ;
 
 : consecutive-primes ( a b -- m )
     swap 0 (consecutive-primes) ;
index 2a75336a0d4c3c9e9ac8b45cea2d2f53a9217648..b689df50bbd9e2d1c2979c3bd534885fcb9e867f 100644 (file)
@@ -38,7 +38,7 @@ IN: project-euler.030
 PRIVATE>
 
 : euler030 ( -- answer )
-    325537 [0,b) [ dup sum-fifth-powers = ] filter sum 1- ;
+    325537 [0,b) [ dup sum-fifth-powers = ] filter sum 1 - ;
 
 ! [ euler030 ] 100 ave-time
 ! 1700 ms ave run time - 64.84 SD (100 trials)
index 378461842312e15d9f4815690281e5abc03e6c8a..7d98de62b1bb26a7825e75ff71a91d79cae19f29 100755 (executable)
@@ -39,13 +39,13 @@ IN: project-euler.035
 : (circular?) ( seq n -- ? )
     dup 0 > [
         2dup rotate 10 digits>integer
-        prime? [ 1- (circular?) ] [ 2drop f ] if
+        prime? [ 1 - (circular?) ] [ 2drop f ] if
     ] [
         2drop t
     ] if ;
 
 : circular? ( seq -- ? )
-    dup length 1- (circular?) ;
+    dup length 1 - (circular?) ;
 
 PRIVATE>
 
index 3c6e2eac0275d365a452b4b816344c4f2b841984..dd700510824ab3afd782d663a73accaf6e116a10 100755 (executable)
@@ -39,7 +39,7 @@ IN: project-euler.038
     pick length 8 > [
         2drop 10 digits>integer
     ] [
-        [ * number>digits over push-all ] 2keep 1+ (concat-product)
+        [ * number>digits over push-all ] 2keep 1 + (concat-product)
     ] if ;
 
 : concat-product ( n -- m )
index dee3f9804c15dde9c4ebd4d579c82e513297b71d..1ad163d5070293ac853692077250587c14eac831 100755 (executable)
@@ -37,8 +37,8 @@ SYMBOL: p-count
     p-count get length ;
 
 : adjust-p-count ( n -- )
-    max-p 1- over <range> p-count get
-    [ [ 1+ ] change-nth ] curry each ;
+    max-p 1 - over <range> p-count get
+    [ [ 1 + ] change-nth ] curry each ;
 
 : (count-perimeters) ( seq -- )
     dup sum max-p < [
index 86fb34629e03ba974b1ff85eb7eb975638d86306..a60714357ea2578dc36f4b460ebfda2cfcfb9b3a 100755 (executable)
@@ -28,7 +28,7 @@ IN: project-euler.040
 
 : (concat-upto) ( n limit str -- str )
     2dup length > [
-        pick number>string over push-all rot 1+ -rot (concat-upto)
+        pick number>string over push-all rot 1 + -rot (concat-upto)
     ] [
         2nip
     ] if ;
@@ -37,7 +37,7 @@ IN: project-euler.040
     SBUF" " clone 1 -rot (concat-upto) ;
 
 : nth-integer ( n str -- m )
-    [ 1- ] dip nth 1string string>number ;
+    [ 1 - ] dip nth 1string string>number ;
 
 PRIVATE>
 
index 8c74cc9b312a0ee67e23d2714f0e59b7cb850a34..e531ba848f303b5b66cfbea2ed09f7e549d380c6 100644 (file)
@@ -35,7 +35,7 @@ IN: project-euler.042
 
 : (triangle-upto) ( limit n -- )
     2dup nth-triangle > [
-        dup nth-triangle , 1+ (triangle-upto)
+        dup nth-triangle , 1 + (triangle-upto)
     ] [
         2drop
     ] if ;
@@ -61,7 +61,7 @@ PRIVATE>
 <PRIVATE
 
 : triangle? ( n -- ? )
-    8 * 1+ sqrt 1- 2 / 1 mod zero? ;
+    8 * 1 + sqrt 1 - 2 / 1 mod zero? ;
 
 PRIVATE>
 
index 75241499e11fc90387fd3944d4ec2c3b68f33fd4..bea7313abd214ede4d5c55c6761f8d97464620f6 100644 (file)
@@ -36,7 +36,7 @@ IN: project-euler.043
 <PRIVATE
 
 : subseq-divisible? ( n index seq -- ? )
-    [ 1- dup 3 + ] dip subseq 10 digits>integer swap divisor? ;
+    [ 1 - dup 3 + ] dip subseq 10 digits>integer swap divisor? ;
 
 : interesting? ( seq -- ? )
     {
index 8fc979e8bcf3257627b4d07723c69be91aa24afd..4c2306c480cf1e59958d26aaf03818d8af077103 100644 (file)
@@ -29,7 +29,7 @@ IN: project-euler.044
 <PRIVATE
 
 : nth-pentagonal ( n -- seq )
-    dup 3 * 1- * 2 / ;
+    dup 3 * 1 - * 2 / ;
 
 : sum-and-diff? ( m n -- ? )
     [ + ] [ - ] 2bi [ pentagonal? ] bi@ and ;
index 939b8416bb3b9083f0c7e5509d82aba37c02fb0e..8b0db1a32e4584c2b045ddc2505a0622e79a85fa 100644 (file)
@@ -28,7 +28,7 @@ IN: project-euler.045
 <PRIVATE
 
 : nth-hexagonal ( n -- m )
-    dup 2 * 1- * ;
+    dup 2 * 1 - * ;
 
 DEFER: next-solution
 
@@ -36,7 +36,7 @@ DEFER: next-solution
     dup pentagonal? [ nip ] [ drop next-solution ] if ;
 
 : next-solution ( n -- m )
-    1+ dup nth-hexagonal (next-solution) ;
+    1 + dup nth-hexagonal (next-solution) ;
 
 PRIVATE>
 
index 0aa9eafe58017297ca159ffff4a694490c7ec8db..13e39c815cecce611d3583f73864d79a65ee1d2f 100755 (executable)
@@ -37,7 +37,7 @@ IN: project-euler.046
     dup perfect-squares [ 2 * - ] with map [ prime? ] any? ;
 
 : next-odd-composite ( n -- m )
-    dup odd? [ 2 + ] [ 1+ ] if dup prime? [ next-odd-composite ] when ;
+    dup odd? [ 2 + ] [ 1 + ] if dup prime? [ next-odd-composite ] when ;
 
 : disprove-conjecture ( n -- m )
     dup fits-conjecture? [ next-odd-composite disprove-conjecture ] when ;
index e251045cd4d324970f692564e36237ba4cd031e4..e7b585bf0d5b030edf1216c6c9fd49fc66178e5c 100644 (file)
@@ -36,8 +36,8 @@ IN: project-euler.047
         swap - nip
     ] [
         dup prime? [ [ drop 0 ] 2dip ] [
-            2dup unique-factors length = [ [ 1+ ] 2dip ] [ [ drop 0 ] 2dip ] if
-        ] if 1+ (consecutive)
+            2dup unique-factors length = [ [ 1 + ] 2dip ] [ [ drop 0 ] 2dip ] if
+        ] if 1 + (consecutive)
     ] if ;
 
 : consecutive ( goal test -- n )
@@ -69,10 +69,10 @@ SYMBOL: sieve
     sieve get nth 0 = ;
 
 : multiples ( n -- seq )
-    sieve get length 1- over <range> ;
+    sieve get length 1 - over <range> ;
 
 : increment-counts ( n -- )
-     multiples [ sieve get [ 1+ ] change-nth ] each ;
+     multiples [ sieve get [ 1 + ] change-nth ] each ;
 
 : prime-tau-upto ( limit -- seq )
     dup initialize-sieve 2 swap [a,b) [
index 640a3a68f69efe0549e752388b9dc10bf259e493..fde3fa6026af4a0adbfad6d9e50c53025d9b69e0 100644 (file)
@@ -1,6 +1,7 @@
 ! Copyright (c) 2008 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel math math.functions math.ranges project-euler.common sequences ;
+USING: kernel math math.functions math.ranges
+project-euler.common sequences ;
 IN: project-euler.048
 
 ! http://projecteuler.net/index.php?section=problems&id=48
@@ -17,7 +18,7 @@ IN: project-euler.048
 ! --------
 
 : euler048 ( -- answer )
-    1000 [1,b] [ dup ^ ] sigma 10 10 ^ mod ;
+    1000 [1,b] [ dup ^ ] sigma 10 10^ mod ;
 
 ! [ euler048 ] 100 ave-time
 ! 276 ms run / 1 ms GC ave time - 100 trials
index 9ecf942ef669a88ee1a0b073cbf0f24e121edd85..8b6f635ee4bb5c932c65ae2a4fde0b7a70b47390 100644 (file)
@@ -27,7 +27,7 @@ IN: project-euler.049
 
 : count-digits ( n -- byte-array )
     10 <byte-array> [
-        '[ 10 /mod _ [ 1+ ] change-nth dup 0 > ] loop drop
+        '[ 10 /mod _ [ 1 + ] change-nth dup 0 > ] loop drop
     ] keep ;
 
 HINTS: count-digits fixnum ;
index 0c5b288b658c0424304553755b1d68b9a5b2fce1..6176ac81d2f3765db1376916b1eb5478e8324737 100644 (file)
@@ -66,7 +66,7 @@ IN: project-euler.050
     2dup [ first ] bi@ > [ drop ] [ nip ] if ;
 
 : continue? ( pair seq -- ? )
-    [ first ] [ length 1- ] bi* < ;
+    [ first ] [ length 1 - ] bi* < ;
 
 : (find-longest) ( best seq limit -- best )
     [ longest-prime longest ] 2keep 2over continue? [
index c25b1adcc073c3c7e2cdbd100af456307bc58bc9..037cc87288420e13ab0823aaaef63ba22287663d 100644 (file)
@@ -24,7 +24,7 @@ IN: project-euler.052
 <PRIVATE
 
 : map-nx ( n x -- seq )
-    [ 1+ * ] with map ; inline
+    [ 1 + * ] with map ; inline
 
 : all-same-digits? ( seq -- ? )
     [ number>digits natural-sort ] map all-equal? ;
@@ -35,9 +35,9 @@ IN: project-euler.052
 : next-all-same ( x n -- n )
     dup candidate? [
         2dup swap map-nx all-same-digits?
-        [ nip ] [ 1+ next-all-same ] if
+        [ nip ] [ 1 + next-all-same ] if
     ] [
-        1+ next-all-same
+        1 + next-all-same
     ] if ;
 
 PRIVATE>
index 07525fe6a49fdfaee5940b219b2ecbc060af2907..09663d241fea5b13a467e0f72fd304faa96d9e7f 100644 (file)
@@ -50,7 +50,7 @@ IN: project-euler.055
 : (lychrel?) ( n iteration -- ? )
     dup 50 < [
         [ add-reverse ] dip over palindrome?
-        [ 2drop f ] [ 1+ (lychrel?) ] if
+        [ 2drop f ] [ 1 + (lychrel?) ] if
     ] [
         2drop t
     ] if ;
index 133175f2a87d9328891787e2c3509d901c848f15..6edf2ad22a47ea80169fa4ca7108acd430247b2c 100644 (file)
@@ -43,13 +43,13 @@ CONSTANT: PERCENT_PRIME 0.1
 !    (n-2)² + 4(n-1) = odd squares, no need to calculate
 
 : prime-corners ( n -- m )
-    3 [1,b] swap '[ _ [ 1- * ] keep 2 - sq + prime? ] count ;
+    3 [1,b] swap '[ _ [ 1 - * ] keep 2 - sq + prime? ] count ;
 
 : total-corners ( n -- m )
-    1- 2 * ; foldable
+    1 - 2 * ; foldable
 
 : ratio-below? ( count length -- ? )
-    total-corners 1+ / PERCENT_PRIME < ;
+    total-corners 1 + / PERCENT_PRIME < ;
 
 : next-layer ( count length -- count' length' )
     2 + [ prime-corners + ] keep ;
index 3a59d665224ba24c13d67a1a6f9169bd6f01b68c..5094dcd674df0fd1f2544c6a59f95a38b9f508be 100644 (file)
@@ -70,7 +70,7 @@ PRIVATE>
     } cond product ;
 
 : primorial-upto ( limit -- m )
-    1 swap '[ dup primorial _ <= ] [ 1+ dup primorial ] produce
+    1 swap '[ dup primorial _ <= ] [ 1 + dup primorial ] produce
     nip penultimate ;
 
 PRIVATE>
index 5f54d8508e89683d64e352b1fdab0b8034877c8f..7285078bcf0cb19c481e1f92eeeaca978479526e 100755 (executable)
@@ -50,8 +50,8 @@ SYMBOL: p-count
     p-count get length ;
 
 : adjust-p-count ( n -- )
-    max-p 1- over <range> p-count get
-    [ [ 1+ ] change-nth ] curry each ;
+    max-p 1 - over <range> p-count get
+    [ [ 1 + ] change-nth ] curry each ;
 
 : (count-perimeters) ( seq -- )
     dup sum max-p < [
index e6ed9035d2b72e1fd702003551d77b247ff7718d..8615a272ae1cfd7e3bd042d8ea95aeb15a711675 100644 (file)
@@ -35,7 +35,7 @@ IN: project-euler.076
     over zero? [
         3drop
     ] [
-        [ [ 1-  2array ] dip at     ]
+        [ [ 1 -  2array ] dip at     ]
         [ [ use 2array ] dip at +   ]
         [ [     2array ] dip set-at ] 3tri
     ] if ;
@@ -46,7 +46,7 @@ IN: project-euler.076
 : (euler076) ( n -- m )
     dup init
     [ [ ways ] curry each-subproblem ]
-    [ [ dup 2array ] dip at 1- ] 2bi ;
+    [ [ dup 2array ] dip at 1 - ] 2bi ;
 
 PRIVATE>
 
index 4901eae3428af4eb4f058a563b862d90a2d4a1b5..9f22460b3cb69cf34eb392e53490f9e2a033ece9 100644 (file)
@@ -38,7 +38,7 @@ IN: project-euler.092
     567 [1,b] [ chain-ending ] map ;
 
 : fast-chain-ending ( seq n -- m )
-    dup 567 > [ next-link ] when 1- swap nth ;
+    dup 567 > [ next-link ] when 1 - swap nth ;
 
 PRIVATE>
 
index a8895c215a0113e8c700825ba0ca7363fc6e5fcb..35c3629035d1593753f6edf349d63f9bf284d733 100644 (file)
@@ -23,7 +23,7 @@ IN: project-euler.097
 ! --------
 
 : euler097 ( -- answer )
-     2 7830457 10 10 ^ ^mod 28433 * 10 10 ^ mod 1+ ;
+     2 7830457 10 10 ^ ^mod 28433 * 10 10 ^ mod 1 + ;
 
 ! [ euler097 ] 100 ave-time
 ! 0 ms ave run timen - 0.22 SD (100 trials)
index 30bf52bebbf56867f719417d4965e4bdbbc99baf..36fe7783fe398384853c4c7d5183929eb89c3484 100644 (file)
@@ -39,7 +39,7 @@ IN: project-euler.099
     flip first2 swap [ log ] map v* ;
 
 : solve ( seq -- index )
-    simplify [ supremum ] keep index 1+ ;
+    simplify [ supremum ] keep index 1 + ;
 
 PRIVATE>
 
index 6f05eb7120846adb2a05fdcb1ad2ab95aa018bf5..72584d833ec842bc4eca1d5e7ea344ba224e2981 100644 (file)
@@ -25,7 +25,7 @@ IN: project-euler.100
 
 : euler100 ( -- answer )
     1 1
-    [ dup dup 1- * 2 * 10 24 ^ <= ]
+    [ dup dup 1 - * 2 * 10 24 ^ <= ]
     [ tuck 6 * swap - 2 - ] while nip ;
 
 ! TODO: solution needs generalization
index 2766322323c6e8573f9698436371515a3baf9675..43eb30c9f691490721c17c3bf37004d4c69b1c29 100644 (file)
@@ -38,13 +38,13 @@ IN: project-euler.116
 <PRIVATE
 
 : nth* ( n seq -- elt/0 )
-    [ length swap - 1- ] keep ?nth 0 or ;
+    [ length swap - 1 - ] keep ?nth 0 or ;
 
 : next ( colortile seq -- )
      [ nth* ] [ last + ] [ push ] tri ;
 
 : ways ( length colortile -- permutations )
-    V{ 1 } clone [ [ next ] 2curry times ] keep last 1- ;
+    V{ 1 } clone [ [ next ] 2curry times ] keep last 1 - ;
 
 : (euler116) ( length -- permutations )
     3 [1,b] [ ways ] with sigma ;
index 582e103e56538a67579b1e680b6cef9ea2b0ec28..a75e65218350af7a051c881d383ea9bbfbb66dc7 100644 (file)
@@ -32,13 +32,13 @@ IN: project-euler.148
 <PRIVATE
 
 : sum-1toN ( n -- sum )
-    dup 1+ * 2/ ; inline
+    dup 1 + * 2/ ; inline
 
 : >base7 ( x -- y )
     [ dup 0 > ] [ 7 /mod ] produce nip ;
 
 : (use-digit) ( prev x index -- next )
-    [ [ 1+ * ] [ sum-1toN 7 sum-1toN ] bi ] dip ^ * + ;
+    [ [ 1 + * ] [ sum-1toN 7 sum-1toN ] bi ] dip ^ * + ;
 
 : (euler148) ( x -- y )
     >base7 0 [ (use-digit) ] reduce-index ;
index eeb4b0c315eb82420b8db813dd3c1d1ddacf650b..a54b7d1db0faa147fd98c6b2a82ba21efaa163b8 100644 (file)
@@ -56,10 +56,10 @@ IN: project-euler.150
 :: (euler150) ( m -- n )
     [let | table [ sums-triangle ] |
         m [| x |
-            x 1+ [| y |
+            x 1 + [| y |
                 m x - [0,b) [| z |
                     x z + table nth-unsafe
-                    [ y z + 1+ swap nth-unsafe ]
+                    [ y z + 1 + swap nth-unsafe ]
                     [ y        swap nth-unsafe ] bi -
                 ] map partial-sum-infimum
             ] map-infimum
diff --git a/extra/project-euler/151/151-tests.factor b/extra/project-euler/151/151-tests.factor
new file mode 100644 (file)
index 0000000..beea8e3
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.151 tools.test ;
+IN: project-euler.151.tests
+
+[ 12138569781349/26138246400000 ] [ euler151 ] unit-test
index 66c5a6301edad0832b9f3e56a77db20bbc73d1e1..ccdb76d80e05ca679f5b464c27b6adf5bb9fd396 100644 (file)
@@ -39,11 +39,11 @@ SYMBOL: table
 
 : (pick-sheet) ( seq i -- newseq )
     [
-        <=> sgn
+        <=>
         {
-            { -1 [ ] }
-            {  0 [ 1- ] }
-            {  1 [ 1+ ] }
+            { +lt+ [ ] }
+            { +eq+ [ 1 - ] }
+            { +gt+ [ 1 + ] }
         } case
     ] curry map-index ;
 
@@ -59,9 +59,9 @@ DEFER: (euler151)
 : (euler151) ( x -- y )
     table get [ {
         { { 0 0 0 1 } [ 0 ] }
-        { { 0 0 1 0 } [ { 0 0 0 1 } (euler151) 1+ ] }
-        { { 0 1 0 0 } [ { 0 0 1 1 } (euler151) 1+ ] }
-        { { 1 0 0 0 } [ { 0 1 1 1 } (euler151) 1+ ] }
+        { { 0 0 1 0 } [ { 0 0 0 1 } (euler151) 1 + ] }
+        { { 0 1 0 0 } [ { 0 0 1 1 } (euler151) 1 + ] }
+        { { 1 0 0 0 } [ { 0 1 1 1 } (euler151) 1 + ] }
         [ [ dup length [ pick-sheet ] with map sum ] [ sum ] bi / ]
      } case ] cache ;
 
@@ -71,8 +71,6 @@ DEFER: (euler151)
         { 1 1 1 1 } (euler151)
     ] with-scope ;
 
-! TODO: doesn't work currently, problem in area of 'with map' in (euler151)
-
 ! [ euler151 ] 100 ave-time
 ! ? ms run time - 100 trials
 
index 5f0b853f0db998207cbe1d9787bdd85fc4cc7bef..efd1c8ee60494ccb678dd5e03ddbc2b82853d38a 100644 (file)
@@ -30,7 +30,7 @@ MEMO: fn ( n -- x )
     {
         { [ dup 2 < ]  [ drop 1 ] }
         { [ dup odd? ] [ 2/ fn ] }
-        [ 2/ [ fn ] [ 1- fn ] bi + ]
+        [ 2/ [ fn ] [ 1 - fn ] bi + ]
     } cond ;
 
 : euler169 ( -- result )
index c99d670808a905f51d6b908a755dd440859b85fd..3473d9327c8dfd4180506326f72ced70ad69f2de 100644 (file)
@@ -42,7 +42,7 @@ IN: project-euler.175
 
 : compute ( vec ratio -- )
     {
-        { [ dup integer? ] [ 1- 0 add-bits ] }
+        { [ dup integer? ] [ 1 - 0 add-bits ] }
         { [ dup 1 < ] [ 1 over - / dupd compute 1 1 add-bits ] }
         [ [ 1 mod compute ] 2keep >integer 0 add-bits ]
     } cond ;
index a9e62ec3a90033659b83aff90487b0b1afc466a0..ed4f03dda1aabc8a3a13e5004234bc20260b1b77 100644 (file)
@@ -58,7 +58,7 @@ IN: project-euler.186
         pick [ next ] [ next ] bi
         [ = ] [
             pick equate
-            [ 1+ ] dip
+            [ 1 + ] dip
         ] 2unless? (p186)
     ] [
         drop nip
index ec52af041524405c6a4c95eaff8b9a1b021d9185..19ff2c253ca6f5520454d3c523507d116a981950 100644 (file)
@@ -43,7 +43,7 @@ IN: project-euler.190
 PRIVATE>
 
 :: P_m ( m -- P_m )
-    m [1,b] [| i | 2 i * m 1+ / i ^ ] PI ;
+    m [1,b] [| i | 2 i * m 1 + / i ^ ] PI ;
 
 : euler190 ( -- answer )
     2 15 [a,b] [ P_m truncate ] sigma ;
index 2f165f654889b1106d473334feddb20098738a75..806098b865ebea4754e88b3c9be2226377870306 100644 (file)
@@ -45,7 +45,7 @@ IN: project-euler.203
     [ 0 prefix ] [ 0 suffix ] bi [ + ] 2map ;
 
 : generate ( n -- seq )
-    1- { 1 } [ (generate) ] iterate concat prune ;
+    1 - { 1 } [ (generate) ] iterate concat prune ;
 
 : squarefree ( n -- ? )
     factors all-unique? ;
index 30c42cc4be2b5855a56d90556b903f1497db8d58..1006b7a4cf25de71ce0ca2d96a8af19b4fbd32e1 100644 (file)
@@ -72,14 +72,14 @@ M: end h2 dup failure? [ <failure> <block> ] unless ;
 
 : first-row ( n -- t )
     [ <failure> <success> <failure> ] dip
-    1- [| a b c | b c <block> a b ] times 2drop ;
+    1 - [| a b c | b c <block> a b ] times 2drop ;
 
 GENERIC: total ( t -- n )
 M: block total [ total ] dup choice + ;
 M: end   total ways>> ;
 
 : solve ( width height -- ways )
-    [ first-row ] dip 1- [ next-row ] times total ;
+    [ first-row ] dip 1 - [ next-row ] times total ;
 
 PRIVATE>
 
index a7762836f19bbe23b00d1e53607d70d2bac89b44..dc521d4d70f0bd2520877b2f3c684439ace125f0 100644 (file)
@@ -1,11 +1,11 @@
 ! 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 ;
+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 ;
+    10^ [ * round >integer ] keep /f ;
 
 : collect-benchmarks ( quot n -- seq )
     [
@@ -14,7 +14,7 @@ IN: project-euler.ave-time
             '[ _ gc benchmark 1000 / , ] tuck
             '[ _ _ with-datastack drop ]
         ]
-        [ 1- ] tri* swap times call
+        [ 1 - ] tri* swap times call
     ] { } make ; inline
 
 : ave-time ( quot n -- )
index 497fc31de7fc41cd89725daee7ff720c28147f6c..4119f8205cc2adf4e736abdd7dd4d7ab42be6615 100644 (file)
@@ -39,7 +39,7 @@ IN: project-euler.common
 <PRIVATE
 
 : max-children ( seq -- seq )
-    [ dup length 1- [ nth-pair max , ] with each ] { } make ;
+    [ dup length 1 - [ nth-pair max , ] with each ] { } make ;
 
 ! Propagate one row into the upper one
 : propagate ( bottom top -- newtop )
@@ -57,14 +57,11 @@ IN: project-euler.common
 PRIVATE>
 
 : alpha-value ( str -- n )
-    >lower [ CHAR: a - 1+ ] sigma ;
+    >lower [ CHAR: a - 1 + ] sigma ;
 
 : cartesian-product ( seq1 seq2 -- seq1xseq2 )
     [ [ 2array ] with map ] curry map concat ;
 
-: log10 ( m -- n )
-    log 10 log / ;
-
 : mediant ( a/c b/d -- (a+b)/(c+d) )
     2>fraction [ + ] 2bi@ / ;
 
@@ -79,13 +76,13 @@ PRIVATE>
     [ dup 0 = not ] [ 10 /mod ] produce reverse nip ;
 
 : number-length ( n -- m )
-    log10 floor 1+ >integer ;
+    log10 floor 1 + >integer ;
 
 : nth-prime ( n -- n )
-    1- lprimes lnth ;
+    1 - lprimes lnth ;
 
 : nth-triangle ( n -- n )
-    dup 1+ * 2 / ;
+    dup 1 + * 2 / ;
 
 : palindrome? ( n -- ? )
     number>string dup reverse = ;
@@ -94,7 +91,7 @@ PRIVATE>
     number>string natural-sort >string "123456789" = ;
 
 : pentagonal? ( n -- ? )
-    dup 0 > [ 24 * 1+ sqrt 1+ 6 / 1 mod zero? ] [ drop f ] if ;
+    dup 0 > [ 24 * 1 + sqrt 1 + 6 / 1 mod zero? ] [ drop f ] if ;
 
 : penultimate ( seq -- elt )
     dup length 2 - swap nth ;
@@ -122,11 +119,11 @@ PRIVATE>
 
 ! The divisor function, counts the number of divisors
 : tau ( m -- n )
-    group-factors flip second 1 [ 1+ * ] reduce ;
+    group-factors flip second 1 [ 1 + * ] reduce ;
 
 ! Optimized brute-force, is often faster than prime factorization
 : tau* ( m -- n )
-    factor-2s dup [ 1+ ]
+    factor-2s dup [ 1 + ]
     [ perfect-square? -1 0 ? ]
     [ dup sqrt >fixnum [1,b] ] tri* [
         dupd divisor? [ [ 2 + ] dip ] when
diff --git a/extra/rpn/authors.txt b/extra/rpn/authors.txt
new file mode 100644 (file)
index 0000000..1901f27
--- /dev/null
@@ -0,0 +1 @@
+Slava Pestov
diff --git a/extra/rpn/rpn.factor b/extra/rpn/rpn.factor
new file mode 100644 (file)
index 0000000..7175746
--- /dev/null
@@ -0,0 +1,45 @@
+! Copyright (C) 2009 Slava Pestov
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors combinators io kernel lists math math.parser
+sequences splitting ;
+IN: rpn
+
+SINGLETONS: add-insn sub-insn mul-insn div-insn ;
+TUPLE: push-insn value ;
+
+GENERIC: eval-insn ( stack insn -- stack )
+
+: binary-op ( stack quot: ( x y -- z ) -- stack )
+    [ uncons uncons ] dip dip cons ; inline
+
+M: add-insn eval-insn drop [ + ] binary-op ;
+M: sub-insn eval-insn drop [ - ] binary-op ;
+M: mul-insn eval-insn drop [ * ] binary-op ;
+M: div-insn eval-insn drop [ / ] binary-op ;
+M: push-insn eval-insn value>> swons ;
+
+: rpn-tokenize ( string -- string' )
+    " " split harvest sequence>list ;
+
+: rpn-parse ( string -- tokens )
+    rpn-tokenize [
+        {
+            { "+" [ add-insn ] }
+            { "-" [ sub-insn ] }
+            { "*" [ mul-insn ] }
+            { "/" [ div-insn ] }
+            [ string>number push-insn boa ]
+        } case
+    ] lmap ;
+
+: print-stack ( list -- )
+    [ number>string print ] leach ;
+
+: rpn-eval ( tokens -- )
+    nil [ eval-insn ] foldl print-stack ;
+
+: rpn ( -- )
+    "RPN> " write flush
+    readln [ rpn-parse rpn-eval rpn ] when* ;
+
+MAIN: rpn
diff --git a/extra/rpn/summary.txt b/extra/rpn/summary.txt
new file mode 100644 (file)
index 0000000..e6b4fe2
--- /dev/null
@@ -0,0 +1 @@
+Simple RPN calculator
diff --git a/extra/rpn/tags.txt b/extra/rpn/tags.txt
new file mode 100644 (file)
index 0000000..cb5fc20
--- /dev/null
@@ -0,0 +1 @@
+demos
index 0a6f3ef0db493b12fa646d01f4e58ca6a30c3e5e..d14a77057f9bdb75988168b98aff8906da5b6314 100644 (file)
@@ -88,7 +88,7 @@ TUPLE: sequence-parser sequence n ;
     ] take-until :> found
     growing sequence sequence= [
         found dup length
-        growing length 1- - head
+        growing length 1 - - head
         sequence-parser [ growing length - 1 + ] change-n drop
         ! sequence-parser advance drop
     ] [
index 665d43f0cd00ed646f236778158ec6bf41dbfbcd..9291fad3c080d3cfea1d41dda1273503d3729ecb 100644 (file)
@@ -23,11 +23,11 @@ M: product-sequence length lengths>> product ;
     [ lengths>> ns ] [ nip sequences>> ] 2bi ;
 
 :: (carry-n) ( ns lengths i -- )
-    ns length i 1+ = [
+    ns length i 1 + = [
         i ns nth i lengths nth = [
             0 i ns set-nth
-            i 1+ ns [ 1+ ] change-nth
-            ns lengths i 1+ (carry-n)
+            i 1 + ns [ 1 + ] change-nth
+            ns lengths i 1 + (carry-n)
         ] when
     ] unless ;
 
@@ -35,7 +35,7 @@ M: product-sequence length lengths>> product ;
     0 (carry-n) ;
     
 : product-iter ( ns lengths -- )
-    [ 0 over [ 1+ ] change-nth ] dip carry-ns ;
+    [ 0 over [ 1 + ] change-nth ] dip carry-ns ;
 
 : start-product-iter ( sequence-product -- ns lengths )
     [ [ drop 0 ] map ] [ [ length ] map ] bi ;
@@ -57,7 +57,7 @@ M: product-sequence nth
     0 :> i!
     sequences [ length ] [ * ] map-reduce sequences
     [| result |
-        sequences [ quot call i result set-nth i 1+ i! ] product-each
+        sequences [ quot call i result set-nth i 1 + i! ] product-each
         result
     ] new-like ; inline
 
index 29367a2b2bfd8a9382196da075073c38a8fcb571..32ceb3b677cce28f676438adbd24756bc00630c3 100755 (executable)
@@ -90,7 +90,7 @@ TUPLE: slides < book ;
     [ first3 ] dip head 3array ;
 
 : strip-tease ( data -- seq )
-    dup third length 1- [
+    dup third length 1 - [
         2 + (strip-tease)
     ] with map ;
 
index 2eeee306925bb4db811a6466b71ea0b07a9f735a..0c1a5c07d17d21e0073ddfb824ea2a84b309966b 100644 (file)
@@ -123,7 +123,7 @@ M: ast-block compile-ast
     [ lexenv self>> suffix ] dip <lambda> ;
 
 : compile-method-body ( lexenv block -- quot )
-    [ [ (compile-method-body) ] [ arguments>> length 1+ ] bi ] 2keep
+    [ [ (compile-method-body) ] [ arguments>> length 1 + ] bi ] 2keep
     make-return ;
 
 : compile-method ( lexenv ast-method -- )
@@ -154,4 +154,4 @@ M: ast-foreign compile-ast
 
 : compile-smalltalk ( statement -- quot )
     [ empty-lexenv ] dip [ compile-sequence nip 0 ]
-    2keep make-return ;
\ No newline at end of file
+    2keep make-return ;
index 17e91473c3795df9be7dfd2f75f0705b1a1873b4..9d3aa6c65127d81da8138263dfac7d04770777b4 100644 (file)
@@ -52,10 +52,10 @@ fetched-in parsed-html links processed-in fetched-at ;
     [ host>> = ] with partition ;
 
 : add-spidered ( spider spider-result -- )
-    [ [ 1+ ] change-count ] dip
+    [ [ 1 + ] change-count ] dip
     2dup [ spidered>> ] [ dup url>> ] bi* rot set-at
     [ filter-base-links ] 2keep
-    depth>> 1+ swap
+    depth>> 1 + swap
     [ add-nonmatching ]
     [ tuck [ apply-filters ] 2dip add-todo ] 2bi ;
 
index 1554d3df209431765d47ca2f3abbae2e700e3e6d..555f1e632a580b489131907d0b7d5259a597074f 100755 (executable)
@@ -25,7 +25,7 @@ SYMBOL: board
 DEFER: search
 
 : assume ( n x y -- )
-    [ >board ] 2keep [ [ 1+ ] dip search ] 2keep f>board ;
+    [ >board ] 2keep [ [ 1 + ] dip search ] 2keep f>board ;
 
 : attempt ( n x y -- )
     {
@@ -35,7 +35,7 @@ DEFER: search
         [ assume ]
     } cond ;
 
-: solve ( x y -- ) 9 [ 1+ 2over attempt ] each 2drop ;
+: solve ( x y -- ) 9 [ 1 + 2over attempt ] each 2drop ;
 
 : board. ( board -- )
     standard-table-style [
@@ -59,9 +59,9 @@ DEFER: search
 
 : search ( x y -- )
     {
-        { [ over 9 = ] [ [ drop 0 ] dip 1+ search ] }
+        { [ over 9 = ] [ [ drop 0 ] dip 1 + search ] }
         { [ over 0 = over 9 = and ] [ 2drop solution. ] }
-        { [ 2dup board> ] [ [ 1+ ] dip search ] }
+        { [ 2dup board> ] [ [ 1 + ] dip search ] }
         [ solve ]
     } cond ;
 
index 2ed5d21707a84c0f1ec3aadaed21216686e38d06..2d2d38314ab6e2f2ac119dba67a753c9c24f2a93 100644 (file)
@@ -11,7 +11,7 @@ XML-NS: inkscape-name http://www.inkscape.org/namespaces/inkscape
 
 : svg-string>number ( string -- number )
     { { CHAR: E CHAR: e } } substitute "e" split1
-    [ string>number ] [ [ string>number 10 swap ^ ] [ 1 ] if* ] bi* *
+    [ string>number ] [ [ string>number 10^ ] [ 1 ] if* ] bi* *
     >float ;
 
 : degrees ( deg -- rad ) pi * 180.0 / ;
index 5be2dc89e2fbbc96f120901d512f5c58e0c9abaa..3e0cffe71db55aeccd965b842c65547e54e60313 100755 (executable)
@@ -36,7 +36,7 @@ M: winnt available-virtual-mem ( -- n )
     memory-status MEMORYSTATUSEX-ullAvailVirtual ;
 
 : computer-name ( -- string )
-    MAX_COMPUTERNAME_LENGTH 1+
+    MAX_COMPUTERNAME_LENGTH 1 +
     [ <byte-array> dup ] keep <uint>
     GetComputerName win32-error=0/f alien>native-string ;
  
index 42aa7e903a00b27c89761e27d54c32e415181237..4304ba343206ac53c048eba985549e189e79e0c6 100644 (file)
@@ -11,7 +11,7 @@ math.affine-transforms noise ui.gestures combinators.short-circuit
 destructors grid-meshes ;
 IN: terrain
 
-CONSTANT: FOV $[ 2.0 sqrt 1+ ]
+CONSTANT: FOV $[ 2.0 sqrt 1 + ]
 CONSTANT: NEAR-PLANE $[ 1.0 1024.0 / ]
 CONSTANT: FAR-PLANE 2.0
 CONSTANT: PLAYER-START-LOCATION { 0.5 0.51 0.5 }
index 00b5bb6c410a8d16d59f19eb47da80b56154b1de..e1b5867f64ed684ae5095036171bd144b60da824 100644 (file)
@@ -32,10 +32,10 @@ CONSTANT: default-height 20
     [ not ] change-paused? drop ;
 
 : level>> ( tetris -- level )
-    rows>> 1+ 10 / ceiling ;
+    rows>> 1 + 10 / ceiling ;
 
 : update-interval ( tetris -- interval )
-    level>> 1- 60 * 1000 swap - ;
+    level>> 1 - 60 * 1000 swap - ;
 
 : add-block ( tetris block -- )
     over board>> spin current-piece tetromino>> colour>> set-block ;
@@ -57,7 +57,7 @@ CONSTANT: default-height 20
         { 2 [ 100 ] }
         { 3 [ 300 ] }
         { 4 [ 1200 ] }
-    } case swap 1+ * ;
+    } case swap 1 + * ;
 
 : add-score ( tetris n-rows -- tetris )
     over level>> swap rows-score swap [ + ] change-score ;
index 68f8e85a4a19f1c2771d623633234b21c18da3b2..510daaec41085c5a6dde36b96cbcf11f5535b38d 100644 (file)
@@ -104,7 +104,7 @@ SYMBOL: tetrominoes
     tetrominoes get random ;
 
 : blocks-max ( blocks quot -- max )
-    map [ 1+ ] [ max ] map-reduce ; inline
+    map [ 1 + ] [ max ] map-reduce ; inline
 
 : blocks-width ( blocks -- width )
     [ first ] blocks-max ;
index 4efea6ae427944efe9b40b90a9236ee549ec3e84..62f4d8fce4ba9367bd7af9c1018e8e0a7be9ed37 100755 (executable)
@@ -41,9 +41,9 @@ CONSTANT: right 1
 
 : go-left? ( -- ? ) current-side get left eq? ;
 
-: inc-count ( tree -- ) [ 1+ ] change-count drop ;
+: inc-count ( tree -- ) [ 1 + ] change-count drop ;
 
-: dec-count ( tree -- ) [ 1- ] change-count drop ;
+: dec-count ( tree -- ) [ 1 - ] change-count drop ;
 
 : node-link@ ( node ? -- node )
     go-left? xor [ left>> ] [ right>> ] if ;
index 5ff5bb38791e46072eb91a8969bc9aa3428899c3..8730c0acc48330bd553edc4d7a93b3f2125c7dd1 100644 (file)
@@ -23,7 +23,7 @@ TUPLE: list < pack index presenter color hook ;
         list-theme ;
 
 : calc-bounded-index ( n list -- m )
-    control-value length 1- min 0 max ;
+    control-value length 1 - min 0 max ;
 
 : bound-index ( list -- )
     dup index>> over calc-bounded-index >>index drop ;
@@ -83,10 +83,10 @@ M: list focusable-child* drop t ;
     ] if ;
 
 : select-previous ( list -- )
-    [ index>> 1- ] keep select-index ;
+    [ index>> 1 - ] keep select-index ;
 
 : select-next ( list -- )
-    [ index>> 1+ ] keep select-index ;
+    [ index>> 1 + ] keep select-index ;
 
 : invoke-value-action ( list -- )
     dup list-empty? [
index e02701b6909674772ca6b92b514c929f25f18ffb..abf6a536578fb4372d21e6a7a529a98f7141ce97 100644 (file)
@@ -14,7 +14,7 @@ SYMBOL: *calling*
   *wordtimes* get-global [ drop { 0 0 } ] cache first2 ;
 
 : update-times ( utime current-utime current-numinvokes -- utime' invokes' )
-  rot [ + ] curry [ 1+ ] bi* ;
+  rot [ + ] curry [ 1 + ] bi* ;
 
 : register-time ( utime word -- )
   name>>
index 1d89c1c10e15f0aea9cca93ed8b2dcc84f0042d2..00b4a4e9f7cefdb465cb46b9081fb6cad6539a26 100644 (file)
@@ -50,7 +50,7 @@ syn keyword factorCompileDirective inline foldable recursive
 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 <wrapper> 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 assoc-refine 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 <enum> assoc assoc-map enum value-at* remove-all assoc-map-as >alist assoc-filter-as substitute-here clear-assoc assoc-stack maybe-set-at substitute assoc-filter 2cache delete-at assoc-find keys assoc-any? unzip
 syn keyword factorKeyword case execute-effect no-cond no-case? 3cleave>quot 2cleave cond>quot wrong-values? no-cond? cleave>quot no-case case>quot 3cleave wrong-values to-fixed-point alist>quot case-find cond cleave 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 <fp-nan> < 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 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 <fp-nan> < 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 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 reversed index-from cut* pad-tail (indices) concat-as remq but-last snip trim-tail nths nth 2pusher sequence slice? <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? set-last 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 map-integers 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 last replicate set-fourth 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 <flat-slice> second change-each join when-empty accumulator immutable-sequence? <reversed> 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? <repetition> 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
 syn keyword factorKeyword global +@ change set-namestack change-global init-namespaces on off set-global namespace set with-scope bind with-variable inc dec counter initialize namestack get get-global make-assoc
 syn keyword factorKeyword <array> 2array 3array pair >array 1array 4array pair? array resize-array array?
diff --git a/unmaintained/multi-methods/authors.txt b/unmaintained/multi-methods/authors.txt
deleted file mode 100755 (executable)
index 1901f27..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Slava Pestov
diff --git a/unmaintained/multi-methods/multi-methods.factor b/unmaintained/multi-methods/multi-methods.factor
deleted file mode 100755 (executable)
index 17f0de1..0000000
+++ /dev/null
@@ -1,281 +0,0 @@
-! Copyright (C) 2008, 2009 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: kernel math sequences vectors classes classes.algebra
-combinators arrays words assocs parser namespaces make
-definitions prettyprint prettyprint.backend prettyprint.custom
-quotations generalizations debugger io compiler.units
-kernel.private effects accessors hashtables sorting shuffle
-math.order sets see effects.parser ;
-IN: multi-methods
-
-! PART I: Converting hook specializers
-: canonicalize-specializer-0 ( specializer -- specializer' )
-    [ \ f or ] map ;
-
-SYMBOL: args
-
-SYMBOL: hooks
-
-SYMBOL: total
-
-: canonicalize-specializer-1 ( specializer -- specializer' )
-    [
-        [ class? ] filter
-        [ length <reversed> [ 1+ neg ] map ] keep zip
-        [ length args [ max ] change ] keep
-    ]
-    [
-        [ pair? ] filter
-        [ keys [ hooks get adjoin ] each ] keep
-    ] bi append ;
-
-: canonicalize-specializer-2 ( specializer -- specializer' )
-    [
-        [
-            {
-                { [ dup integer? ] [ ] }
-                { [ dup word? ] [ hooks get index ] }
-            } cond args get +
-        ] dip
-    ] assoc-map ;
-
-: canonicalize-specializer-3 ( specializer -- specializer' )
-    [ total get object <array> dup <enum> ] dip update ;
-
-: canonicalize-specializers ( methods -- methods' hooks )
-    [
-        [ [ canonicalize-specializer-0 ] dip ] assoc-map
-
-        0 args set
-        V{ } clone hooks set
-
-        [ [ canonicalize-specializer-1 ] dip ] assoc-map
-
-        hooks [ natural-sort ] change
-
-        [ [ canonicalize-specializer-2 ] dip ] assoc-map
-
-        args get hooks get length + total set
-
-        [ [ canonicalize-specializer-3 ] dip ] assoc-map
-
-        hooks get
-    ] with-scope ;
-
-: drop-n-quot ( n -- quot ) \ drop <repetition> >quotation ;
-
-: prepare-method ( method n -- quot )
-    [ 1quotation ] [ drop-n-quot ] bi* prepend ;
-
-: prepare-methods ( methods -- methods' prologue )
-    canonicalize-specializers
-    [ length [ prepare-method ] curry assoc-map ] keep
-    [ [ get ] curry ] map concat [ ] like ;
-
-! Part II: Topologically sorting specializers
-: maximal-element ( seq quot -- n elt )
-    dupd [
-        swapd [ call +lt+ = ] 2curry filter empty?
-    ] 2curry find [ "Topological sort failed" throw ] unless* ;
-    inline
-
-: topological-sort ( seq quot -- newseq )
-    [ >vector [ dup empty? not ] ] dip
-    [ dupd maximal-element [ over delete-nth ] dip ] curry
-    produce nip ; inline
-
-: classes< ( seq1 seq2 -- lt/eq/gt )
-    [
-        {
-            { [ 2dup eq? ] [ +eq+ ] }
-            { [ 2dup [ class<= ] [ swap class<= ] 2bi and ] [ +eq+ ] }
-            { [ 2dup class<= ] [ +lt+ ] }
-            { [ 2dup swap class<= ] [ +gt+ ] }
-            [ +eq+ ]
-        } cond 2nip
-    ] 2map [ +eq+ eq? not ] find nip +eq+ or ;
-
-: sort-methods ( alist -- alist' )
-    [ [ first ] bi@ classes< ] topological-sort ;
-
-! PART III: Creating dispatch quotation
-: picker ( n -- quot )
-    {
-        { 0 [ [ dup ] ] }
-        { 1 [ [ over ] ] }
-        { 2 [ [ pick ] ] }
-        [ 1- picker [ dip swap ] curry ]
-    } case ;
-
-: (multi-predicate) ( class picker -- quot )
-    swap "predicate" word-prop append ;
-
-: multi-predicate ( classes -- quot )
-    dup length <reversed>
-    [ picker 2array ] 2map
-    [ drop object eq? not ] assoc-filter
-    [ [ t ] ] [
-        [ (multi-predicate) ] { } assoc>map
-        unclip [ swap [ f ] \ if 3array append [ ] like ] reduce
-    ] if-empty ;
-
-: argument-count ( methods -- n )
-    keys 0 [ length max ] reduce ;
-
-ERROR: no-method arguments generic ;
-
-: make-default-method ( methods generic -- quot )
-    [ argument-count ] dip [ [ narray ] dip no-method ] 2curry ;
-
-: multi-dispatch-quot ( methods generic -- quot )
-    [ make-default-method ]
-    [ drop [ [ multi-predicate ] dip ] assoc-map reverse ]
-    2bi alist>quot ;
-
-! Generic words
-PREDICATE: generic < word
-    "multi-methods" word-prop >boolean ;
-
-: methods ( word -- alist )
-    "multi-methods" word-prop >alist ;
-
-: make-generic ( generic -- quot )
-    [
-        [ methods prepare-methods % sort-methods ] keep
-        multi-dispatch-quot %
-    ] [ ] make ;
-
-: update-generic ( word -- )
-    dup make-generic define ;
-
-! Methods
-PREDICATE: method-body < word
-    "multi-method-generic" word-prop >boolean ;
-
-M: method-body stack-effect
-    "multi-method-generic" word-prop stack-effect ;
-
-M: method-body crossref?
-    "forgotten" word-prop not ;
-
-: method-word-name ( specializer generic -- string )
-    [ name>> % "-" % unparse % ] "" make ;
-
-: method-word-props ( specializer generic -- assoc )
-    [
-        "multi-method-generic" set
-        "multi-method-specializer" set
-    ] H{ } make-assoc ;
-
-: <method> ( specializer generic -- word )
-    [ method-word-props ] 2keep
-    method-word-name f <word>
-    swap >>props ;
-
-: with-methods ( word quot -- )
-    over [
-        [ "multi-methods" word-prop ] dip call
-    ] dip update-generic ; inline
-
-: reveal-method ( method classes generic -- )
-    [ set-at ] with-methods ;
-
-: method ( classes word -- method )
-    "multi-methods" word-prop at ;
-
-: create-method ( classes generic -- method )
-    2dup method dup [
-        2nip
-    ] [
-        drop [ <method> dup ] 2keep reveal-method
-    ] if ;
-
-: niceify-method ( seq -- seq )
-    [ dup \ f eq? [ drop f ] when ] map ;
-
-M: no-method error.
-    "Type check error" print
-    nl
-    "Generic word " write dup generic>> pprint
-    " does not have a method applicable to inputs:" print
-    dup arguments>> short.
-    nl
-    "Inputs have signature:" print
-    dup arguments>> [ class ] map niceify-method .
-    nl
-    "Available methods: " print
-    generic>> methods canonicalize-specializers drop sort-methods
-    keys [ niceify-method ] map stack. ;
-
-: forget-method ( specializer generic -- )
-    [ delete-at ] with-methods ;
-
-: method>spec ( method -- spec )
-    [ "multi-method-specializer" word-prop ]
-    [ "multi-method-generic" word-prop ] bi prefix ;
-
-: define-generic ( word effect -- )
-    over set-stack-effect
-    dup "multi-methods" word-prop [ drop ] [
-        [ H{ } clone "multi-methods" set-word-prop ]
-        [ update-generic ]
-        bi
-    ] if ;
-
-! Syntax
-SYNTAX: GENERIC: CREATE-WORD complete-effect define-generic ;
-
-: parse-method ( -- quot classes generic )
-    parse-definition [ 2 tail ] [ second ] [ first ] tri ;
-
-: create-method-in ( specializer generic -- method )
-    create-method dup save-location f set-word ;
-
-: CREATE-METHOD ( -- method )
-    scan-word scan-object swap create-method-in ;
-
-: (METHOD:) ( -- method def ) CREATE-METHOD parse-definition ;
-
-SYNTAX: METHOD: (METHOD:) define ;
-
-! For compatibility
-SYNTAX: M:
-    scan-word 1array scan-word create-method-in
-    parse-definition
-    define ;
-
-! Definition protocol. We qualify core generics here
-QUALIFIED: syntax
-
-syntax:M: generic definer drop \ GENERIC: f ;
-
-syntax:M: generic definition drop f ;
-
-PREDICATE: method-spec < array
-    unclip generic? [ [ class? ] all? ] dip and ;
-
-syntax:M: method-spec where
-    dup unclip method [ ] [ first ] ?if where ;
-
-syntax:M: method-spec set-where
-    unclip method set-where ;
-
-syntax:M: method-spec definer
-    unclip method definer ;
-
-syntax:M: method-spec definition
-    unclip method definition ;
-
-syntax:M: method-spec synopsis*
-    unclip method synopsis* ;
-
-syntax:M: method-spec forget*
-    unclip method forget* ;
-
-syntax:M: method-body definer
-    drop \ METHOD: \ ; ;
-
-syntax:M: method-body synopsis*
-    dup definer.
-    [ "multi-method-generic" word-prop pprint-word ]
-    [ "multi-method-specializer" word-prop pprint* ] bi ;
diff --git a/unmaintained/multi-methods/summary.txt b/unmaintained/multi-methods/summary.txt
deleted file mode 100755 (executable)
index ec8214b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Experimental multiple dispatch implementation
diff --git a/unmaintained/multi-methods/tags.txt b/unmaintained/multi-methods/tags.txt
deleted file mode 100644 (file)
index f427429..0000000
+++ /dev/null
@@ -1 +0,0 @@
-extensions
diff --git a/unmaintained/multi-methods/tests/canonicalize.factor b/unmaintained/multi-methods/tests/canonicalize.factor
deleted file mode 100644 (file)
index 91982de..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-IN: multi-methods.tests
-USING: multi-methods tools.test math sequences namespaces system
-kernel strings ;
-
-[ { POSTPONE: f integer } ] [ { f integer } canonicalize-specializer-0 ] unit-test
-
-: setup-canon-test ( -- )
-    0 args set
-    V{ } clone hooks set ;
-
-: canon-test-1 ( -- seq )
-    { integer { cpu x86 } sequence } canonicalize-specializer-1 ;
-
-[ { { -2 integer } { -1 sequence } { cpu x86 } } ] [
-    [
-        setup-canon-test
-        canon-test-1
-    ] with-scope
-] unit-test
-
-[ { { 0 integer } { 1 sequence } { 2 x86 } } ] [
-    [
-        setup-canon-test
-        canon-test-1
-        canonicalize-specializer-2
-    ] with-scope
-] unit-test
-
-[ { integer sequence x86 } ] [
-    [
-        setup-canon-test
-        canon-test-1
-        canonicalize-specializer-2
-        args get hooks get length + total set
-        canonicalize-specializer-3
-    ] with-scope
-] unit-test
-
-CONSTANT: example-1
-    {
-        { { { cpu x86 } { os linux } } "a" }
-        { { { cpu ppc } } "b" }
-        { { string { os windows } } "c" }
-    }
-
-[
-    {
-        { { object x86 linux } "a"  }
-        { { object ppc object } "b" }
-        { { string object windows } "c" }
-    }
-    { cpu os }
-] [
-    example-1 canonicalize-specializers
-] unit-test
-
-[
-    {
-        { { object x86 linux } [ drop drop "a" ] }
-        { { object ppc object } [ drop drop "b" ] }
-        { { string object windows } [ drop drop "c" ] }
-    }
-    [ \ cpu get \ os get ]
-] [
-    example-1 prepare-methods
-] unit-test
diff --git a/unmaintained/multi-methods/tests/definitions.factor b/unmaintained/multi-methods/tests/definitions.factor
deleted file mode 100644 (file)
index aa66f41..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-IN: multi-methods.tests
-USING: multi-methods tools.test math sequences namespaces system
-kernel strings words compiler.units quotations ;
-
-DEFER: fake
-\ fake H{ } clone "multi-methods" set-word-prop
-
-[ "fake-{ }" ] [ { } \ fake method-word-name ] unit-test
-
-[ H{ { "multi-method-generic" fake } { "multi-method-specializer" { } } } ]
-[ { } \ fake method-word-props ] unit-test
-
-[ t ] [ { } \ fake <method> method-body? ] unit-test
-
-[
-    [ { } [ ] ] [ \ fake methods prepare-methods [ sort-methods ] dip ] unit-test
-
-    [ t ] [ { } \ fake multi-dispatch-quot callable? ] unit-test
-
-    [ t ] [ \ fake make-generic quotation? ] unit-test
-
-    [ ] [ \ fake update-generic ] unit-test
-
-    DEFER: testing
-
-    [ ] [ \ testing (( -- )) define-generic ] unit-test
-
-    [ t ] [ \ testing generic? ] unit-test
-] with-compilation-unit
diff --git a/unmaintained/multi-methods/tests/legacy.factor b/unmaintained/multi-methods/tests/legacy.factor
deleted file mode 100644 (file)
index b6d7326..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-IN: multi-methods.tests
-USING: math strings sequences tools.test ;
-
-GENERIC: legacy-test ( a -- b )
-
-M: integer legacy-test sq ;
-M: string legacy-test " hey" append ;
-
-[ 25 ] [ 5 legacy-test ] unit-test
-[ "hello hey" ] [ "hello" legacy-test ] unit-test
diff --git a/unmaintained/multi-methods/tests/syntax.factor b/unmaintained/multi-methods/tests/syntax.factor
deleted file mode 100644 (file)
index cc07309..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-IN: multi-methods.tests
-USING: multi-methods tools.test math sequences namespaces system
-kernel strings definitions prettyprint debugger arrays
-hashtables continuations classes assocs accessors see ;
-
-GENERIC: first-test ( -- )
-
-[ t ] [ \ first-test generic? ] unit-test
-
-MIXIN: thing
-
-SINGLETON: paper    INSTANCE: paper thing
-SINGLETON: scissors INSTANCE: scissors thing
-SINGLETON: rock     INSTANCE: rock thing
-
-GENERIC: beats? ( obj1 obj2 -- ? )
-
-METHOD: beats? { paper scissors } t ;
-METHOD: beats? { scissors rock } t ;
-METHOD: beats? { rock paper } t ;
-METHOD: beats? { thing thing } f ;
-
-: play ( obj1 obj2 -- ? ) beats? 2nip ;
-
-[ { } 3 play ] must-fail
-[ t ] [ error get no-method? ] unit-test
-[ ] [ error get error. ] unit-test
-[ { { } 3 } ] [ error get arguments>> ] unit-test
-[ t ] [ paper scissors play ] unit-test
-[ f ] [ scissors paper play ] unit-test
-
-[ t ] [ { beats? paper scissors } method-spec? ] unit-test
-[ ] [ { beats? paper scissors } see ] unit-test
-
-SYMBOL: some-var
-
-GENERIC: hook-test ( -- obj )
-
-METHOD: hook-test { array { some-var array } } reverse ;
-METHOD: hook-test { { some-var array } } class ;
-METHOD: hook-test { hashtable { some-var number } } assoc-size ;
-
-{ 1 2 3 } some-var set
-[ { f t t } ] [ { t t f } hook-test ] unit-test
-[ fixnum ] [ 3 hook-test ] unit-test
-5.0 some-var set
-[ 0 ] [ H{ } hook-test ] unit-test
-
-"error" some-var set
-[ H{ } hook-test ] must-fail
-[ t ] [ error get no-method? ] unit-test
-[ { H{ } "error" } ] [ error get arguments>> ] unit-test
-
-MIXIN: busted
-
-TUPLE: busted-1 ;
-TUPLE: busted-2 ; INSTANCE: busted-2 busted
-TUPLE: busted-3 ;
-
-GENERIC: busted-sort ( obj1 obj2 -- obj1 obj2 )
-
-METHOD: busted-sort { busted-1 busted-2 } ;
-METHOD: busted-sort { busted-2 busted-3 } ;
-METHOD: busted-sort { busted busted } ;
diff --git a/unmaintained/multi-methods/tests/topological-sort.factor b/unmaintained/multi-methods/tests/topological-sort.factor
deleted file mode 100644 (file)
index f161837..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-USING: kernel multi-methods tools.test math arrays sequences
-math.order ;
-IN: multi-methods.tests
-
-[ { 1 2 3 4 5 6 } ] [
-    { 6 4 5 1 3 2 } [ <=> ] topological-sort
-] unit-test
-
-[ +lt+ ] [
-    { fixnum array } { number sequence } classes<
-] unit-test
-
-[ +eq+ ] [
-    { number sequence } { number sequence } classes<
-] unit-test
-
-[ +gt+ ] [
-    { object object } { number sequence } classes<
-] unit-test