]> gitweb.factorcode.org Git - factor.git/commitdiff
Merge branch 'mongodb-changes' of git://github.com/x6j8x/factor
authorDoug Coleman <doug.coleman@gmail.com>
Fri, 15 Jan 2010 11:41:22 +0000 (05:41 -0600)
committerDoug Coleman <doug.coleman@gmail.com>
Fri, 15 Jan 2010 11:41:22 +0000 (05:41 -0600)
255 files changed:
basis/alien/remote-control/remote-control.factor
basis/base64/base64.factor
basis/binary-search/binary-search-tests.factor
basis/bit-arrays/bit-arrays-tests.factor
basis/bit-arrays/bit-arrays.factor
basis/bit-vectors/bit-vectors-tests.factor
basis/bootstrap/image/image.factor
basis/bootstrap/image/syntax/syntax.factor
basis/calendar/format/format.factor
basis/checksums/sha/sha.factor
basis/classes/struct/bit-accessors/bit-accessors-tests.factor
basis/cocoa/application/application.factor
basis/cocoa/messages/messages.factor
basis/columns/columns-tests.factor
basis/columns/columns.factor
basis/combinators/smart/smart.factor
basis/command-line/command-line.factor
basis/compiler/cfg/instructions/syntax/syntax.factor
basis/compiler/cfg/intrinsics/allot/allot.factor
basis/compiler/cfg/intrinsics/intrinsics.factor
basis/compiler/cfg/intrinsics/misc/misc.factor
basis/compiler/cfg/intrinsics/simd/backend/backend.factor
basis/compiler/cfg/stacks/stacks.factor
basis/compiler/cfg/stacks/uninitialized/uninitialized.factor
basis/compiler/codegen/codegen.factor
basis/compiler/codegen/fixup/fixup.factor
basis/compiler/tests/alien.factor
basis/compiler/tests/codegen.factor
basis/compiler/tests/float.factor
basis/compiler/tests/intrinsics.factor
basis/compiler/tests/optimizer.factor
basis/compiler/tree/cleanup/cleanup-tests.factor
basis/compiler/tree/dead-code/branches/branches.factor
basis/compiler/tree/dead-code/recursive/recursive.factor
basis/compiler/tree/dead-code/simple/simple.factor
basis/compiler/tree/debugger/debugger.factor
basis/compiler/tree/escape-analysis/recursive/recursive-tests.factor
basis/compiler/tree/modular-arithmetic/modular-arithmetic-tests.factor
basis/compiler/tree/normalization/normalization.factor
basis/compiler/tree/propagation/call-effect/call-effect.factor
basis/compiler/tree/propagation/info/info-tests.factor
basis/compiler/tree/propagation/known-words/known-words.factor
basis/compiler/tree/propagation/propagation-tests.factor
basis/compiler/tree/propagation/simple/simple.factor
basis/compiler/tree/propagation/transforms/transforms.factor
basis/compression/inflate/inflate.factor
basis/concurrency/combinators/combinators-tests.factor
basis/cpu/ppc/bootstrap.factor
basis/cpu/ppc/ppc.factor
basis/cpu/x86/64/bootstrap.factor
basis/db/db.factor
basis/db/queries/queries.factor
basis/db/tester/tester.factor
basis/farkup/farkup-tests.factor
basis/fry/fry-tests.factor
basis/generalizations/generalizations-tests.factor
basis/grouping/grouping-docs.factor
basis/heaps/heaps-tests.factor
basis/hints/hints.factor
basis/images/jpeg/jpeg.factor
basis/images/png/png.factor
basis/images/processing/processing.factor
basis/inspector/inspector.factor
basis/inverse/inverse.factor
basis/io/encodings/iso2022/iso2022.factor
basis/io/files/links/unix/unix-tests.factor
basis/io/files/unique/unique.factor
basis/lcs/diff2html/diff2html-tests.factor
basis/lcs/diff2html/diff2html.factor
basis/lcs/lcs.factor
basis/macros/expander/expander.factor
basis/math/combinatorics/combinatorics-docs.factor
basis/math/combinatorics/combinatorics-tests.factor
basis/math/combinatorics/combinatorics.factor
basis/math/complex/complex-tests.factor
basis/math/functions/functions.factor
basis/math/intervals/intervals-tests.factor
basis/math/matrices/elimination/elimination.factor
basis/math/matrices/matrices.factor
basis/math/polynomials/polynomials.factor
basis/math/primes/miller-rabin/miller-rabin-tests.factor
basis/math/primes/miller-rabin/miller-rabin.factor
basis/math/vectors/simd/cords/cords.factor
basis/math/vectors/simd/intrinsics/intrinsics.factor
basis/math/vectors/simd/simd-tests.factor
basis/math/vectors/simd/simd.factor
basis/math/vectors/vectors.factor
basis/models/arrow/smart/smart.factor
basis/nibble-arrays/nibble-arrays-tests.factor
basis/peg/ebnf/ebnf.factor
basis/persistent/hashtables/hashtables-tests.factor
basis/persistent/vectors/vectors-tests.factor
basis/porter-stemmer/porter-stemmer.factor
basis/prettyprint/sections/sections.factor
basis/random/mersenne-twister/mersenne-twister-tests.factor
basis/random/mersenne-twister/mersenne-twister.factor
basis/random/random-docs.factor
basis/random/random-tests.factor
basis/random/random.factor
basis/regexp/disambiguate/disambiguate.factor
basis/roman/roman-docs.factor
basis/roman/roman.factor
basis/serialize/serialize-tests.factor
basis/serialize/serialize.factor
basis/shuffle/shuffle.factor
basis/sorting/insertion/insertion.factor
basis/sorting/slots/slots-tests.factor
basis/splitting/monotonic/monotonic.factor
basis/stack-checker/errors/prettyprint/prettyprint.factor
basis/stack-checker/inlining/inlining.factor
basis/stack-checker/known-words/known-words.factor
basis/stack-checker/stack-checker-docs.factor
basis/stack-checker/stack-checker-tests.factor
basis/stack-checker/stack-checker.factor
basis/stack-checker/state/state.factor
basis/strings/tables/tables.factor
basis/suffix-arrays/suffix-arrays.factor
basis/threads/threads-tests.factor
basis/threads/threads.factor
basis/tools/deploy/shaker/shaker.factor
basis/tools/deploy/shaker/strip-cocoa.factor
basis/tr/tr.factor
basis/tuple-arrays/tuple-arrays.factor
basis/ui/gadgets/gadgets-tests.factor
basis/ui/gadgets/packs/packs-tests.factor
basis/ui/gadgets/panes/panes-tests.factor
basis/ui/gadgets/scrollers/scrollers-tests.factor
basis/ui/gadgets/slots/slots-tests.factor
basis/ui/pens/gradient/gradient-tests.factor
basis/ui/pens/gradient/gradient.factor
basis/unicode/breaks/breaks-tests.factor
basis/unicode/breaks/breaks.factor
basis/unicode/collation/collation.factor
basis/unicode/data/data.factor
basis/unix/unix.factor
basis/unrolled-lists/unrolled-lists-tests.factor
basis/vm/vm.factor
basis/windows/time/time.factor
basis/xml/tests/xmltest.factor
basis/xml/tokenize/tokenize.factor
build-support/factor.sh
core/alien/strings/strings.factor
core/assocs/assocs.factor
core/bootstrap/primitives.factor
core/byte-vectors/byte-vectors-tests.factor
core/classes/algebra/algebra-tests.factor
core/combinators/combinators.factor
core/compiler/units/units.factor
core/continuations/continuations-tests.factor
core/continuations/continuations.factor
core/effects/effects-docs.factor
core/effects/effects-tests.factor
core/effects/effects.factor
core/generic/generic-docs.factor
core/hashtables/hashtables-tests.factor
core/init/init.factor
core/io/encodings/utf8/utf8-tests.factor
core/io/files/files.factor
core/io/streams/c/c.factor
core/kernel/kernel-docs.factor
core/layouts/layouts.factor
core/math/floats/floats-tests.factor
core/math/floats/floats.factor
core/math/integers/integers-tests.factor
core/math/integers/integers.factor
core/math/math-docs.factor
core/math/order/order-docs.factor
core/math/order/order.factor
core/math/parser/parser-docs.factor
core/namespaces/namespaces.factor
core/parser/parser.factor
core/sbufs/sbufs-tests.factor
core/sequences/sequences-docs.factor
core/sequences/sequences-tests.factor
core/sequences/sequences.factor
core/sorting/sorting-tests.factor
core/source-files/errors/errors.factor
core/strings/strings-tests.factor
core/system/system.factor
core/vectors/vectors-tests.factor
extra/24-game/24-game.factor
extra/alien/data/map/map-tests.factor
extra/benchmark/base64/base64.factor
extra/benchmark/dawes/dawes.factor
extra/benchmark/dispatch2/dispatch2.factor
extra/benchmark/dispatch4/dispatch4.factor
extra/benchmark/e-decimals/e-decimals.factor
extra/benchmark/empty-loop-2/empty-loop-2.factor
extra/benchmark/fasta/fasta.factor
extra/benchmark/gc1/gc1.factor
extra/benchmark/iteration/iteration.factor
extra/benchmark/knucleotide/knucleotide.factor
extra/benchmark/partial-sums/partial-sums.factor
extra/benchmark/random/random.factor
extra/benchmark/raytracer-simd/raytracer-simd.factor
extra/benchmark/raytracer/raytracer.factor
extra/benchmark/ring/ring.factor
extra/benchmark/spectral-norm/spectral-norm.factor
extra/benchmark/tuple-arrays/tuple-arrays.factor
extra/benchmark/ui-panes/ui-panes.factor
extra/benchmark/yuv-to-rgb/yuv-to-rgb.factor
extra/bloom-filters/bloom-filters-tests.factor
extra/bloom-filters/bloom-filters.factor
extra/constructors/constructors.factor
extra/crypto/aes/aes.factor
extra/decimals/decimals-tests.factor
extra/grid-meshes/grid-meshes-tests.factor [new file with mode: 0644]
extra/html/parser/analyzer/analyzer.factor
extra/id3/id3-tests.factor
extra/infix/infix-docs.factor
extra/jamshred/gl/gl.factor
extra/jamshred/oint/oint.factor
extra/koszul/koszul.factor
extra/mason/common/common.factor
extra/math/analysis/analysis.factor
extra/math/text/english/english.factor
extra/maze/maze.factor
extra/memory/pools/pools.factor
extra/multi-methods/multi-methods.factor
extra/noise/noise-tests.factor [new file with mode: 0644]
extra/noise/noise.factor
extra/partial-continuations/partial-continuations-tests.factor
extra/project-euler/001/001.factor
extra/project-euler/011/011.factor
extra/project-euler/014/014.factor
extra/project-euler/024/024.factor
extra/project-euler/027/027.factor
extra/project-euler/030/030.factor
extra/project-euler/032/032.factor
extra/project-euler/043/043.factor
extra/project-euler/052/052.factor
extra/project-euler/053/053.factor
extra/project-euler/055/055.factor
extra/project-euler/057/057.factor
extra/project-euler/081/081.factor
extra/project-euler/150/150.factor
extra/project-euler/151/151.factor
extra/project-euler/164/164.factor
extra/project-euler/common/common.factor
extra/slides/slides.factor
extra/smalltalk/compiler/compiler-tests.factor
extra/smalltalk/selectors/selectors.factor
extra/sudoku/sudoku-tests.factor [new file with mode: 0644]
extra/sudoku/sudoku.factor
extra/taxes/usa/fica/fica.factor
extra/tetris/board/board.factor
extra/tetris/gl/gl.factor
extra/trees/splay/splay-tests.factor
vm/Config.windows
vm/Config.x86.64
vm/cpu-ppc.hpp
vm/instruction_operands.cpp
vm/master.hpp
vm/os-windows.hpp
vm/platform.hpp

index 6a5644cceb5f675f77875e4b094d5cb308924611..ae694bed9c4b8da031dc212c9e187df1d92e97ca 100644 (file)
@@ -19,8 +19,8 @@ IN: alien.remote-control
     dup optimized? [ execute ] [ drop f ] if ; inline
 
 : init-remote-control ( -- )
-    \ eval-callback ?callback 16 setenv
-    \ yield-callback ?callback 17 setenv
-    \ sleep-callback ?callback 18 setenv ;
+    \ eval-callback ?callback 16 set-special-object
+    \ yield-callback ?callback 17 set-special-object
+    \ sleep-callback ?callback 18 set-special-object ;
 
 MAIN: init-remote-control
index eb2c9193a374b35e61a33a2f510f4c2582eaf04e..1a0648cef8b92f2037438ddc2686e24617e3ade3 100644 (file)
@@ -13,7 +13,8 @@ ERROR: malformed-base64 ;
     read1 2dup swap member? [ drop read1-ignoring ] [ nip ] if ;
 
 : read-ignoring ( ignoring n -- str )
-    [ drop read1-ignoring ] with map harvest
+    [ drop read1-ignoring ] with { } map-integers
+    [ { f 0 } member? not ] filter
     [ f ] [ >string ] if-empty ;
 
 : ch>base64 ( ch -- ch )
@@ -42,7 +43,7 @@ SYMBOL: column
     [ write1-lines ] each ;
 
 : encode3 ( seq -- )
-    be> 4 <reversed> [
+    be> 4 iota <reversed> [
         -6 * shift HEX: 3f bitand ch>base64 write1-lines
     ] with each ; inline
 
index f2ea7503f4851f8a8ac6bdb371a21237053d03ce..a797219a01466894624323ce5832c0965f4cec64 100644 (file)
@@ -1,4 +1,4 @@
-USING: binary-search math.order vectors kernel tools.test ;
+USING: binary-search math.order sequences kernel tools.test ;
 IN: binary-search.tests
 
 [ f ] [ 3 { } [ <=> ] with search drop ] unit-test
@@ -7,7 +7,7 @@ IN: binary-search.tests
 [ 3 ] [ 4 { 1 2 3 4 5 6 } [ <=> ] with search drop ] unit-test
 [ 2 ] [ 3.5 { 1 2 3 4 5 6 7 8 } [ <=> ] with search drop ] unit-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
+[ 10 ] [ 10 20 iota [ <=> ] with search drop ] 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
index 7397791ab5b1b05058058d87fade66942c1ccb6d..f08db68441c9484a7f17c2f3c9752abdf42719c2 100644 (file)
@@ -40,7 +40,7 @@ IN: bit-arrays.tests
     100 [
         drop 100 [ 2 random zero? ] replicate
         dup >bit-array >array =
-    ] all?
+    ] all-integers?
 ] unit-test
 
 [ ?{ f } ] [
index f5613da6b552126b3edf31b7e494179c0246a9c0..4fafc528fdcb7728633915184f4ec5e97f23cdb8 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2007, 2008 Slava Pestov.
+! Copyright (C) 2007, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: alien.c-types alien.data accessors math alien.accessors kernel
 kernel.private sequences sequences.private byte-arrays
@@ -25,7 +25,7 @@ TUPLE: bit-array
 
 : (set-bits) ( bit-array n -- )
     [ [ length bits>cells ] keep ] dip swap underlying>>
-    '[ 2 shift [ _ _ ] dip set-alien-unsigned-4 ] each ; inline
+    '[ 2 shift [ _ _ ] dip set-alien-unsigned-4 ] each-integer ; inline
 
 : clean-up ( bit-array -- )
     ! Zero bits after the end.
@@ -99,7 +99,7 @@ SYNTAX: ?{ \ } [ >bit-array ] parse-literal ;
     ] if ;
 
 : bit-array>integer ( bit-array -- n )
-    0 swap underlying>> dup length <reversed> [
+    0 swap underlying>> dup length iota <reversed> [
         alien-unsigned-1 swap 8 shift bitor
     ] with each ;
 
index 5af44b59f7f30577e24a753a74c4565fe1f03689..a8a856ffd00476e73a9bef035886d965cfa0fd92 100644 (file)
@@ -4,7 +4,7 @@ IN: bit-vectors.tests
 [ 0 ] [ 123 <bit-vector> length ] unit-test\r
 \r
 : do-it ( seq -- )\r
-    1234 swap [ [ even? ] dip push ] curry each ;\r
+    1234 swap [ [ even? ] dip push ] curry each-integer ;\r
 \r
 [ t ] [\r
     3 <bit-vector> dup do-it\r
index 1565373cab79403d493ed3007d9b87af29388131..90b4c3ae6f35ebe22e6d1eab562bf23f4fb3e844 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2004, 2009 Slava Pestov.
+! Copyright (C) 2004, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: alien alien.strings arrays byte-arrays generic hashtables
 hashtables.private io io.binary io.files io.encodings.binary
@@ -93,7 +93,7 @@ CONSTANT: image-version 4
 
 CONSTANT: data-base 1024
 
-CONSTANT: userenv-size 70
+CONSTANT: special-objects-size 70
 
 CONSTANT: header-size 10
 
@@ -176,58 +176,58 @@ SYMBOL: architecture
 RESET
 
 ! Boot quotation, set in stage1.factor
-USERENV: bootstrap-startup-quot 20
+SPECIAL-OBJECT: bootstrap-startup-quot 20
 
 ! Bootstrap global namesapce
-USERENV: bootstrap-global 21
+SPECIAL-OBJECT: bootstrap-global 21
 
 ! JIT parameters
-USERENV: jit-prolog 23
-USERENV: jit-primitive-word 24
-USERENV: jit-primitive 25
-USERENV: jit-word-jump 26
-USERENV: jit-word-call 27
-USERENV: jit-if-word 28
-USERENV: jit-if 29
-USERENV: jit-epilog 30
-USERENV: jit-return 31
-USERENV: jit-profiling 32
-USERENV: jit-push 33
-USERENV: jit-dip-word 34
-USERENV: jit-dip 35
-USERENV: jit-2dip-word 36
-USERENV: jit-2dip 37
-USERENV: jit-3dip-word 38
-USERENV: jit-3dip 39
-USERENV: jit-execute 40
-USERENV: jit-declare-word 41
-
-USERENV: c-to-factor-word 42
-USERENV: lazy-jit-compile-word 43
-USERENV: unwind-native-frames-word 44
-
-USERENV: callback-stub 48
+SPECIAL-OBJECT: jit-prolog 23
+SPECIAL-OBJECT: jit-primitive-word 24
+SPECIAL-OBJECT: jit-primitive 25
+SPECIAL-OBJECT: jit-word-jump 26
+SPECIAL-OBJECT: jit-word-call 27
+SPECIAL-OBJECT: jit-if-word 28
+SPECIAL-OBJECT: jit-if 29
+SPECIAL-OBJECT: jit-epilog 30
+SPECIAL-OBJECT: jit-return 31
+SPECIAL-OBJECT: jit-profiling 32
+SPECIAL-OBJECT: jit-push 33
+SPECIAL-OBJECT: jit-dip-word 34
+SPECIAL-OBJECT: jit-dip 35
+SPECIAL-OBJECT: jit-2dip-word 36
+SPECIAL-OBJECT: jit-2dip 37
+SPECIAL-OBJECT: jit-3dip-word 38
+SPECIAL-OBJECT: jit-3dip 39
+SPECIAL-OBJECT: jit-execute 40
+SPECIAL-OBJECT: jit-declare-word 41
+
+SPECIAL-OBJECT: c-to-factor-word 42
+SPECIAL-OBJECT: lazy-jit-compile-word 43
+SPECIAL-OBJECT: unwind-native-frames-word 44
+
+SPECIAL-OBJECT: callback-stub 48
 
 ! PIC stubs
-USERENV: pic-load 49
-USERENV: pic-tag 50
-USERENV: pic-tuple 51
-USERENV: pic-check-tag 52
-USERENV: pic-check-tuple 53
-USERENV: pic-hit 54
-USERENV: pic-miss-word 55
-USERENV: pic-miss-tail-word 56
+SPECIAL-OBJECT: pic-load 49
+SPECIAL-OBJECT: pic-tag 50
+SPECIAL-OBJECT: pic-tuple 51
+SPECIAL-OBJECT: pic-check-tag 52
+SPECIAL-OBJECT: pic-check-tuple 53
+SPECIAL-OBJECT: pic-hit 54
+SPECIAL-OBJECT: pic-miss-word 55
+SPECIAL-OBJECT: pic-miss-tail-word 56
 
 ! Megamorphic dispatch
-USERENV: mega-lookup 57
-USERENV: mega-lookup-word 58
-USERENV: mega-miss-word 59
+SPECIAL-OBJECT: mega-lookup 57
+SPECIAL-OBJECT: mega-lookup-word 58
+SPECIAL-OBJECT: mega-miss-word 59
 
 ! Default definition for undefined words
-USERENV: undefined-quot 60
+SPECIAL-OBJECT: undefined-quot 60
 
-: userenv-offset ( symbol -- n )
-    userenvs get at header-size + ;
+: special-object-offset ( symbol -- n )
+    special-objects get at header-size + ;
 
 : emit ( cell -- ) image get push ;
 
@@ -243,7 +243,7 @@ USERENV: undefined-quot 60
 : fixup ( value offset -- ) image get set-nth ;
 
 : heap-size ( -- size )
-    image get length header-size - userenv-size -
+    image get length header-size - special-objects-size -
     bootstrap-cells ;
 
 : here ( -- size ) heap-size data-base + ;
@@ -282,10 +282,10 @@ GENERIC: ' ( obj -- ptr )
     0 emit ! pointer to bignum 0
     0 emit ! pointer to bignum 1
     0 emit ! pointer to bignum -1
-    userenv-size [ f ' emit ] times ;
+    special-objects-size [ f ' emit ] times ;
 
-: emit-userenv ( symbol -- )
-    [ get ' ] [ userenv-offset ] bi fixup ;
+: emit-special-object ( symbol -- )
+    [ get ' ] [ special-object-offset ] bi fixup ;
 
 ! Bignums
 
@@ -548,8 +548,8 @@ M: quotation '
     \ unwind-native-frames unwind-native-frames-word set
     [ undefined ] undefined-quot set ;
 
-: emit-userenvs ( -- )
-    userenvs get keys [ emit-userenv ] each ;
+: emit-special-objects ( -- )
+    special-objects get keys [ emit-special-object ] each ;
 
 : fixup-header ( -- )
     heap-size data-heap-size-offset fixup ;
@@ -566,8 +566,8 @@ M: quotation '
     emit-jit-data
     "Serializing global namespace..." print flush
     emit-global
-    "Serializing user environment..." print flush
-    emit-userenvs
+    "Serializing special object table..." print flush
+    emit-special-objects
     "Performing word fixups..." print flush
     fixup-words
     "Performing header fixups..." print flush
index 29dc09717a605a8ed023933e68b15c235fa6fa44..7025cd61e14bbaf491b768ab88bb95395760d5a8 100644 (file)
@@ -1,14 +1,14 @@
-! Copyright (C) 2009 Slava Pestov.
+! Copyright (C) 2009, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: parser kernel namespaces assocs words.symbol ;
 IN: bootstrap.image.syntax
 
-SYMBOL: userenvs
+SYMBOL: special-objects
 
-SYNTAX: RESET H{ } clone userenvs set-global ;
+SYNTAX: RESET H{ } clone special-objects set-global ;
 
-SYNTAX: USERENV:
+SYNTAX: SPECIAL-OBJECT:
     CREATE-WORD scan-word
-    [ swap userenvs get set-at ]
+    [ swap special-objects get set-at ]
     [ drop define-symbol ]
     2bi ;
\ No newline at end of file
index d07d74722a71de9c45ad58b231d55b71acd54a3b..96d76d0ce86430c5e7b9badbd0502b7393f8aba8 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008 Slava Pestov.\r
+! Copyright (C) 2008, 2010 Slava Pestov, Doug Coleman.\r
 ! See http://factorcode.org/license.txt for BSD license.\r
 USING: math math.order math.parser math.functions kernel\r
 sequences io accessors arrays io.streams.string splitting\r
@@ -70,7 +70,7 @@ M: array month. ( pair -- )
     [\r
         [ 1 + day. ] keep\r
         1 + + 7 mod zero? [ nl ] [ bl ] if\r
-    ] with each nl ;\r
+    ] with each-integer nl ;\r
 \r
 M: timestamp month. ( timestamp -- )\r
     [ year>> ] [ month>> ] bi 2array month. ;\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-integer ;\r
 \r
 M: timestamp year. ( timestamp -- )\r
     year>> year. ;\r
index 35262bb0b0fb718103d9b3ef39138a598f86effd..ba85add03c63727406fb6d650b5f745b2b911e68 100644 (file)
@@ -301,7 +301,7 @@ GENERIC: pad-initial-bytes ( string sha2 -- padded-string )
         M cloned-H sha2 T1-256
         cloned-H T2-256
         cloned-H update-H
-    ] each
+    ] each-integer
     sha2 [ cloned-H [ w+ ] 2map ] change-H drop ; inline
 
 M: sha2-short checksum-block
@@ -391,7 +391,7 @@ M: sha-256 checksum-stream ( stream checksum -- byte-array )
         b H nth-unsafe 30 bitroll-32 c H set-nth-unsafe
         a H nth-unsafe b H set-nth-unsafe
         a H set-nth-unsafe
-    ] each
+    ] each-integer
     state [ H [ w+ ] 2map ] change-H drop ; inline
 
 M:: sha1-state checksum-block ( bytes state -- )
index e2ff6dbd9c5c15e834f0bcb05f28f2c43fa22e01..ecf7b68a2d89fc25a048998299451679511823b5 100644 (file)
@@ -1,6 +1,7 @@
 ! Copyright (C) 2009 Daniel Ehrenberg
 ! See http://factorcode.org/license.txt for BSD license.
-USING: classes.struct.bit-accessors tools.test effects kernel random stack-checker ;
+USING: classes.struct.bit-accessors tools.test effects kernel
+sequences random stack-checker ;
 IN: classes.struct.bit-accessors.test
 
 [ t ] [ 20 random 20 random bit-reader infer (( alien -- n )) effect= ] unit-test
index 83213b47ba005ec11c6442898a74a9b96a9d214c..df56ce5c4c43568bf9cbdcd5226d64aac3a21156 100644 (file)
@@ -49,7 +49,7 @@ TUPLE: objc-error alien reason ;
 M: objc-error summary ( error -- )
     drop "Objective C exception" ;
 
-[ [ objc-error ] 19 setenv ] "cocoa.application" add-startup-hook
+[ [ objc-error ] 19 set-special-object ] "cocoa.application" add-startup-hook
 
 : running.app? ( -- ? )
     #! Test if we're running a .app.
index 4cc9554d3c4be5b84d1be3a1f09b7ceabd02fded..02e6335c54b5f4f2a7a628721d7647df412025a2 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2006, 2009 Slava Pestov.
+! Copyright (C) 2006, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors alien alien.c-types alien.strings arrays assocs
 classes.struct continuations combinators compiler compiler.alien
@@ -202,7 +202,7 @@ ERROR: no-objc-type name ;
     (free) ;
 
 : method-arg-types ( method -- args )
-    dup method_getNumberOfArguments
+    dup method_getNumberOfArguments iota
     [ method-arg-type ] with map ;
 
 : method-return-type ( method -- ctype )
index 434c2339368a24b1970dcd1a20e938f5df79e010..c0e0956709582c1421577dc4accf9af2488b62c5 100644 (file)
@@ -7,3 +7,5 @@ IN: columns.tests
 [ { 1 4 7 } ] [ "seq" get 0 <column> >array ] unit-test
 [ ] [ "seq" get 1 <column> [ sq ] map! drop ] unit-test
 [ { 4 25 64 } ] [ "seq" get 1 <column> >array ] unit-test
+
+[ { { 1 3 } { 2 4 } } ] [ { { 1 2 } { 3 4 } } <flipped> [ >array ] map ] unit-test
index 8674217655c572e0bf977279d2fd3c9dc251882d..c36505ab6d1d727f091ff83be941935005fd1c10 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2005, 2008 Slava Pestov, Daniel Ehrenberg.
+! Copyright (C) 2005, 2010 Slava Pestov, Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: sequences kernel accessors ;
 IN: columns
@@ -15,4 +15,4 @@ M: column length seq>> length ;
 INSTANCE: column virtual-sequence
 
 : <flipped> ( seq -- seq' )
-    dup empty? [ dup first length [ <column> ] with map ] unless ;
+    dup empty? [ dup first length [ <column> ] with { } map-integers ] unless ;
index 91987e0dfa6577f05a1d3b492ab56a6279ce33dd..cb1b309c86ebccc34cbc9bb0ef0ab9b6e75a9b52 100644 (file)
@@ -5,49 +5,49 @@ stack-checker math sequences ;
 IN: combinators.smart
 
 MACRO: drop-outputs ( quot -- quot' )
-    dup infer out>> '[ @ _ ndrop ] ;
+    dup outputs '[ @ _ ndrop ] ;
 
 MACRO: keep-inputs ( quot -- quot' )
-    dup infer in>> '[ _ _ nkeep ] ;
+    dup inputs '[ _ _ nkeep ] ;
 
 MACRO: output>sequence ( quot exemplar -- newquot )
-    [ dup infer out>> ] dip
+    [ dup outputs ] dip
     '[ @ _ _ nsequence ] ;
 
 MACRO: output>array ( quot -- newquot )
     '[ _ { } output>sequence ] ;
 
 MACRO: input<sequence ( quot -- newquot )
-    [ infer in>> ] keep
+    [ inputs ] keep
     '[ _ firstn @ ] ;
 
 MACRO: input<sequence-unsafe ( quot -- newquot )
-    [ infer in>> ] keep
+    [ inputs ] keep
     '[ _ firstn-unsafe @ ] ;
 
 MACRO: reduce-outputs ( quot operation -- newquot )
-    [ dup infer out>> 1 [-] ] dip n*quot compose ;
+    [ dup outputs 1 [-] ] dip n*quot compose ;
 
 MACRO: sum-outputs ( quot -- n )
     '[ _ [ + ] reduce-outputs ] ;
 
 MACRO: map-reduce-outputs ( quot mapper reducer -- newquot )
-    [ dup infer out>> ] 2dip
+    [ dup outputs ] 2dip
     [ swap '[ _ _ napply ] ]
     [ [ 1 [-] ] dip n*quot ] bi-curry* bi
     '[ @ @ @ ] ;
 
 MACRO: append-outputs-as ( quot exemplar -- newquot )
-    [ dup infer out>> ] dip '[ @ _ _ nappend-as ] ;
+    [ dup outputs ] dip '[ @ _ _ nappend-as ] ;
 
 MACRO: append-outputs ( quot -- seq )
     '[ _ { } append-outputs-as ] ;
 
 MACRO: preserving ( quot -- )
-    [ infer in>> length ] keep '[ _ ndup @ ] ;
+    [ inputs ] keep '[ _ ndup @ ] ;
 
 MACRO: nullary ( quot -- quot' )
-    dup infer out>> length '[ @ _ ndrop ] ;
+    dup outputs '[ @ _ ndrop ] ;
 
 MACRO: smart-if ( pred true false -- )
     '[ _ preserving _ _ if ] ; inline
index f1748d37083f7ebbaba5663eb8a238f39db590c3..939fb82f008f0da27277faef527039dea009b3cd 100644 (file)
@@ -8,7 +8,8 @@ IN: command-line
 SYMBOL: script
 SYMBOL: command-line
 
-: (command-line) ( -- args ) 10 getenv sift [ alien>native-string ] map ;
+: (command-line) ( -- args )
+    10 special-object sift [ alien>native-string ] map ;
 
 : rc-path ( name -- path )
     os windows? [ "." prepend ] unless
index bca5e1ee64491c2c8956fd7c74e5f40bc8ca725b..cd76652d06076508be8cfaa3308093cc26c23ef8 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008, 2009 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: classes.tuple classes.tuple.parser kernel words
 make fry sequences parser accessors effects namespaces
@@ -61,14 +61,14 @@ TUPLE: insn-slot-spec type name rep ;
     "pure-insn" "compiler.cfg.instructions" lookup ;
 
 : insn-effect ( word -- effect )
-    boa-effect in>> but-last f <effect> ;
+    boa-effect in>> but-last { } <effect> ;
 
 : define-insn-tuple ( class superclass specs -- )
     [ name>> ] map "insn#" suffix define-tuple-class ;
 
 : define-insn-ctor ( class specs -- )
     [ dup '[ _ ] [ f ] [ boa , ] surround ] dip
-    [ name>> ] map f <effect> define-declared ;
+    [ name>> ] map { } <effect> define-declared ;
 
 : define-insn ( class superclass specs -- )
     parse-insn-slot-specs {
index 9804244ecb939da2a2d7d5996b808f9b4b61019c..31a8a898bc1fb07837e1a88425dda876e0f27210 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008, 2009 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel math math.order sequences accessors arrays
 byte-arrays layouts classes.tuple.private fry locals
@@ -34,7 +34,7 @@ IN: compiler.cfg.intrinsics.allot
     [ [ ^^load-literal ] dip 1 ] dip type-number ##set-slot-imm ;
 
 :: store-initial-element ( len reg elt class -- )
-    len [ [ elt reg ] dip 2 + class type-number ##set-slot-imm ] each ;
+    len [ [ elt reg ] dip 2 + class type-number ##set-slot-imm ] each-integer ;
 
 : expand-<array>? ( obj -- ? )
     dup integer? [ 0 8 between? ] [ drop f ] if ;
index e8c93899cb71c25d64ffef1699c531cb0ae0a545..d753a4c1b496c75cbf0a329e9147bc685689ba23 100644 (file)
@@ -30,7 +30,7 @@ IN: compiler.cfg.intrinsics
 
 {
     { kernel.private:tag [ drop emit-tag ] }
-    { kernel.private:getenv [ emit-getenv ] }
+    { kernel.private:special-object [ emit-special-object ] }
     { kernel.private:(identity-hashcode) [ drop emit-identity-hashcode ] }
     { math.private:both-fixnums? [ drop emit-both-fixnums? ] }
     { math.private:fixnum+ [ drop emit-fixnum+ ] }
index a477ef4b950b1d0b9b6a6dcbf58d99edc1a6a6c6..fed5492220847bbd760935147a1995d2c94151f3 100644 (file)
@@ -9,8 +9,8 @@ IN: compiler.cfg.intrinsics.misc
 : emit-tag ( -- )
     ds-pop tag-mask get ^^and-imm ^^tag-fixnum ds-push ;
 
-: emit-getenv ( node -- )
-    "userenv" ^^vm-field-ptr
+: emit-special-object ( node -- )
+    "special-objects" ^^vm-field-ptr
     swap node-input-infos first literal>>
     [ ds-drop 0 ^^slot-imm ] [ ds-pop ^^offset>slot ^^slot ] if*
     ds-push ;
index cf61a560d240089c85760b33c0d38f4ea1a6e18c..e8b9e3c5de3bc2abfc31138d76c16991815faf1d 100644 (file)
@@ -110,7 +110,7 @@ MACRO: vvvv-vector-op ( trials -- )
     blub ;
 
 MACRO: can-has-case ( cases -- )
-    dup first second infer in>> length 1 +
+    dup first second inputs 1 +
     '[ _ ndrop f ] suffix '[ _ case ] ;
 
 GENERIC# >can-has-trial 1 ( obj #pick -- quot )
@@ -118,7 +118,7 @@ GENERIC# >can-has-trial 1 ( obj #pick -- quot )
 M: callable >can-has-trial
     drop '[ _ can-has? ] ;
 M: pair >can-has-trial
-    swap first2 dup infer in>> length
+    swap first2 dup inputs
     '[ _ npick _ instance? [ _ can-has? ] [ _ ndrop blub ] if ] ; 
 
 MACRO: can-has-vector-op ( trials #pick #dup -- )
index ce673ba5bb4da2a317347c3763ffb9bb29ec18dc..6cf362c2308a4f278c09e04db1dc48cbf63c7691 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008, 2009 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: math sequences kernel namespaces accessors biassocs compiler.cfg
 compiler.cfg.instructions compiler.cfg.registers compiler.cfg.hats
@@ -33,7 +33,7 @@ IN: compiler.cfg.stacks
 : ds-load ( n -- vregs )
     dup 0 =
     [ drop f ]
-    [ [ <reversed> [ <ds-loc> peek-loc ] map ] [ neg inc-d ] bi ] if ;
+    [ [ iota <reversed> [ <ds-loc> peek-loc ] map ] [ neg inc-d ] bi ] if ;
 
 : ds-store ( vregs -- )
     [
index 0bed759e5286d615932726245ce860e5f772f123..e5fbfa6c40bcbafa674be12d46eb07044682a640 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2009 Slava Pestov.
+! Copyright (C) 2009, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel sequences byte-arrays namespaces accessors classes math
 math.order fry arrays combinators compiler.cfg.registers
@@ -55,7 +55,7 @@ M: insn visit-insn drop ;
     2dup [ length ] bi@ max '[ _ 1 pad-tail ] bi@ [ bitand ] 2map ;
 
 : (uninitialized-locs) ( seq quot -- seq' )
-    [ dup length [ drop 0 = ] pusher [ 2each ] dip ] dip map ; inline
+    [ [ drop 0 = ] pusher [ each-index ] dip ] dip map ; inline
 
 PRIVATE>
 
index cea6527259f146da6bfb0b22251f2b9f28f434d7..ef6794e9fab212dd8c656d3875311df96b73b088 100644 (file)
@@ -380,7 +380,7 @@ M: c-type-name flatten-value-type c-type flatten-value-type ;
     [ [ parameter-offsets nip ] keep ] dip 2reverse-each ; inline
 
 : prepare-unbox-parameters ( parameters -- offsets types indices )
-    [ parameter-offsets nip ] [ ] [ length iota reverse ] tri ;
+    [ parameter-offsets nip ] [ ] [ length iota <reversed> ] tri ;
 
 : unbox-parameters ( offset node -- )
     parameters>> swap
@@ -474,7 +474,7 @@ M: ##alien-indirect generate-insn
 
 TUPLE: callback-context ;
 
-: current-callback ( -- id ) 2 getenv ;
+: current-callback ( -- id ) 2 special-object ;
 
 : wait-to-return ( token -- )
     dup current-callback eq? [
@@ -485,7 +485,7 @@ TUPLE: callback-context ;
 
 : do-callback ( quot token -- )
     init-catchstack
-    [ 2 setenv call ] keep
+    [ 2 set-special-object call ] keep
     wait-to-return ; inline
 
 : callback-return-quot ( ctype -- quot )
index dbe7c864a5a93613e378803f7fef465b8a5a1d41..efdc02cc1fa962fa0285a8f754cd0e5a551a15ca 100644 (file)
@@ -1,10 +1,10 @@
-! Copyright (C) 2007, 2009 Slava Pestov.
+! Copyright (C) 2007, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays byte-arrays byte-vectors generic assocs hashtables
 io.binary kernel kernel.private math namespaces make sequences
 words quotations strings alien.accessors alien.strings layouts
 system combinators math.bitwise math.order generalizations
-accessors growable fry compiler.constants ;
+accessors growable fry compiler.constants memoize ;
 IN: compiler.codegen.fixup
 
 ! Owner
@@ -52,8 +52,11 @@ SYMBOL: relocation-table
 : rel-fixup ( class type -- )
     swap compiled-offset add-relocation-entry ;
 
+! Caching common symbol names reduces image size a bit
+MEMO: cached-string>symbol ( symbol -- obj ) string>symbol ;
+
 : add-dlsym-parameters ( symbol dll -- )
-    [ string>symbol add-parameter ] [ add-parameter ] bi* ;
+    [ cached-string>symbol add-parameter ] [ add-parameter ] bi* ;
 
 : rel-dlsym ( name dll class -- )
     [ add-dlsym-parameters ] dip rt-dlsym rel-fixup ;
index cb39c0dd162e48350a658864747aaf30639e234d..4cfbe8f6fa03bc7de20c0818cb42ad08014d10fe 100644 (file)
@@ -164,7 +164,7 @@ FUNCTION: void ffi_test_20 double x1, double x2, double x3,
     { int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int int }
     alien-invoke gc 3 ;
 
-[ 861 3 ] [ 42 [ ] each ffi_test_31 ] unit-test
+[ 861 3 ] [ 42 [ ] each-integer ffi_test_31 ] unit-test
 
 : ffi_test_31_point_5 ( a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a -- result )
     float
@@ -172,7 +172,7 @@ FUNCTION: void ffi_test_20 double x1, double x2, double x3,
     { float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float float }
     alien-invoke ;
 
-[ 861.0 ] [ 42 [ >float ] each ffi_test_31_point_5 ] unit-test
+[ 861.0 ] [ 42 [ >float ] each-integer ffi_test_31_point_5 ] unit-test
 
 FUNCTION: longlong ffi_test_21 long x long y ;
 
@@ -316,7 +316,7 @@ FUNCTION: ulonglong ffi_test_38 ( ulonglong x, ulonglong y ) ;
 
 : callback-1 ( -- callback ) void { } "cdecl" [ ] alien-callback ;
 
-[ 0 1 ] [ [ callback-1 ] infer [ in>> ] [ out>> ] bi ] unit-test
+[ 0 1 ] [ [ callback-1 ] infer [ in>> length ] [ out>> length ] bi ] unit-test
 
 [ t ] [ callback-1 alien? ] unit-test
 
@@ -377,9 +377,7 @@ FUNCTION: ulonglong ffi_test_38 ( ulonglong x, ulonglong y ) ;
 [ f ] [ namespace global eq? ] unit-test
 
 : callback-8 ( -- callback )
-    void { } "cdecl" [
-        [ continue ] callcc0
-    ] alien-callback ;
+    void { } "cdecl" [ [ ] in-thread yield ] alien-callback ;
 
 [ ] [ callback-8 callback_test_1 ] unit-test
 
index eba65805746b39c2b1466639b1935ff4013f8c4a..cff685eaf6e7066d059a0704561a15c1c1ed7c93 100644 (file)
@@ -116,7 +116,7 @@ unit-test
     1 1.0 2.5 try-breaking-dispatch "bye" = [ 3.5 = ] dip and ;
 
 [ t ] [
-    10000000 [ drop try-breaking-dispatch-2 ] all?
+    10000000 [ drop try-breaking-dispatch-2 ] all-integers?
 ] unit-test
 
 ! Regression
@@ -314,7 +314,7 @@ cell 4 = [
 
 ! Bug with ##return node construction
 : return-recursive-bug ( nodes -- ? )
-    { fixnum } declare [
+    { fixnum } declare iota [
         dup 3 bitand 1 = [ drop t ] [
             dup 3 bitand 2 = [
                 return-recursive-bug
index 14b347008cb3f7524850ba4c68da4b8812bca741..632a560c0df9834f7a27f854678f0115be408d73 100644 (file)
@@ -1,5 +1,5 @@
 USING: compiler.units compiler kernel kernel.private memory math
-math.private tools.test math.floats.private ;
+math.private tools.test math.floats.private math.order fry ;
 IN: compiler.tests.float
 
 [ 5.0 ] [ [ 5.0 ] compile-call gc gc gc ] unit-test
@@ -84,11 +84,6 @@ IN: compiler.tests.float
 
 [ 315 315.0 ] [ 313 [ 2 fixnum+fast dup fixnum>float ] compile-call ] unit-test
 
-[ 17.5 ] [ -11.3 17.5 [ float-max ] compile-call ] unit-test
-[ 17.5 ] [ 17.5 -11.3 [ float-max ] compile-call ] unit-test
-[ -11.3 ] [ -11.3 17.5 [ float-min ] compile-call ] unit-test
-[ -11.3 ] [ 17.5 -11.3 [ float-min ] compile-call ] unit-test
-
 [ t ] [ 0/0. 0/0. [ float-unordered? ] compile-call ] unit-test
 [ t ] [ 0/0. 1.0 [ float-unordered? ] compile-call ] unit-test
 [ t ] [ 1.0 0/0. [ float-unordered? ] compile-call ] unit-test
@@ -100,3 +95,23 @@ IN: compiler.tests.float
 [ 1 ] [ 1.0 0/0. [ float-unordered? [ 1 ] [ 2 ] if ] compile-call ] unit-test
 [ 2 ] [ 3.0 1.0 [ float-unordered? [ 1 ] [ 2 ] if ] compile-call ] unit-test
 [ 2 ] [ 1.0 3.0 [ float-unordered? [ 1 ] [ 2 ] if ] compile-call ] unit-test
+
+! Ensure that float-min and min, and float-max and max, have
+! consistent behavior with respect to NaNs
+
+: two-floats ( a b -- a b ) { float float } declare ; inline
+
+[ -11.3 ] [ -11.3 17.5 [ two-floats min ] compile-call ] unit-test
+[ -11.3 ] [ 17.5 -11.3 [ two-floats min ] compile-call ] unit-test
+[ 17.5 ] [ -11.3 17.5 [ two-floats max ] compile-call ] unit-test
+[ 17.5 ] [ 17.5 -11.3 [ two-floats max ] compile-call ] unit-test
+
+: check-compiled-binary-op ( a b word -- )
+    [ '[ [ [ two-floats _ execute ] compile-call ] call( a b -- c ) ] ]
+    [ '[ _ execute ] ]
+    bi 2bi fp-bitwise= ; inline
+
+[ t ] [ 0/0. 3.0 \ min check-compiled-binary-op ] unit-test
+[ t ] [ 3.0 0/0. \ min check-compiled-binary-op ] unit-test
+[ t ] [ 0/0. 3.0 \ max check-compiled-binary-op ] unit-test
+[ t ] [ 3.0 0/0. \ max check-compiled-binary-op ] unit-test
index 7fe5e2b60110e9ab2060093e3ad8d4d5106d29fb..1c066f26a336c866e419ddf1bfdba4a6ba0a9d40 100644 (file)
@@ -54,8 +54,8 @@ IN: compiler.tests.intrinsics
 [ HEX: 123456 ] [ 1 [ "a\u123456c" string-nth ] compile-call ] unit-test
 [ HEX: 123456 ] [ [ 1 "a\u123456c" string-nth ] compile-call ] unit-test
 
-[ ] [ [ 0 getenv ] compile-call drop ] unit-test
-[ ] [ 1 getenv [ 1 setenv ] compile-call ] unit-test
+[ ] [ [ 0 special-object ] compile-call drop ] unit-test
+[ ] [ 1 special-object [ 1 set-special-object ] compile-call ] unit-test
 
 [ ] [ 1 [ drop ] compile-call ] unit-test
 [ ] [ [ 1 drop ] compile-call ] unit-test
@@ -337,7 +337,7 @@ ERROR: bug-in-fixnum* x y a b ;
 
 [ ] [
     10000 [
-        5 random [ drop 32 random-bits ] map product >bignum
+        5 random iota [ drop 32 random-bits ] map product >bignum
         dup [ bignum>fixnum ] keep compiled-bignum>fixnum =
         [ drop ] [ "Oops" throw ] if
     ] times
index 0831d6e8ddc91b7aeb2d7c768b514237123cf5af..865cd639a356583633aa93018d5eac11356a63b2 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 generic.single shuffle ;
+compiler definitions generic.single shuffle math.order ;
 IN: compiler.tests.optimizer
 
 GENERIC: xyz ( obj -- obj )
@@ -90,7 +90,7 @@ TUPLE: pred-test ;
 : double-label-2 ( a -- b )
     dup array? [ ] [ ] if 0 t double-label-1 ;
 
-[ 0 ] [ 10 double-label-2 ] unit-test
+[ 0 ] [ 10 iota double-label-2 ] unit-test
 
 ! regression
 GENERIC: void-generic ( obj -- * )
@@ -208,7 +208,7 @@ USE: binary-search.private
     ] if ; inline recursive
 
 [ 10 ] [
-    10 20 >vector <flat-slice>
+    10 20 iota <flat-slice>
     [ [ - ] swap old-binsearch ] compile-call 2nip
 ] unit-test
 
@@ -349,7 +349,7 @@ TUPLE: some-tuple x ;
 [ 5 ] [ { 1 2 { 3 { 4 5 } } } deep-find-test ] unit-test
 [ f ] [ { 1 2 { 3 { 4 } } } deep-find-test ] unit-test
 
-[ B{ 0 1 2 3 4 5 6 7 } ] [ [ 8 [ ] B{ } map-as ] compile-call ] unit-test
+[ B{ 0 1 2 3 4 5 6 7 } ] [ [ 8 iota [ ] B{ } map-as ] compile-call ] unit-test
 
 [ 0 ] [ 1234 [ { fixnum } declare -64 shift ] compile-call ] unit-test
 
@@ -445,5 +445,17 @@ M: object bad-dispatch-position-test* ;
 
 [ 1024 bignum ] [ 10 [ 1 >bignum swap >fixnum shift ] compile-call dup class ] unit-test
 
-! Not sure if I want to fix this...
-! [ t [ [ f ] [ 3 ] if >fixnum ] compile-call ] [ no-method? ] must-fail-with
+TUPLE: grid-mesh-tuple { length read-only } { step read-only } ;
+
+: grid-mesh-test-case ( -- vertices )
+    1.0 1.0 { 2 } first /f [ /i 1 + ] keep grid-mesh-tuple boa
+    1 f <array>
+    [
+        [ drop length>> >fixnum 2 min ] 2keep
+        [
+            [ step>> 1 * ] dip
+            0 swap set-nth-unsafe
+        ] 2curry times
+    ] keep ;
+
+[ { 0.5 } ] [ grid-mesh-test-case ] unit-test
index db960863717aa28fffa3234d874ec2860f3da710..05f9092ee130fe95ee6e3f72e607fabc95beaed5 100644 (file)
@@ -339,28 +339,23 @@ cell-bits 32 = [
 ] unit-test
 
 [ t ] [
-    [ { fixnum } declare length [ drop ] each-integer ]
+    [ { fixnum } declare iota [ drop ] each ]
     { < <-integer-fixnum +-integer-fixnum + } inlined?
 ] unit-test
 
 [ t ] [
-    [ { fixnum } declare [ drop ] each ]
-    { < <-integer-fixnum +-integer-fixnum + } inlined?
-] unit-test
-
-[ t ] [
-    [ { fixnum } declare 0 [ + ] reduce ]
+    [ { fixnum } declare iota 0 [ + ] reduce ]
     { < <-integer-fixnum nth-unsafe } inlined?
 ] unit-test
 
 [ f ] [
-    [ { fixnum } declare 0 [ + ] reduce ]
+    [ { fixnum } declare iota 0 [ + ] reduce ]
     \ +-integer-fixnum inlined?
 ] unit-test
 
 [ f ] [
     [
-        { integer } declare [ ] map
+        { integer } declare iota [ ] map
     ] \ >fixnum inlined?
 ] unit-test
 
@@ -403,7 +398,7 @@ cell-bits 32 = [
 
 [ t ] [
     [
-        { integer } declare [ 0 >= ] map
+        { integer } declare iota [ 0 >= ] map
     ] { >= fixnum>= } inlined?
 ] unit-test
 
index 6cef45a9c91767ab64577697f9e6f51bf9d61c52..d1fdf6359a19322c472b5422b4c7365105487a2c 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: sequences namespaces kernel accessors assocs sets fry
 arrays combinators columns stack-checker.backend
@@ -36,7 +36,7 @@ M: #branch remove-dead-code*
 
 : drop-indexed-values ( values indices -- node )
     [ drop filter-live ] [ swap nths ] 2bi
-    [ make-values ] keep
+    [ length make-values ] keep
     [ drop ] [ zip ] 2bi
     #data-shuffle ;
 
index 482d370947bb626a601c217fc42689edd9ee5f8b..0c9464374a6edae178674a1494a32b523991fc83 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays assocs sequences kernel locals fry
 combinators stack-checker.backend
@@ -24,7 +24,7 @@ M: #call-recursive compute-live-values*
 
 :: drop-dead-inputs ( inputs outputs -- #shuffle )
     inputs filter-live
-    outputs inputs filter-corresponding make-values
+    outputs inputs filter-corresponding length make-values
     outputs
     inputs
     drop-values ;
@@ -39,7 +39,7 @@ M: #enter-recursive remove-dead-code*
     2bi ;
 
 :: (drop-call-recursive-outputs) ( inputs outputs -- #shuffle )
-    inputs outputs filter-corresponding make-values :> new-live-outputs
+    inputs outputs filter-corresponding length make-values :> new-live-outputs
     outputs filter-live :> live-outputs
     new-live-outputs
     live-outputs
index bb0025caf48e306a8fc36d3feaa0922aaf35e425..77523568d70f6ecc2f6838e515e392359218ef2d 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel accessors words assocs sequences arrays namespaces
 fry locals definitions classes classes.algebra generic
@@ -67,7 +67,7 @@ M: #alien-node compute-live-values* nip look-at-inputs ;
     filter-corresponding zip #data-shuffle ; inline
 
 :: drop-dead-values ( outputs -- #shuffle )
-    outputs make-values :> new-outputs
+    outputs length make-values :> new-outputs
     outputs filter-live :> live-outputs
     new-outputs
     live-outputs
index 62fc9cdb82d12038b249f8d53e1cc944bc63d895..47ec13e809b4eb9f3084c6bb145b4dafc76f0e31 100644 (file)
@@ -64,7 +64,7 @@ TUPLE: shuffle-node { effect effect } ;
 M: shuffle-node pprint* effect>> effect>string text ;
  
 : (shuffle-effect) ( in out #shuffle -- effect )
-    mapping>> '[ _ at ] map <effect> ;
+    mapping>> '[ _ at ] map [ >array ] bi@ <effect> ;
 
 : shuffle-effect ( #shuffle -- effect )
     [ in-d>> ] [ out-d>> ] [ ] tri (shuffle-effect) ;
index c26f3ddefc02a26a7f779ed1c69aea5829d04649..bb32e6e23b1a229cee60d336cacfcad359547a88 100644 (file)
@@ -1,4 +1,4 @@
-USING: kernel tools.test namespaces sequences
+USING: kernel tools.test namespaces sequences math
 compiler.tree.escape-analysis.recursive
 compiler.tree.escape-analysis.allocations ;
 IN: compiler.tree.escape-analysis.recursive.tests
@@ -6,7 +6,7 @@ IN: compiler.tree.escape-analysis.recursive.tests
 H{ } clone allocations set
 <escaping-values> escaping-values set
 
-[ ] [ 8 [ introduce-value ] each ] unit-test
+[ ] [ 8 [ introduce-value ] each-integer ] unit-test
 
 [ ] [ { 1 2 } 3 record-allocation ] unit-test
 
index 42e7f421bfc04073ae014c6abd8d45aa6e931840..7366a83ee176f34df1920eb20c02556d89b7b6ba 100644 (file)
@@ -73,7 +73,7 @@ TUPLE: declared-fixnum { x fixnum } ;
 
 [ t ] [
     [
-        { fixnum } declare 0 swap
+        { fixnum } declare iota 0 swap
         [
             drop 615949 * 797807 + 20 2^ rem dup 19 2^ -
         ] map
@@ -94,7 +94,7 @@ TUPLE: declared-fixnum { x fixnum } ;
 
 [ t ] [
     [
-        { integer } declare [ 256 mod ] map
+        { integer } declare iota [ 256 mod ] map
     ] { mod fixnum-mod } inlined?
 ] unit-test
 
index fcfa42c70ba56388420cc896a217edd4c753c897..7912fce1f68d2c59256aef72c2b963e3da829467 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: fry namespaces sequences math math.order accessors kernel arrays
 combinators assocs
@@ -75,10 +75,9 @@ M: #phi normalize*
     ] with-variable ;
 
 M: #recursive normalize*
-    dup label>> introductions>>
-    [ drop [ child>> first ] [ in-d>> ] bi >>in-d drop ]
-    [ make-values '[ _ (normalize) ] change-child ]
-    2bi ;
+    [ [ child>> first ] [ in-d>> ] bi >>in-d drop ]
+    [ dup label>> introductions>> make-values '[ _ (normalize) ] change-child ]
+    bi ;
 
 M: #enter-recursive normalize*
     [ introduction-stack get prepend ] change-out-d
index ff4886d1c795ad0ecc2fb7d7dbe0d246f9474871..439b428784e3cb92c3d02bbb42c6d2f506bf6434 100644 (file)
@@ -1,8 +1,8 @@
-! Copyright (C) 2009 Slava Pestov, Daniel Ehrenberg.
+! Copyright (C) 2009, 2010 Slava Pestov, Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors combinators combinators.private effects fry
-kernel kernel.private make sequences continuations quotations
-words math stack-checker combinators.short-circuit
+USING: accessors arrays combinators combinators.private effects
+fry kernel kernel.private make sequences continuations
+quotations words math stack-checker combinators.short-circuit
 stack-checker.transforms compiler.tree.propagation.info
 compiler.tree.propagation.inlining compiler.units ;
 IN: compiler.tree.propagation.call-effect
@@ -43,7 +43,7 @@ M: +unknown+ curry-effect ;
 M: effect curry-effect
     [ in>> length ] [ out>> length ] [ terminated?>> ] tri
     pick 0 = [ [ 1 + ] dip ] [ [ 1 - ] 2dip ] if
-    effect boa ;
+    [ [ "x" <array> ] bi@ ] dip effect boa ;
 
 M: curry cached-effect
     quot>> cached-effect curry-effect ;
index 826131ab612525013b49a2c37c14488d238bbafe..446aad89e5cf224dab4e3e95cc260841c3b19946 100644 (file)
@@ -4,13 +4,6 @@ IN: compiler.tree.propagation.info.tests
 
 [ f ] [ 0.0 -0.0 eql? ] unit-test
 
-[ t ] [
-    number <class-info>
-    sequence <class-info>
-    value-info-intersect
-    class>> integer class=
-] unit-test
-
 [ t t ] [
     0 10 [a,b] <interval-info>
     5 20 [a,b] <interval-info>
index 0fde7ffa86d1b154389be7b923f61f93c5221c6c..6aacbc57daaa4a5168f5918ad52368e6c9588f72 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008, 2009 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel effects accessors math math.private
 math.integers.private math.floats.private math.partial-dispatch
@@ -23,11 +23,10 @@ IN: compiler.tree.propagation.known-words
 { + - * / }
 [ { number number } "input-classes" set-word-prop ] each
 
-{ /f < > <= >= u< u> u<= u>= }
+{ /f /i mod < > <= >= u< u> u<= u>= }
 [ { real real } "input-classes" set-word-prop ] each
 
-{ /i mod /mod }
-[ { rational rational } "input-classes" set-word-prop ] each
+\ /mod { rational rational } "input-classes" set-word-prop
 
 { bitand bitor bitxor bitnot shift }
 [ { integer integer } "input-classes" set-word-prop ] each
index c7e02aef4c59fa99a6151ce368bf490e23086f9a..2c80b87e76096ec0d79143946baaba672f9fc72a 100644 (file)
@@ -1,14 +1,13 @@
 USING: kernel compiler.tree.builder compiler.tree
 compiler.tree.propagation compiler.tree.recursive
-compiler.tree.normalization tools.test math math.order
-accessors sequences arrays kernel.private vectors
-alien.accessors alien.c-types sequences.private
-byte-arrays classes.algebra classes.tuple.private
-math.functions math.private strings layouts
-compiler.tree.propagation.info compiler.tree.def-use
-compiler.tree.debugger compiler.tree.checker
-slots.private words hashtables classes assocs locals
-specialized-arrays system sorting math.libm
+compiler.tree.normalization tools.test math math.order accessors
+sequences arrays kernel.private vectors alien.accessors
+alien.c-types sequences.private byte-arrays classes.algebra
+classes.tuple.private math.functions math.private strings
+layouts compiler.tree.propagation.info compiler.tree.def-use
+compiler.tree.debugger compiler.tree.checker slots.private words
+hashtables classes assocs locals specialized-arrays system
+sorting math.libm math.floats.private math.integers.private
 math.intervals quotations effects alien alien.data ;
 FROM: math => float ;
 SPECIALIZED-ARRAY: double
@@ -91,6 +90,8 @@ IN: compiler.tree.propagation.tests
 
 [ float ] [ [ { float float } declare mod ] final-math-class ] unit-test
 
+[ V{ integer float } ] [ [ { float float } declare [ /i ] keep ] final-classes ] unit-test
+
 [ V{ fixnum } ] [ [ 255 bitand ] final-classes ] unit-test
 
 [ V{ fixnum } ] [
@@ -405,14 +406,6 @@ IN: compiler.tree.propagation.tests
     ] final-literals
 ] unit-test
 
-[ V{ 27 } ] [
-    [
-        dup number? over sequence? and [
-            dup 10 < over 8 <= not and [ 3 * ] [ "A" throw ] if
-        ] [ "B" throw ] if
-    ] final-literals
-] unit-test
-
 [ V{ string string } ] [
     [
         2dup [ dup string? [ "Oops" throw ] unless ] bi@ 2drop
@@ -680,7 +673,7 @@ M: array iterate first t ; inline
 ] unit-test
 
 [ V{ fixnum } ] [
-    [ { fixnum fixnum } declare [ nth-unsafe ] curry call ] final-classes
+    [ { fixnum fixnum } declare iota [ nth-unsafe ] curry call ] final-classes
 ] unit-test
 
 [ V{ f } ] [
@@ -942,3 +935,14 @@ M: tuple-with-read-only-slot clone
 ! Could be bignum not integer but who cares
 [ V{ integer } ] [ [ 10 >bignum bitand ] final-classes ] unit-test
 
+[ t ] [ [ { fixnum fixnum } declare min ] { min } inlined? ] unit-test
+[ f ] [ [ { fixnum fixnum } declare min ] { fixnum-min } inlined? ] unit-test
+
+[ t ] [ [ { float float } declare min ] { min } inlined? ] unit-test
+[ f ] [ [ { float float } declare min ] { float-min } inlined? ] unit-test
+
+[ t ] [ [ { fixnum fixnum } declare max ] { max } inlined? ] unit-test
+[ f ] [ [ { fixnum fixnum } declare max ] { fixnum-max } inlined? ] unit-test
+
+[ t ] [ [ { float float } declare max ] { max } inlined? ] unit-test
+[ f ] [ [ { float float } declare max ] { float-max } inlined? ] unit-test
index 9475b5df4aaa9896a4788fee69dcd7dbe492280d..225f10d342ef55b729d37b70cf9b0d486aed2e04 100644 (file)
@@ -80,7 +80,7 @@ M: #declare propagate-before
 : (fold-call) ( #call word -- info )
     [ [ out-d>> ] [ in-d>> [ value-info literal>> ] map ] bi ] [ '[ _ execute ] ] bi*
     '[ _ _ with-datastack [ <literal-info> ] map nip ]
-    [ drop [ object-info ] replicate ]
+    [ drop length [ object-info ] replicate ]
     recover ;
 
 : fold-call ( #call word -- )
index 809b51c6ef64128acb1e0d8360acc1f568bafc16..63c0aea13ebf931dd8e197be625e6dd0c5f6f434 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008, 2009 Slava Pestov, Daniel Ehrenberg.
+! Copyright (C) 2008, 2010 Slava Pestov, Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: alien.c-types kernel sequences words fry generic accessors
 classes.tuple classes classes.algebra definitions
@@ -132,26 +132,6 @@ IN: compiler.tree.propagation.transforms
     ] "custom-inlining" set-word-prop
 ] each
 
-! Integrate this with generic arithmetic optimization instead?
-: both-inputs? ( #call class -- ? )
-    [ in-d>> first2 ] dip '[ value-info class>> _ class<= ] both? ;
-
-\ min [
-    {
-        { [ dup fixnum both-inputs? ] [ [ fixnum-min ] ] }
-        { [ dup float both-inputs? ] [ [ float-min ] ] }
-        [ f ]
-    } cond nip
-] "custom-inlining" set-word-prop
-
-\ max [
-    {
-        { [ dup fixnum both-inputs? ] [ [ fixnum-max ] ] }
-        { [ dup float both-inputs? ] [ [ float-max ] ] }
-        [ f ]
-    } cond nip
-] "custom-inlining" set-word-prop
-
 ! Generate more efficient code for common idiom
 \ clone [
     in-d>> first value-info literal>> {
@@ -209,7 +189,7 @@ ERROR: bad-partial-eval quot word ;
 \ index [
     dup sequence? [
         dup length 4 >= [
-            dup length zip >hashtable '[ _ at ]
+            dup length iota zip >hashtable '[ _ at ]
         ] [ drop f ] if
     ] [ drop f ] if
 ] 1 define-partial-eval
@@ -248,7 +228,7 @@ CONSTANT: lookup-table-at-max 256
     } 1&& ;
 
 : lookup-table-seq ( assoc -- table )
-    [ keys supremum 1 + ] keep '[ _ at ] { } map-as ;
+    [ keys supremum 1 + iota ] keep '[ _ at ] { } map-as ;
 
 : lookup-table-quot ( seq -- newquot )
     lookup-table-seq
index 567c435c2e05486e97378c1d7852c149d69e58e2..d96946d53dea21ae96bad72e81a6ccbe0da7cfd6 100644 (file)
@@ -36,7 +36,7 @@ CONSTANT: clen-shuffle { 16 17 18 0 8 7 9 6 10 5 11 4 12 3 13 2 14 1 15 }
     5 bitstream bs:read 1 +
     4 bitstream bs:read 4 + clen-shuffle swap head 
 
-    dup length iota [ 3 bitstream bs:read ] replicate
+    dup length [ 3 bitstream bs:read ] replicate
     get-table
     bitstream swap <huffman-decoder>
     [ 2dup + ] dip swap :> k!
@@ -64,13 +64,13 @@ CONSTANT: clen-shuffle { 16 17 18 0 8 7 9 6 10 5 11 4 12 3 13 2 14 1 15 }
 
 MEMO: static-huffman-tables ( -- obj )
     [
-        0 143 [a,b] [ 8 ] replicate
-        144 255 [a,b] [ 9 ] replicate append
-        256 279 [a,b] [ 7 ] replicate append
-        280 287 [a,b] [ 8 ] replicate append
+        0 143 [a,b] length [ 8 ] replicate
+        144 255 [a,b] length [ 9 ] replicate append
+        256 279 [a,b] length [ 7 ] replicate append
+        280 287 [a,b] length [ 8 ] replicate append
     ] append-outputs
-    0 31 [a,b] [ 5 ] replicate 2array
-    [ [ length>> [0,b) ] [ ] bi get-table ] map ;
+    0 31 [a,b] length [ 5 ] replicate 2array
+    [ [ length>> iota ] [ ] bi get-table ] map ;
 
 CONSTANT: length-table
     {
index d3f3229171bb279522c8d01d0e6c869d62a00077..f33f6513a97330472ef301dd3cac8601419f37bf 100644 (file)
@@ -17,12 +17,12 @@ IN: concurrency.combinators.tests
 [ error>> "Even" = ] must-fail-with\r
 \r
 [ V{ 0 3 6 9 } ]\r
-[ 10 [ 3 mod zero? ] parallel-filter ] unit-test\r
+[ 10 iota [ 3 mod zero? ] parallel-filter ] unit-test\r
 \r
 [ 10 ]\r
 [\r
     V{ } clone\r
-    10 over [ push ] curry parallel-each\r
+    10 iota over [ push ] curry parallel-each\r
     length\r
 ] unit-test\r
 \r
@@ -41,7 +41,7 @@ IN: concurrency.combinators.tests
 [ 20 ]\r
 [\r
     V{ } clone\r
-    10 10 pick [ [ push ] [ push ] bi ] curry 2parallel-each\r
+    10 iota 10 iota pick [ [ push ] [ push ] bi ] curry 2parallel-each\r
     length\r
 ] unit-test\r
 \r
index ba2b404a06fd396d8c3ad6cd69c76601c9bc8003..e3c212bd482648af6f250a1bbd405e13112a37fe 100644 (file)
@@ -60,11 +60,11 @@ CONSTANT: ctx-reg 16
     1 1 callback-frame-size neg STWU\r
     0 1 callback-frame-size lr-save + STW\r
 \r
-    nv-int-regs [ cells save-int ] each-index\r
+    nv-int-regs [ 4 * save-int ] each-index\r
     nv-fp-regs [ 8 * 80 + save-fp ] each-index\r
     nv-vec-regs [ 16 * 224 + save-vec ] each-index\r
 \r
-    0 vm-reg LOAD32 rt-vm rc-absolute-ppc-2/2 jit-rel\r
+    0 vm-reg LOAD32 rc-absolute-ppc-2/2 rt-vm jit-rel\r
 \r
     0 2 LOAD32 rc-absolute-ppc-2/2 rt-xt jit-rel\r
     2 MTLR\r
@@ -72,7 +72,7 @@ CONSTANT: ctx-reg 16
 \r
     nv-vec-regs [ 16 * 224 + restore-vec ] each-index\r
     nv-fp-regs [ 8 * 80 + restore-fp ] each-index\r
-    nv-int-regs [ cells restore-int ] each-index\r
+    nv-int-regs [ 4 * restore-int ] each-index\r
 \r
     0 1 callback-frame-size lr-save + LWZ\r
     1 1 0 LWZ\r
@@ -88,7 +88,7 @@ CONSTANT: ctx-reg 16
 \r
 : jit-save-context ( -- )\r
     jit-load-context\r
-    1 2 context-callstack-top-offset STW\r
+    1 ctx-reg context-callstack-top-offset STW\r
     ds-reg ctx-reg context-datastack-offset STW\r
     rs-reg ctx-reg context-retainstack-offset STW ;\r
 \r
@@ -109,12 +109,12 @@ CONSTANT: ctx-reg 16
 ] jit-profiling jit-define\r
 \r
 [\r
-    0 3 LOAD32 rc-absolute-ppc-2/2 rt-this jit-rel\r
+    0 2 LOAD32 rc-absolute-ppc-2/2 rt-this jit-rel\r
     0 MFLR\r
     1 1 stack-frame SUBI\r
-    3 1 xt-save STW\r
-    stack-frame 3 LI\r
-    3 1 next-save STW\r
+    2 1 xt-save STW\r
+    stack-frame 2 LI\r
+    2 1 next-save STW\r
     0 1 lr-save stack-frame + STW\r
 ] jit-prolog jit-define\r
 \r
@@ -358,11 +358,15 @@ CONSTANT: ctx-reg 16
     ! Unwind stack frames\r
     1 4 MR\r
 \r
+    ! Load VM pointer into vm-reg, since we're entering from\r
+    ! C code\r
+    0 vm-reg LOAD32 0 rc-absolute-ppc-2/2 jit-vm\r
+\r
     ! Load ds and rs registers\r
     jit-restore-context\r
 \r
     ! We have changed the stack; load return address again\r
-    0 1 stack-frame lr-save + LWZ\r
+    0 1 lr-save LWZ\r
     0 MTLR\r
 \r
     ! Call quotation\r
@@ -384,7 +388,7 @@ CONSTANT: ctx-reg 16
     5 6 callstack-length-offset LWZ\r
     5 5 tag-bits get SRAWI\r
     ! Compute new stack pointer -- 'dst' for memcpy\r
-    3 3 5 SUBF\r
+    3 5 3 SUBF\r
     ! Install new stack pointer\r
     1 3 MR\r
     ! Call memcpy; arguments are now in the correct registers\r
@@ -394,7 +398,7 @@ CONSTANT: ctx-reg 16
     BLRL\r
     1 1 0 LWZ\r
     ! Return with new callstack\r
-    0 1 lr-save stack-frame + LWZ\r
+    0 1 lr-save LWZ\r
     0 MTLR\r
     BLR\r
 ] \ set-callstack define-sub-primitive\r
@@ -402,7 +406,7 @@ CONSTANT: ctx-reg 16
 [\r
     jit-save-context\r
     4 vm-reg MR\r
-    2 0 LOAD32 "lazy_jit_compile" f rc-absolute-ppc-2/2 jit-dlsym\r
+    0 2 LOAD32 "lazy_jit_compile" f rc-absolute-ppc-2/2 jit-dlsym\r
     2 MTLR\r
     BLRL\r
     5 3 quot-xt-offset LWZ\r
index d641ed7039dd35b420b798b7c36dbcd3e1f517a6..48423279737d89141775c1344c9950b1856acd01 100644 (file)
@@ -83,8 +83,8 @@ HOOK: reserved-area-size os ( -- n )
 ! The start of the stack frame contains the size of this frame
 ! as well as the currently executing XT
 : factor-area-size ( -- n ) 2 cells ; foldable
-: next-save ( n -- i ) cell - ;
-: xt-save ( n -- i ) 2 cells - ;
+: next-save ( n -- i ) cell - ; foldable
+: xt-save ( n -- i ) 2 cells - ; foldable
 
 ! Next, we have the spill area as well as the FFI parameter area.
 ! It is safe for them to overlap, since basic blocks with FFI calls
@@ -126,7 +126,7 @@ M: ppc stack-frame-size ( stack-frame -- i )
 M: ppc %call ( word -- ) 0 BL rc-relative-ppc-3 rel-word-pic ;
 
 M: ppc %jump ( word -- )
-    0 6 LOAD32 8 rc-absolute-ppc-2/2 rel-here
+    0 6 LOAD32 4 rc-absolute-ppc-2/2 rel-here
     0 B rc-relative-ppc-3 rel-word-pic-tail ;
 
 M: ppc %jump-label ( label -- ) B ;
@@ -134,7 +134,7 @@ M: ppc %return ( -- ) BLR ;
 
 M:: ppc %dispatch ( src temp -- )
     0 temp LOAD32
-    4 cells rc-absolute-ppc-2/2 rel-here
+    3 cells rc-absolute-ppc-2/2 rel-here
     temp temp src LWZX
     temp MTCTR
     BCTR ;
@@ -564,14 +564,16 @@ M:: ppc %compare-float-unordered-branch ( label src1 src2 cc -- )
         { stack-params [ [ 0 1 ] dip LWZ [ 0 1 ] dip param@ STW ] }
     } case ;
 
-: next-param@ ( n -- x ) param@ stack-frame get total-size>> + ;
+: next-param@ ( n -- reg x )
+    2 1 stack-frame get total-size>> LWZ
+    [ 2 ] dip param@ ;
 
 : store-to-frame ( src n rep -- )
     {
         { int-rep [ [ 1 ] dip STW ] }
         { float-rep [ [ 1 ] dip STFS ] }
         { double-rep [ [ 1 ] dip STFD ] }
-        { stack-params [ [ [ 0 ] dip next-param@ LWZ 0 1 ] dip STW ] }
+        { stack-params [ [ [ 0 ] dip next-param@ LWZ 0 1 ] dip STW ] }
     } case ;
 
 M: ppc %spill ( src rep dst -- )
@@ -679,10 +681,15 @@ M: ppc %box-large-struct ( n c-type -- )
     ! Call the function
     "from_value_struct" f %alien-invoke ;
 
+M:: ppc %restore-context ( temp1 temp2 -- )
+    temp1 "ctx" %load-vm-field-addr
+    temp1 temp1 0 LWZ
+    temp2 1 stack-frame get total-size>> ADDI
+    temp2 temp1 "callstack-bottom" context-field-offset STW
+    ds-reg temp1 8 LWZ
+    rs-reg temp1 12 LWZ ;
+
 M:: ppc %save-context ( temp1 temp2 -- )
-    #! Save Factor stack pointers in case the C code calls a
-    #! callback which does a GC, which must reliably trace
-    #! all roots.
     temp1 "ctx" %load-vm-field-addr
     temp1 temp1 0 LWZ
     1 temp1 0 STW
@@ -693,13 +700,18 @@ M: ppc %alien-invoke ( symbol dll -- )
     [ 11 ] 2dip %alien-global 11 MTLR BLRL ;
 
 M: ppc %alien-callback ( quot -- )
+    3 4 %restore-context
     3 swap %load-reference
-    4 %load-vm-addr
-    "c_to_factor" f %alien-invoke ;
+    4 3 quot-xt-offset LWZ
+    4 MTLR
+    BLRL
+    3 4 %save-context ;
 
 M: ppc %prepare-alien-indirect ( -- )
-    3 %load-vm-addr
-    "from_alien" f %alien-invoke
+    3 ds-reg 0 LWZ
+    ds-reg ds-reg 4 SUBI
+    4 %load-vm-addr
+    "pinned_alien_offset" f %alien-invoke
     16 3 MR ;
 
 M: ppc %alien-indirect ( -- )
@@ -753,9 +765,7 @@ M: ppc %box-small-struct ( c-type -- )
     3 3 0 LWZ ;
 
 M: ppc %nest-stacks ( -- )
-    ! Save current frame. See comment in vm/contexts.hpp
-    3 1 stack-frame get total-size>> 2 cells - ADDI
-    4 %load-vm-addr
+    3 %load-vm-addr
     "nest_stacks" f %alien-invoke ;
 
 M: ppc %unnest-stacks ( -- )
@@ -763,7 +773,6 @@ M: ppc %unnest-stacks ( -- )
     "unnest_stacks" f %alien-invoke ;
 
 M: ppc %unbox-small-struct ( size -- )
-    #! Alien must be in EAX.
     heap-size cell align cell /i {
         { 1 [ %unbox-struct-1 ] }
         { 2 [ %unbox-struct-2 ] }
index 3c324ce95dd5bbfa31f91dad791339e5d5daec4a..74943a94bb99fe09b899e60a12220a7113d05528 100644 (file)
@@ -89,6 +89,10 @@ IN: bootstrap.x86
     ! Unwind stack frames
     RSP arg2 MOV
 
+    ! Load VM pointer into vm-reg, since we're entering from
+    ! C code
+    vm-reg 0 MOV 0 rc-absolute-cell jit-vm
+
     ! Load ds and rs registers
     jit-restore-context
 
index bd523b38e6d81a887ab9f3db2ce5e9653b50e0c3..f26729f8eae2a955293ce661752126281d87501c 100644 (file)
@@ -100,10 +100,10 @@ M: object execute-statement* ( statement type -- )
     t >>bound? drop ;
 
 : sql-row ( result-set -- seq )
-    dup #columns [ row-column ] with map ;
+    dup #columns [ row-column ] with { } map-integers ;
 
 : sql-row-typed ( result-set -- seq )
-    dup #columns [ row-column-typed ] with map ;
+    dup #columns [ row-column-typed ] with { } map-integers ;
 
 : query-each ( statement quot: ( statement -- ) -- )
     over more-rows? [
index e9aa01feb4bb9568486c4a9b37268c247664311d..3ff93f49c67f42f461159c6446fa7b6c91f36453 100644 (file)
@@ -34,7 +34,7 @@ SINGLETON: retryable
     ] 2map >>bind-params ;
     
 M: retryable execute-statement* ( statement type -- )
-    drop [ retries>> ] [
+    drop [ retries>> iota ] [
         [
             nip
             [ query-results dispose t ]
index 19140259bf1e4b913a4243f8b7abd81ab99b0254..d0ea6cbcf12eee933beefc083c1c12fa8664e67a 100644 (file)
@@ -67,7 +67,7 @@ test-2 "TEST2" {
             test-2 ensure-table
         ] with-db
     ] [
-        10 [
+        10 iota [
             drop
             10 [
                 dup [
@@ -85,7 +85,7 @@ test-2 "TEST2" {
         ] with-db
     ] [
         <db-pool> [
-            10 [
+            10 iota [
                 10 [
                     test-1-tuple insert-tuple yield
                 ] times
index 863dc522b2d694de12c3b3cc30ab095b24aa914b..7ef62bfb77eefcb955cbc304513d98c51db21dfc 100644 (file)
@@ -205,7 +205,7 @@ link-no-follow? off
     100 [
         drop random-markup
         [ convert-farkup drop t ] [ drop print f ] recover
-    ] all?
+    ] all-integers?
 ] unit-test
 
 [ "<p><a href=\"http://foo.com/~foo\">http://foo.com/~foo</a></p>" ] [ "[[http://foo.com/~foo]]" convert-farkup ] unit-test
index f33eb276a0e88f6320ff920865811e7321ac352e..b341c462be39afe739f41d64a4298a4204a8e794 100644 (file)
@@ -64,7 +64,7 @@ SYMBOLS: a b c d e f g h ;
 [ "hi" 3 ] [ "h" "i" 3 [ append ] funny-dip ] unit-test
 
 [ { 1 2 3 } ] [
-    3 1 '[ _ [ _ + ] map ] call
+    3 1 '[ _ iota [ _ + ] map ] call
 ] unit-test
 
 [ { 1 { 2 { 3 } } } ] [
index 546413447e6a28fc1b385ec1f43af84c12fccc11..0c35f157142419ed6b1e912c6fe23707a950d3b8 100644 (file)
@@ -64,7 +64,7 @@ IN: generalizations.tests
 { 3 5 } [ 2 nweave ] must-infer-as\r
 \r
 [ { 0 1 2 } { 3 5 4 } { 7 8 6 } ]\r
-[ 9 [ ] each { [ 3array ] [ swap 3array ] [ rot 3array ] } 3 nspread ] unit-test\r
+[ 9 [ ] each-integer { [ 3array ] [ swap 3array ] [ rot 3array ] } 3 nspread ] unit-test\r
 \r
 [ 1 2 3 4 1 2 3 ] [ 1 2 3 4 3 nover ] unit-test\r
 \r
index e1044b0feb0e5ef1bddff64fd1c97ab9b01dc820..2c2fee1d70e79233249c8803478f3652bcb2f97f 100644 (file)
@@ -52,7 +52,7 @@ HELP: <groups>
 { $examples
     { $example
         "USING: arrays kernel prettyprint sequences grouping ;"
-        "9 >array 3 <groups> reverse! concat >array ." "{ 6 7 8 3 4 5 0 1 2 }"
+        "9 iota >array 3 <groups> reverse! concat >array ." "{ 6 7 8 3 4 5 0 1 2 }"
     }
     { $example
         "USING: kernel prettyprint sequences grouping ;"
@@ -67,7 +67,7 @@ HELP: <sliced-groups>
 { $examples
     { $example
         "USING: arrays kernel prettyprint sequences grouping ;"
-        "9 >array 3 <sliced-groups>"
+        "9 iota >array 3 <sliced-groups>"
         "dup [ reverse! drop ] each concat >array ."
         "{ 2 1 0 5 4 3 8 7 6 }"
     }
index c1985c516f995cdee7c614985f4e9330a4b7c36e..703cf530805c06b44fbb6552847a12743c7d3d04 100644 (file)
@@ -31,7 +31,7 @@ IN: heaps.tests
     <min-heap> [ heap-push-all ] keep heap-pop-all ;
 
 : random-alist ( n -- alist )
-    [
+    iota [
         drop 32 random-bits dup number>string
     ] H{ } map>assoc ;
 
@@ -40,16 +40,16 @@ IN: heaps.tests
 
 14 [
     [ t ] swap [ 2^ test-heap-sort ] curry unit-test
-] each
+] each-integer
 
 : test-entry-indices ( n -- ? )
     random-alist
     <min-heap> [ heap-push-all ] keep
-    data>> dup length swap [ index>> ] map sequence= ;
+    data>> dup length iota swap [ index>> ] map sequence= ;
 
 14 [
     [ t ] swap [ 2^ test-entry-indices ] curry unit-test
-] each
+] each-integer
 
 : sort-entries ( entries -- entries' )
     [ key>> ] sort-with ;
@@ -66,4 +66,4 @@ IN: heaps.tests
 
 11 [
     [ t ] swap [ 2^ delete-test sequence= ] curry unit-test
-] each
+] each-integer
index 1ca5bf1bc54ff898a1fec4d11b8c5be848f463cc..e4bbb3459e53a3b6543573666bde13843b7b8046 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008, 2009 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays assocs byte-arrays byte-vectors classes
 combinators definitions effects fry generic generic.single
@@ -24,7 +24,7 @@ M: object specializer-declaration class ;
     "specializer" word-prop ;
 
 : make-specializer ( specs -- quot )
-    dup length <reversed>
+    dup length iota <reversed>
     [ (picker) 2array ] 2map
     [ drop object eq? not ] assoc-filter
     [ [ t ] ] [
index e305c8477a18f63f2f3a80a0202d4a09018a48f7..9a67d43e7d90aa24d575225cb1f2a9a36a6828f0 100644 (file)
@@ -137,7 +137,7 @@ TUPLE: jpeg-color-info
     data>>
     binary
     [
-        read1 [0,b)
+        read1 iota
         [   drop
             read1 jpeg> color-info>> nth clone
             read1 16 /mod [ >>dc-huff-table ] [ >>ac-huff-table ] bi*
@@ -198,7 +198,7 @@ MEMO: yuv>bgr-matrix ( -- m )
     { 8 8 } coord-matrix [ { u v } [ wave ] 2map product ] map^2
     1 u v [ 0 = [ 2 sqrt / ] when ] bi@ 4 / m*n ;
 
-MEMO: dct-matrix ( -- m ) 64 [0,b) [ 8 /mod dct-vect flatten ] map ;
+MEMO: dct-matrix ( -- m ) 64 iota [ 8 /mod dct-vect flatten ] map ;
 
 : mb-dim ( component -- dim )  [ h>> ] [ v>> ] bi 2array ;
 
index 0817a59e7b20fad84fc764b67c66b03bfadccbcf..d4a9c4ab563a57b37ce0c12242d0b5b3f755ea5e 100644 (file)
@@ -120,7 +120,7 @@ ERROR: unimplemented-color-type image ;
     prev width tail-slice :> b
     curr :> a
     curr width tail-slice :> x
-    x length [0,b)
+    x length iota
     filter {
         { filter-none [ drop ] }
         { filter-sub [ [| n | n x nth n a nth + 256 wrap n x set-nth ] each ] }
index cd6754550d3a7a5d11d4dfcf273a131bc80bdb7e..b21eb50c62c8d9890a86c0c3106a6895b275760f 100644 (file)
@@ -6,7 +6,7 @@ math.ranges math.vectors sequences sequences.deep fry ;
 IN: images.processing\r
 \r
 : coord-matrix ( dim -- m )\r
-    [ [0,b) ] map first2 [ [ 2array ] with map ] curry map ;\r
+    [ iota ] map first2 [ [ 2array ] with map ] curry map ;\r
 \r
 : map^2 ( m quot -- m' ) '[ _ map ] map ; inline\r
 : each^2 ( m quot -- m' ) '[ _ each ] each ; inline\r
@@ -16,7 +16,7 @@ IN: images.processing
 : matrix>image ( m -- image )\r
     <image> over matrix-dim >>dim\r
     swap flip flatten\r
-    [ 128 * 128 + 0 max 255 min  >fixnum ] map\r
+    [ 128 * 128 + 0 255 clamp >fixnum ] map\r
     >byte-array >>bitmap L >>component-order ubyte-components >>component-type ;\r
 \r
 :: matrix-zoom ( m f -- m' )\r
@@ -30,7 +30,7 @@ IN: images.processing
 :: draw-grey ( value x,y image -- )\r
     x,y image image-offset 3 * { 0 1 2 }\r
     [\r
-        + value 128 + >fixnum 0 max 255 min swap image bitmap>> set-nth\r
+        + value 128 + >fixnum 0 255 clamp swap image bitmap>> set-nth\r
     ] with each ;\r
 \r
 :: draw-color ( value x,y color-id image -- )\r
index 82c2487f671b30bacb8af47767b6da887e2e7a7e..2aa7cd218e02b051ca1ac66b2612bbefe620b2d1 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2005, 2009 Slava Pestov.
+! Copyright (C) 2005, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays generic hashtables io kernel assocs math
 namespaces prettyprint prettyprint.custom prettyprint.sections
@@ -23,9 +23,7 @@ GENERIC: add-numbers ( alist -- table' )
 M: enum add-numbers ;
 
 M: assoc add-numbers
-    +number-rows+ get [
-        dup length [ prefix ] 2map
-    ] when ;
+    +number-rows+ get [ [ prefix ] map-index ] when ;
 
 TUPLE: slot-name name ;
 
index 4ecb1e12a8a133e52f4db1bcd845bbf154927f6b..d112e4e6ebd6e3b31374b0233c4ddfd3a4fa0fcd 100644 (file)
@@ -68,7 +68,7 @@ UNION: explicit-inverse normal-inverse math-inverse pop-inverse ;
 
 : enough? ( stack word -- ? )
     dup deferred? [ 2drop f ] [
-        [ [ length ] [ 1quotation infer in>> ] bi* >= ]
+        [ [ length ] [ 1quotation inputs ] bi* >= ]
         [ 3drop f ] recover
     ] if ;
 
@@ -273,10 +273,10 @@ DEFER: __
     ] recover ; inline
 
 : true-out ( quot effect -- quot' )
-    out>> '[ @ _ ndrop t ] ;
+    out>> length '[ @ _ ndrop t ] ;
 
 : false-recover ( effect -- quot )
-    in>> [ ndrop f ] curry [ recover-fail ] curry ;
+    in>> length [ ndrop f ] curry [ recover-fail ] curry ;
 
 : [matches?] ( quot -- undoes?-quot )
     [undo] dup infer [ true-out ] [ false-recover ] bi curry ;
index 17264267777486fc000ae91e6d7bd5daa0e7744b..7d4d7f1215f6fa89b43fd118c1e9d68faa238d6b 100644 (file)
@@ -18,7 +18,7 @@ VALUE: jis212
 "vocab:io/encodings/iso2022/212.txt" flat-file>biassoc to: jis212
 
 VALUE: ascii
-128 unique >biassoc to: ascii
+128 iota unique >biassoc to: ascii
 
 TUPLE: iso2022-state type ;
 
index ef7d778abe7ae439b2ce4c35e6a81bc66b92b15c..23de95f519c591a9c83147d45b6e88e811e2905b 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-integer ]
     [ [ number>string ] dip prepend touch-file ] 2bi ; inline
 
 [ t ] [
index f167b1e99ba32f387a454e03f379fe662c71ddde..07f7b25140bdc192da95247e2ae6b589c81e75ae 100644 (file)
@@ -35,8 +35,8 @@ SYMBOL: unique-retries
 : random-name ( -- string )
     unique-length get [ random-ch ] "" replicate-as ;
 
-: retry ( quot: ( -- ? )  n -- )
-    swap [ drop ] prepose attempt-all ; inline
+: retry ( quot: ( -- ? ) n -- )
+    iota swap [ drop ] prepose attempt-all ; inline
 
 : (make-unique-file) ( path prefix suffix -- path )
     '[
index 0c2ed34f453b99958081ada4476fc5592c23d30e..2ee662c0ac5698fb2c65bcb80d4fa81cee53ee16 100644 (file)
@@ -3,4 +3,4 @@
 USING: lcs.diff2html lcs kernel tools.test strings sequences xml.writer ;
 IN: lcs.diff2html.tests
 
-[ ] [ "hello" "heyo" [ 1string ] { } map-as diff htmlize-diff xml>string drop ] unit-test
+[ ] [ "hello" "heyo" [ [ 1string ] { } map-as ] bi@ diff htmlize-diff xml>string drop ] unit-test
index ca9e48eb057623509324bba81db54a788ff0baeb..545610a0ea2a90c66bb7b521982fba57483f5811 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008 Slava Pestov
+! Copyright (C) 2008, 2010 Slava Pestov
 ! See http://factorcode.org/license.txt for BSD license.
 USING: lcs xml.syntax xml.writer kernel strings ;
 FROM: accessors => item>> ;
index 38920f5764669daffbb2d6f07602de6dca37b27f..5861d90dc377492cff651147e6af2a8f65957aa8 100644 (file)
@@ -19,15 +19,15 @@ IN: lcs
     i 1 + j 1 + matrix nth set-nth ; inline\r
 \r
 : lcs-initialize ( |str1| |str2| -- matrix )\r
-    [ drop 0 <array> ] with map ;\r
+    iota [ drop 0 <array> ] with map ;\r
 \r
 : levenshtein-initialize ( |str1| |str2| -- matrix )\r
-    [ [ + ] curry map ] with map ;\r
+    [ iota ] bi@ [ [ + ] curry map ] with map ;\r
 \r
 :: run-lcs ( old new init step -- matrix )\r
     old length 1 + new length 1 + init call :> matrix\r
-    old length [| i |\r
-        new length\r
+    old length iota [| i |\r
+        new length iota\r
         [| j | i j matrix old new step loop-step ] each\r
     ] each matrix ; inline\r
 PRIVATE>\r
index 25f754e92af46ca874d2ed42f67f13d978cac1cf..3dab0c3cdb12a25a299b5aa0714356a178a44ca3 100644 (file)
@@ -49,7 +49,7 @@ M: wrapper expand-macros* wrapped>> literal ;
     stack get pop end
     [ [ expand-macros ] [ ] map-as '[ _ dip ] % ]
     [
-        length [ <reversed> ] keep
+        length iota [ <reversed> ] keep
         [ '[ _ ndrop _ nnip call ] [ ] like ] 2map , \ dispatch ,
     ] bi ;
 
index 10584f2004da48505c8061ff0b30cddc6bc1c218..ec3cd6ee76c9f96847106d463e918ded20e5dd24 100644 (file)
@@ -31,7 +31,7 @@ HELP: permutation
 { $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 }" }
+        "1 { 0 1 2 } permutation ." "{ 0 2 1 }" }
     { $example "USING: math.combinatorics prettyprint ;"
         "5 { \"apple\" \"banana\" \"orange\" } permutation ." "{ \"orange\" \"banana\" \"apple\" }" }
 } ;
@@ -41,7 +41,7 @@ HELP: all-permutations
 { $description "Outputs a sequence containing all permutations of " { $snippet "seq" } " in lexicographical order." }
 { $examples
     { $example "USING: math.combinatorics prettyprint ;"
-        "3 all-permutations ." "{ { 0 1 2 } { 0 2 1 } { 1 0 2 } { 1 2 0 } { 2 0 1 } { 2 1 0 } }" }
+        "{ 0 1 2 } all-permutations ." "{ { 0 1 2 } { 0 2 1 } { 1 0 2 } { 1 2 0 } { 2 0 1 } { 2 1 0 } }" }
 } ;
 
 HELP: each-permutation
index ca6ec9cb53c02d0d5722d8bf70eae70bfd3cd4b9..bbf5a1cb85bfaa08a35f581ae18faeb1288fe959 100644 (file)
@@ -56,7 +56,7 @@ IN: math.combinatorics.tests
 [ 0 ] [ 9 5 iota 3 <combo> dual-index ] unit-test
 [ 179 ] [ 72 10 iota 5 <combo> dual-index ] unit-test
 
-[ { 5 3 2 1 } ] [ 7 4 <combo> 8 combinadic ] unit-test
+[ { 5 3 2 1 } ] [ 7 iota 4 <combo> 8 combinadic ] unit-test
 [ { 4 3 2 1 0 } ] [ 10 iota 5 <combo> 0 combinadic ] unit-test
 [ { 8 6 3 1 0 } ] [ 10 iota 5 <combo> 72 combinadic ] unit-test
 [ { 9 8 7 6 5 } ] [ 10 iota 5 <combo> 251 combinadic ] unit-test
index 36b62ddcc06d0cbe53417a81d50a8a5714433af3..7c68aede094572249bf1049292b05b47ceca4a3a 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (c) 2007-2009 Slava Pestov, Doug Coleman, Aaron Schaefer.
+! Copyright (c) 2007-2010 Slava Pestov, Doug Coleman, Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors assocs binary-search fry kernel locals math math.order
     math.ranges namespaces sequences sorting ;
@@ -15,7 +15,7 @@ IN: math.combinatorics
 PRIVATE>
 
 : factorial ( n -- n! )
-    1 [ 1 + * ] reduce ;
+    iota 1 [ 1 + * ] reduce ;
 
 : nPk ( n k -- nPk )
     2dup possible? [ dupd - [a,b) product ] [ 2drop 0 ] if ;
@@ -46,11 +46,11 @@ PRIVATE>
     [ permutation-indices ] keep nths ;
 
 : all-permutations ( seq -- seq )
-    [ length factorial ] keep
+    [ length factorial iota ] keep
     '[ _ permutation ] map ;
 
 : each-permutation ( seq quot -- )
-    [ [ length factorial ] keep ] dip
+    [ [ length factorial iota ] keep ] dip
     '[ _ permutation @ ] each ; inline
 
 : reduce-permutations ( seq identity quot -- result )
@@ -77,7 +77,7 @@ C: <combo> combo
     dup 0 = [
         drop 1 - nip
     ] [
-        [ [0,b) ] 2dip '[ _ nCk _ >=< ] search nip
+        [ iota ] 2dip '[ _ nCk _ >=< ] search nip
     ] if ;
 
 :: next-values ( a b x -- a' b' x' v )
@@ -104,7 +104,7 @@ C: <combo> combo
     [ combination-indices ] keep seq>> nths ;
 
 : combinations-quot ( seq k quot -- seq quot )
-    [ <combo> [ choose [0,b) ] keep ] dip
+    [ <combo> [ choose iota ] keep ] dip
     '[ _ apply-combination @ ] ; inline
 
 PRIVATE>
index 4b0481eca1eb808d514736f37d97a4ed2fce8d1c..f85ec49f81d06e79b46dec824d18b8f9da1fcfa0 100644 (file)
@@ -70,4 +70,7 @@ IN: math.complex.tests
 [ ] [ C{ 1 4 } coth drop ] unit-test
 [ ] [ C{ 1 4 } cot drop ] unit-test
 
+[ t ] [ 0.0 pi rect> exp C{ -1 0 } 1.0e-7 ~ ] unit-test
+[ t ] [ 0 pi rect> exp C{ -1 0 } 1.0e-7 ~ ] unit-test
+
 [ "C{ 1/2 2/3 }" ] [ C{ 1/2 2/3 } unparse ] unit-test
index d91b4b6b92a0c5904d418037be7a6999e573322c..a1466dd22cb587415a694cbf31b57517c2e8d67b 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2004, 2008 Slava Pestov.
+! Copyright (C) 2004, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: math kernel math.constants math.private math.bits
 math.libm combinators math.order sequences ;
@@ -62,7 +62,7 @@ M: float exp fexp ; inline
 
 M: real exp >float exp ; inline
 
-M: complex exp >rect swap fexp swap polar> ; inline
+M: complex exp >rect swap exp swap polar> ; inline
 
 <PRIVATE
 
index a569b4af7bb39b852c752d83c85d5c83f48466b0..3fa3e97cbabedb8d9f0e0bb9d187abae3fc7869e 100644 (file)
@@ -291,7 +291,7 @@ IN: math.intervals.tests
     ] if ;
 
 unary-ops [
-    [ [ t ] ] dip '[ 8000 iota [ drop _ unary-test ] all? ] unit-test
+    [ [ t ] ] dip '[ 8000 [ drop _ unary-test ] all-integers? ] unit-test
 ] each
 
 : binary-ops ( -- alist )
index 371eb8a36c092bb4152e25eb71f3cbe84265c766..c8d5bb7338ea377811611437316fabe780872b1b 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2006, 2008 Slava Pestov.
+! Copyright (C) 2006, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel locals math math.vectors math.matrices
 namespaces sequences fry sorting ;
@@ -42,7 +42,7 @@ SYMBOL: matrix
     [ [ clear-scale ] 2keep [ n*v ] dip v+ ] change-row ;
 
 : rows-from ( row# -- slice )
-    rows dup <slice> ;
+    rows dup iota <slice> ;
 
 : clear-col ( col# row# rows -- )
     [ nth-row ] dip [ [ 2dup ] dip (clear-col) ] each 2drop ;
@@ -79,9 +79,9 @@ SYMBOL: matrix
 
 : reduced ( matrix' -- matrix'' )
     [
-        rows <reversed> [
+        rows iota <reversed> [
             dup nth-row leading drop
-            dup [ swap dup clear-col ] [ 2drop ] if
+            dup [ swap dup iota clear-col ] [ 2drop ] if
         ] each
     ] with-matrix ;
 
index 75b9be5caec547429b2ff10422bf45dafa9c6e97..bf14d7ba13ccff4bcf5eb55385f561a5543c0e3b 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2005, 2009 Slava Pestov.
+! Copyright (C) 2005, 2010 Slava Pestov, Joe Groff.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays columns kernel locals math math.bits
 math.functions math.order math.vectors sequences
@@ -11,7 +11,7 @@ IN: math.matrices
 
 : identity-matrix ( n -- matrix )
     #! Make a nxn identity matrix.
-    dup [ [ = 1 0 ? ] with map ] curry map ;
+    iota dup [ [ = 1 0 ? ] with map ] curry map ;
 
 :: rotation-matrix3 ( axis theta -- matrix )
     theta cos :> c
index 0de18b6febc38320a9acc305edcf16681daa7036..99d77d0ce2216d66d66bad92c36592b69833f293 100644 (file)
@@ -32,7 +32,7 @@ PRIVATE>
     2dup [ length ] bi@ + 1 - 2pad-tail [ >vector ] bi@ ;
 
 : p* ( p q -- r )
-    2unempty pextend-conv <reversed> dup length
+    2unempty pextend-conv <reversed> dup length iota
     [ over length pick <slice> pick [ * ] 2map sum ] map 2nip reverse ;
 
 : p-sq ( p -- p^2 )
index d201abfef8f5705dbaa25320014cf187d79da6b4..f803b7db01aebdee0ba41f1c0edf71705a908637 100644 (file)
@@ -8,4 +8,4 @@ IN: math.primes.miller-rabin.tests
 [ t ] [ 37 miller-rabin ] unit-test
 [ t ] [ 2135623355842621559 miller-rabin ] unit-test
 
-[ f ] [ 1000 [ drop 15 miller-rabin ] any? ] unit-test
+[ f ] [ 1000 iota [ drop 15 miller-rabin ] any? ] unit-test
index 04b1330cc2e0bec710355bf32b387d812a28fa5f..ac5c2df705764a6003c5d360bd4e519c3043a482 100644 (file)
@@ -10,7 +10,7 @@ IN: math.primes.miller-rabin
     n 1 - :> n-1
     n-1 factor-2s :> ( r s )
     0 :> a!
-    trials [
+    trials iota [
         drop
         2 n 2 - [a,b] random a!
         a s n ^mod 1 = [
index e099f6e830523ffc147910f61e1839a4692031e5..815b34a90d7288b816ce0cf9dc37bcba81df7a1d 100644 (file)
@@ -22,7 +22,7 @@ A-cast DEFINES       ${A}-cast
 A{     DEFINES       ${A}{
 
 N       [ A-rep rep-length ]
-BOA-EFFECT [ N 2 * "n" <repetition> >array { "v" } <effect> ]
+BOA-EFFECT [ N 2 * "n" <array> { "v" } <effect> ]
 
 WHERE
 
index 658d9b270c8eaffe1f6e3ab792ab771a2b05ab38..d80755a6a5c2cb24b37f1c6e5cf142ee0d33096d 100644 (file)
@@ -238,7 +238,7 @@ PRIVATE>
     [ >rep-array ] [ widen-vector-rep [ rep-length ] [ [>rep-array] ] bi ] bi
     [ tail-slice ] dip call( a' -- c' ) underlying>> ;
 : (simd-with)              (   n rep -- v )
-    [ rep-length iota swap '[ _ ] ] [ <rep-array> ] bi replicate-as 
+    [ rep-length swap '[ _ ] ] [ <rep-array> ] bi replicate-as 
     underlying>> ;
 : (simd-gather-2)          ( m n rep -- v ) <rep-array> [ 2 set-firstn ] keep underlying>> ;
 : (simd-gather-4)          ( m n o p rep -- v ) <rep-array> [ 4 set-firstn ] keep underlying>> ;
index aaa55078640749b3135a48489b0e075be1ab1c75..342c565dcebe16590a4ac58b76835b3dd3616ef5 100644 (file)
@@ -175,7 +175,8 @@ CONSTANT: vector-words
 "== Checking vector operations" print
 
 : random-int-vector ( class -- vec )
-    new [ drop 1,000 random ] map ;
+    new [ drop 1000 random ] map ;
+
 : random-float-vector ( class -- vec )
     new [
         drop
@@ -463,7 +464,7 @@ TUPLE: inconsistent-vector-test bool branch ;
 
 ! Test element access -- it should box bignums for int-4 on x86
 : test-accesses ( seq -- failures )
-    [ length >array ] keep
+    [ length iota >array ] keep
     '[ [ _ 1quotation ] dip '[ _ swap nth ] ] [ = ] check-optimizer ; inline
 
 [ { } ] [ float-4{ 1.0 2.0 3.0 4.0 } test-accesses ] unit-test
@@ -480,7 +481,7 @@ TUPLE: inconsistent-vector-test bool branch ;
 
 "== Checking broadcast" print
 : test-broadcast ( seq -- failures )
-    [ length >array ] keep
+    [ length iota >array ] keep
     '[ [ _ 1quotation ] dip '[ _ vbroadcast ] ] [ = ] check-optimizer ;
 
 [ { } ] [ float-4{ 1.0 2.0 3.0 4.0 } test-broadcast ] unit-test
index 905737c266c283cca9ec43534888cbde7f3931bf..acf13599c1f059552a8671ca323531e09370a7ce 100644 (file)
@@ -247,7 +247,7 @@ COERCER [ ELT c-type-class "coercer" word-prop [ ] or ]
 
 SET-NTH [ ELT dup c:c-setter c:array-accessor ]
 
-BOA-EFFECT [ N "n" <repetition> >array { "v" } <effect> ]
+BOA-EFFECT [ N "n" <array> { "v" } <effect> ]
 
 WHERE
 
index 311abf50af1d474076d23e6b589f0d9ee039812a..69d8929c651d49d90f4a67f739a887ed9cf0f9d7 100644 (file)
@@ -58,21 +58,14 @@ M: object v*hs+ [ * ] 2map (h+) ;
 GENERIC: v/ ( u v -- w )
 M: object v/ [ / ] 2map ;
 
-<PRIVATE
-
-: if-both-floats ( x y p q -- )
-    [ 2dup [ float? ] both? ] 2dip if ; inline
-
-PRIVATE>
-
 GENERIC: vavg ( u v -- w )
 M: object vavg [ + 2 / ] 2map ;
 
 GENERIC: vmax ( u v -- w )
-M: object vmax [ [ float-max ] [ max ] if-both-floats ] 2map ;
+M: object vmax [ max ] 2map ;
 
 GENERIC: vmin ( u v -- w )
-M: object vmin [ [ float-min ] [ min ] if-both-floats ] 2map ;
+M: object vmin [ min ] 2map ;
 
 GENERIC: v+- ( u v -- w )
 M: object v+-
index 257a2bb1ea059be27a418b4eb4f72d15c8493f82..7c29310a97716c9764422170e19e8f58cd37aac2 100644 (file)
@@ -1,9 +1,9 @@
-! Copyright (C) 2009 Slava Pestov.
+! Copyright (C) 2009, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: models.arrow models.product stack-checker accessors fry
-generalizations macros kernel ;
+generalizations combinators.smart macros kernel ;
 IN: models.arrow.smart
 
 MACRO: <smart-arrow> ( quot -- quot' )
-    [ infer in>> dup ] keep
+    [ inputs dup ] keep
     '[ _ narray <product> [ _ firstn @ ] <arrow> ] ;
\ No newline at end of file
index 2a0eef7227aed299377fd41e4bdd9a473db950ad..363f30678dadefff30c3522fda26915c563ce31d 100644 (file)
@@ -1,6 +1,6 @@
 USING: nibble-arrays tools.test sequences kernel math ;
 IN: nibble-arrays.tests
 
-[ t ] [ 16 dup >nibble-array sequence= ] unit-test
+[ t ] [ 16 iota dup >nibble-array sequence= ] unit-test
 [ N{ 4 2 1 3 } ] [ N{ 3 1 2 4 } reverse ] unit-test
 [ N{ 1 4 9 0 9 4 } ] [ N{ 1 2 3 4 5 6 } [ sq ] map ] unit-test
index 5ddd5f9bf08e04699ac9ce3bdf16b145553b762d..ffc4cb91ad78aa462b4abbf529ac615225179e80 100644 (file)
@@ -446,14 +446,14 @@ M: ebnf-sequence build-locals ( code ast -- code )
     ] [ \r
       [\r
         "FROM: locals => [let :> ; FROM: sequences => nth ; [let " %\r
-          dup length [\r
+          [\r
             over ebnf-var? [\r
               " " % # " over nth :> " %\r
               name>> % \r
             ] [\r
               2drop\r
             ] if\r
-          ] 2each\r
+          ] each-index\r
           " " %\r
           %  \r
           " nip ]" %     \r
index d66fdd0c089eaacd055ef5926006c17123d4267a..482367ad9cf0277bd6c27e692de3346e3e9a0969 100644 (file)
@@ -81,7 +81,8 @@ M: hash-0-b hashcode* 2drop 0 ;
 ] unit-test
 
 : random-string ( -- str )
-    1000000 random ; ! [ CHAR: a CHAR: z [a,b] random ] "" replicate-as ;
+    1000000 random ;
+    ! [ CHAR: a CHAR: z [a,b] random ] "" replicate-as ;
 
 : random-assocs ( n -- hash phash )
     [ random-string ] replicate
index 95fa70558d0d6ed4feb5d17f8354fdb71074b8cc..6d340ca78a95b6575613c26caecdc81abfe7b84a 100644 (file)
@@ -18,14 +18,14 @@ vectors math math.order ;
 ] unit-test
 
 { 100 1060 2000 10000 100000 1000000 } [
-    [ t ] swap [ dup >persistent-vector sequence= ] curry unit-test
+    [ t ] swap [ iota dup >persistent-vector sequence= ] curry unit-test
 ] each
 
 [ ] [ 10000 [ 16 random-bits ] PV{ } replicate-as "1" set ] unit-test
 [ ] [ "1" get >vector "2" set ] unit-test
 
 [ t ] [
-    3000 [
+    3000 iota [
         drop
         16 random-bits 10000 random
         [ "1" [ new-nth ] change ]
@@ -56,11 +56,11 @@ vectors math math.order ;
 ] unit-test
 
 [ t ] [
-    10000 >persistent-vector 752 [ ppop ] times dup length sequence=
+    10000 iota >persistent-vector 752 [ ppop ] times dup length iota sequence=
 ] unit-test
 
 [ t ] [
-    100 [
+    100 iota [
         drop
         100 random [
             16 random-bits [ "1" [ ppush ] change ] [ "2" get push ] bi
index 2e1a47b9512d50b75f68667c123483d1a3e84407..e3cb186bf8057f5d45f2a13faf59c4c2cd2f43af 100644 (file)
@@ -33,10 +33,10 @@ IN: porter-stemmer
     ] if ;
 
 : consonant-seq ( str -- n )
-    0 0 rot skip-consonants (consonant-seq) ;
+    [ 0 0 ] dip skip-consonants (consonant-seq) ;
 
 : stem-vowel? ( str -- ? )
-    [ length ] keep [ consonant? ] curry all? not ;
+    [ length iota ] keep [ consonant? ] curry all? not ;
 
 : double-consonant? ( i str -- ? )
     over 1 < [
index 040b6d8f7c23723f365e04e8bc002d56bb364cb7..6f5f61f688ef3ae019c6524e3e4b13099ec5a462 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2003, 2009 Slava Pestov.
+! Copyright (C) 2003, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays generic hashtables io kernel math assocs
 namespaces make sequences strings io.styles vectors words
@@ -309,7 +309,7 @@ SYMBOL: next
 
 : group-flow ( seq -- newseq )
     [
-        dup length [
+        dup length iota [
             2dup 1 - swap ?nth prev set
             2dup 1 + swap ?nth next set
             swap nth dup split-before dup , split-after
index b877af6f79bfd465addaaa700a269298a80faa26..ede3c92f517b60cd2acf4f2c5b2d7e3442a3c244 100644 (file)
@@ -5,7 +5,7 @@ IN: random.mersenne-twister.tests
 : check-random ( max -- ? )
     [ random 0 ] keep between? ;
 
-[ t ] [ 100 [ drop 674 check-random ] all? ] unit-test
+[ t ] [ 100 [ drop 674 check-random ] all-integers? ] unit-test
 
 : randoms ( -- seq )
     100 [ 100 random ] replicate ;
@@ -16,11 +16,11 @@ IN: random.mersenne-twister.tests
 [ f ] [ 1234 [ randoms randoms = ] test-rng ] unit-test
 
 [ 1333075495 ] [
-    0 [ 1000 [ drop random-generator get random-32* drop ] each random-generator get random-32* ] test-rng
+    0 [ 1000 [ drop random-generator get random-32* drop ] each-integer random-generator get random-32* ] test-rng
 ] unit-test
 
 [ 1575309035 ] [
-    0 [ 10000 [ drop random-generator get random-32* drop ] each random-generator get random-32* ] test-rng
+    0 [ 10000 [ drop random-generator get random-32* drop ] each-integer random-generator get random-32* ] test-rng
 ] unit-test
 
 
index 90489d30521940781ef2c29e98c5a86dd9779247..9fd82a30626a10eb6b4b0985eeca45776bc83a62 100644 (file)
@@ -30,8 +30,8 @@ CONSTANT: a uint-array{ 0 HEX: 9908b0df }
 : mt-generate ( mt -- )
     [
         seq>>
-        [ [ n m - ] dip '[ [ m ] dip _ mt[k] ] each ]
-        [ [ m 1 - ] dip '[ [ m n - ] [ n m - + ] bi* _ mt[k] ] each ]
+        [ [ n m - ] dip '[ [ m ] dip _ mt[k] ] each-integer ]
+        [ [ m 1 - ] dip '[ [ m n - ] [ n m - + ] bi* _ mt[k] ] each-integer ]
         bi
     ] [ 0 >>i drop ] bi ; inline
 
@@ -41,7 +41,7 @@ CONSTANT: a uint-array{ 0 HEX: 9908b0df }
 : init-mt-rest ( seq -- )
     n 1 - swap '[
         _ [ init-mt-formula ] [ [ 1 + ] dip set-nth ] 2bi
-    ] each ; inline
+    ] each-integer ; inline
 
 : init-mt-seq ( seed -- seq )
     32 bits n <uint-array>
index 788a6e700a45b3b92cf0a4c4d98b1027243fb4df..2bf92f64a3b51512daa3392dde72227fc97ff8d3 100644 (file)
@@ -19,9 +19,8 @@ HELP: random-bytes*
 { $description "Generates a byte-array of random bytes." } ;
 
 HELP: random
-{ $values { "seq" sequence } { "elt" "a random element" } }
-{ $description "Outputs a random element of the input sequence. Outputs " { $link f } " if the sequence is empty." }
-{ $notes "Since integers are sequences, passing an integer " { $snippet "n" } " outputs an integer in the interval " { $snippet "[0,n)" } "." }
+{ $values { "obj" object } { "elt" "a random element" } }
+{ $description "Outputs a random element of the input object, or outputs " { $link f } " if the object contains no elements." }
 { $examples
     { $unchecked-example "USING: random prettyprint ;"
         "10 random ."
index 96dc8cc783c9fdf4d48bec12a58da076f439954f..9341b96b11499c604310cefd207658936882ce1e 100644 (file)
@@ -11,8 +11,8 @@ IN: random.tests
 [ 2 ] [ V{ 10 20 30 } [ delete-random drop ] keep length ] unit-test
 [ V{ } [ delete-random drop ] keep length ] must-fail
 
-[ t ] [ 10000 [ 0 [ drop 187 random + ] reduce ] keep / 2 * 187 10 ~ ] unit-test
-[ t ] [ 10000 [ 0 [ drop 400 random + ] reduce ] keep / 2 * 400 10 ~ ] unit-test
+[ t ] [ 10000 [ iota 0 [ drop 187 random + ] reduce ] keep / 2 * 187 10 ~ ] unit-test
+[ t ] [ 10000 [ iota 0 [ drop 400 random + ] reduce ] keep / 2 * 400 10 ~ ] unit-test
 
 [ t ] [ 1000 [ 400 random ] replicate prune length 256 > ] unit-test
 
@@ -29,7 +29,7 @@ IN: random.tests
 [ { 1 2 } 3 sample ] [ too-many-samples?  ] must-fail-with
 
 [ 3 ] [ { 1 2 3 4 } 3 sample prune length ] unit-test
-[ 99 ] [ 100 99 sample prune length ] unit-test
+[ 99 ] [ 100 iota 99 sample prune length ] unit-test
 
 [ ]
 [ [ 100 random-bytes ] with-system-random drop ] unit-test
index bfd107dbb64772824b5757e79a0c796296bbdd2e..1e54c567284315b8d0a9dd921c86d9ab921eb6e0 100644 (file)
@@ -50,7 +50,11 @@ PRIVATE>
 : random-bits* ( numbits -- n )
     1 - [ random-bits ] keep set-bit ;
 
-: random ( seq -- elt )
+GENERIC: random ( obj -- elt )
+
+M: integer random [ f ] [ random-integer ] if-zero ;
+
+M: sequence random
     [ f ] [
         [ length random-integer ] keep nth
     ] if-empty ;
@@ -59,7 +63,7 @@ PRIVATE>
 
 : randomize ( seq -- seq )
     dup length [ dup 1 > ]
-    [ [ iota random ] [ 1 - ] bi [ pick exchange ] keep ]
+    [ [ random ] [ 1 - ] bi [ pick exchange ] keep ]
     while drop ;
 
 ERROR: too-many-samples seq n ;
index fcde135cf887c0fb1af245ef8332f1d634624f91..33b2ded448e53ad803265f0118ccc864c5449a79 100644 (file)
@@ -11,9 +11,7 @@ TUPLE: parts in out ;
     zip [ first ] partition [ values ] bi@ parts boa ;
 
 : powerset-partition ( sequence -- partitions )
-    [ length [ 2^ ] keep ] keep '[
-        _ <bits> _ make-partition
-    ] map rest ;
+    [ length [ 2^ iota ] keep ] keep '[ _ <bits> _ make-partition ] map rest ;
 
 : partition>class ( parts -- class )
     [ out>> [ <not-class> ] map ]
index 50a057d7f400628f856cf48210022c4905d3c0ce..c81ed0ae42898c518dcc2c94bdaa12390098a912 100644 (file)
@@ -4,7 +4,7 @@ USING: help.markup help.syntax kernel math strings ;
 IN: roman
 
 HELP: >roman
-{ $values { "n" "an integer" } { "str" "a string" } }
+{ $values { "n" integer } { "str" string } }
 { $description "Converts a number to its lower-case Roman Numeral equivalent." }
 { $notes "The range for this word is 1-3999, inclusive." }
 { $examples 
@@ -15,7 +15,7 @@ HELP: >roman
 } ;
 
 HELP: >ROMAN
-{ $values { "n" "an integer" } { "str" "a string" } }
+{ $values { "n" integer } { "str" string } }
 { $description "Converts a number to its upper-case Roman numeral equivalent." }
 { $notes "The range for this word is 1-3999, inclusive." }
 { $examples 
@@ -26,7 +26,7 @@ HELP: >ROMAN
 } ;
 
 HELP: roman>
-{ $values { "str" "a string" } { "n" "an integer" } }
+{ $values { "str" string } { "n" integer } }
 { $description "Converts a Roman numeral to an integer." }
 { $notes "The range for this word is i-mmmcmxcix, inclusive." }
 { $examples 
@@ -39,7 +39,7 @@ HELP: roman>
 { >roman >ROMAN roman> } related-words
 
 HELP: roman+
-{ $values { "string" string } { "string" string } { "string" string } }
+{ $values { "x" string } { "x" string } { "x" string } }
 { $description "Adds two Roman numerals." }
 { $examples 
     { $example "USING: io roman ;"
@@ -49,7 +49,7 @@ HELP: roman+
 } ;
 
 HELP: roman-
-{ $values { "string" string } { "string" string } { "string" string } }
+{ $values { "x" string } { "x" string } { "x" string } }
 { $description "Subtracts two Roman numerals." }
 { $examples 
     { $example "USING: io roman ;"
@@ -61,7 +61,7 @@ HELP: roman-
 { roman+ roman- } related-words
 
 HELP: roman*
-{ $values { "string" string } { "string" string } { "string" string } }
+{ $values { "x" string } { "x" string } { "x" string } }
 { $description "Multiplies two Roman numerals." }
 { $examples 
     { $example "USING: io roman ;"
@@ -71,7 +71,7 @@ HELP: roman*
 } ;
 
 HELP: roman/i
-{ $values { "string" string } { "string" string } { "string" string } }
+{ $values { "x" string } { "x" string } { "x" string } }
 { $description "Computes the integer division of two Roman numerals." }
 { $examples 
     { $example "USING: io roman ;"
@@ -81,7 +81,7 @@ HELP: roman/i
 } ;
 
 HELP: roman/mod
-{ $values { "string" string } { "string" string } { "string" string } { "string" string } }
+{ $values { "x" string } { "x" string } { "x" string } { "x" string } }
 { $description "Computes the quotient and remainder of two Roman numerals." }
 { $examples 
     { $example "USING: kernel io roman ;"
index a645898c034e9838c970e2216795ebb15c7b8b2c..a783e7973c3193f1eb120a7381a967baaa125ff6 100644 (file)
@@ -48,7 +48,7 @@ PRIVATE>
 <PRIVATE
 
 MACRO: binary-roman-op ( quot -- quot' )
-    [ infer in>> ] [ ] [ infer out>> ] tri
+    [ inputs ] [ ] [ outputs ] tri
     '[ [ roman> ] _ napply @ [ >roman ] _ napply ] ;
 
 PRIVATE>
@@ -58,8 +58,7 @@ PRIVATE>
 SYNTAX: ROMAN-OP:
     scan-word [ name>> "roman" prepend create-in ] keep
     1quotation '[ _ binary-roman-op ]
-    dup infer [ in>> ] [ out>> ] bi
-    [ "string" <repetition> ] bi@ <effect> define-declared ;
+    dup infer define-declared ;
 
 >>
 
index 6dbc76386d1c4824f9546d3203d041a88e1cdec0..036356e137975eeeec2fa147007450d2cacb2659 100644 (file)
@@ -16,12 +16,12 @@ IN: serialize.tests
 [ t ] [
     100 [
         drop
-        40 [        test-serialize-cell ] all?
-         4 [ 40 *   test-serialize-cell ] all?
-         4 [ 400 *  test-serialize-cell ] all?
-         4 [ 4000 * test-serialize-cell ] all?
+        40 [        test-serialize-cell ] all-integers?
+         4 [ 40 *   test-serialize-cell ] all-integers?
+         4 [ 400 *  test-serialize-cell ] all-integers?
+         4 [ 4000 * test-serialize-cell ] all-integers?
         and and and
-    ] all?
+    ] all-integers?
 ] unit-test
 
 TUPLE: serialize-test a b ;
index 9b4b0ac46b9651be7bd68fafe8668728d35c66bf..0840c778d7923473d6a3c434b8c7aed0cded8ad7 100644 (file)
@@ -240,7 +240,7 @@ SYMBOL: deserialized
     [ ] tri ;
 
 : copy-seq-to-tuple ( seq tuple -- )
-    [ dup length ] dip [ set-array-nth ] curry 2each ;
+    [ set-array-nth ] curry each-index ;
 
 : deserialize-tuple ( -- array )
     #! Ugly because we have to intern the tuple before reading
index 0ff41edec621ffc1b74d33f0603b722539cc0228..b826606df51f85070e4d9ddb17270b3a1e9625a4 100644 (file)
@@ -8,7 +8,7 @@ IN: shuffle
 <PRIVATE
 
 : >index-assoc ( sequence -- assoc )
-    dup length zip >hashtable ;
+    dup length iota zip >hashtable ;
 
 PRIVATE>
 
index 78b1493920cca026cde6aa54b8e9085f3e5cb462..b7fefcad635c9d04d381d34fa669a86069db073e 100644 (file)
@@ -13,4 +13,4 @@ PRIVATE>
 
 : insertion-sort ( seq quot -- )
     ! quot is a transformation on elements
-    over length [ insert ] with with each ; inline
+    over length [ insert ] with with each-integer ; inline
index 5ebd4438fe94e9ab757be475b56d4a4a2e3a8f46..08fc0e921d4a44b6881b3dff93a5dc0201cb49c4 100644 (file)
@@ -1,8 +1,7 @@
 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors math.order sorting.slots tools.test
-sorting.human arrays sequences kernel assocs multiline
-sorting.functor ;
+arrays sequences kernel assocs multiline sorting.functor ;
 IN: sorting.literals.tests
 
 TUPLE: sort-test a b c tuple2 ;
@@ -42,7 +41,7 @@ TUPLE: tuple2 d ;
         T{ sort-test f 1 1 11 }
         T{ sort-test f 2 5 3 }
         T{ sort-test f 2 5 2 }
-    } { { a>> human<=> } { b>> human>=< } { c>> <=> } } sort-by
+    } { { a>> <=> } { b>> >=< } { c>> <=> } } sort-by
 ] unit-test
 
 [ { } ]
@@ -83,14 +82,14 @@ TUPLE: tuple2 d ;
     { length-test<=> <=> } sort-by
 ] unit-test
 
-[ { { 0 1 } { 1 2 } { 1 1 } { 3 2 } } ]
+[ { { { 0 } 1 } { { 1 } 2 } { { 1 } 1 } { { 3 1 } 2 } } ]
 [
-    { { 3 2 } { 1 2 } { 0 1 } { 1 1 } }
+    { { { 3 1 } 2 } { { 1 } 2 } { { 0 } 1 } { { 1 } 1 } }
     { length-test<=> <=> } sort-keys-by
 ] unit-test
 
-[ { { 0 1 } { 1 1 } { 3 2 } { 1 2 } } ]
+[ { { 0 { 1 } } { 1 { 1 } } { 3 { 2 4 } } { 1 { 2 0 0 0 } } } ]
 [
-    { { 3 2 } { 1 2 } { 0 1 } { 1 1 } }
+    { { 3 { 2 4 } } { 1 { 2 0 0 0 } } { 0 { 1 } } { 1 { 1 } } }
     { length-test<=> <=> } sort-values-by
 ] unit-test
index 3641345a3ebd2bd9179e1224d9e8df1dbf69d146..32bb8b46c6edf5ff46297dc20c70ff820202e2d8 100644 (file)
@@ -26,7 +26,7 @@ PRIVATE>
 : (monotonic-slice) ( seq quot class -- slices )
     [
         dupd '[
-            [ length ] [ ] [ <circular> 1 over change-circular-start ] tri
+            [ length iota ] [ ] [ <circular> 1 over change-circular-start ] tri
             [ @ not [ , ] [ drop ] if ] 3each
         ] { } make
         dup empty? [ over length 1 - prefix ] when -1 prefix 2 clump
index d008c4921d6519d9c092fa0cce8c404b1558995f..433c11d34c80125e165455aa2e7acf4b2d2ceda8 100644 (file)
@@ -1,6 +1,6 @@
-! Copyright (C) 2008, 2009 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors kernel prettyprint io debugger
+USING: accessors arrays kernel prettyprint io debugger
 sequences assocs stack-checker.errors summary effects ;
 IN: stack-checker.errors.prettyprint
 
@@ -15,7 +15,7 @@ M: unbalanced-branches-error summary
 
 M: unbalanced-branches-error error.
     dup summary print
-    [ quots>> ] [ branches>> [ length <effect> ] { } assoc>map ] bi zip
+    [ quots>> ] [ branches>> [ length [ "x" <array> ] bi@ <effect> ] { } assoc>map ] bi zip
     [ [ first pprint-short bl ] [ second effect>string print ] bi ] each ;
 
 M: too-many->r summary
index 38ac2b0e719a24fb66f63e9c35f6dd928da46fab..20d61b9c3769cf829f64d519d88cb7a16fb8a931 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: fry namespaces assocs kernel sequences words accessors
 definitions math math.order effects classes arrays combinators
@@ -42,7 +42,7 @@ loop? ;
 : make-copies ( values effect-in -- values' )
     [ length cut* ] keep
     [ quotation-param? [ copy-value ] [ drop <value> ] if ] 2map
-    [ make-values ] dip append ;
+    [ length make-values ] dip append ;
 
 SYMBOL: enter-in
 SYMBOL: enter-out
index a95d110622f30ee08d86d54a5d0668ff39dc8e26..b217f4d659628781381d6dc04c386cda6adc9223 100644 (file)
@@ -153,7 +153,7 @@ M: bad-executable summary
 
 : infer-<tuple-boa> ( -- )
     \ <tuple-boa>
-    peek-d literal value>> second 1 + { tuple } <effect>
+    peek-d literal value>> second 1 + "obj" <array> { tuple } <effect>
     apply-word/effect ;
 
 \ <tuple-boa> [ infer-<tuple-boa> ] "special" set-word-prop
@@ -489,10 +489,10 @@ M: bad-executable summary
 \ word-xt { word } { integer integer } define-primitive
 \ word-xt make-flushable
 
-\ getenv { fixnum } { object } define-primitive
-\ getenv make-flushable
+\ special-object { fixnum } { object } define-primitive
+\ special-object make-flushable
 
-\ setenv { object fixnum } { } define-primitive
+\ set-special-object { object fixnum } { } define-primitive
 
 \ (exists?) { string } { object } define-primitive
 
index cc4a688f7aea9dc510c46434dbfc7c899c74ad4f..eb25b9be57d883173b4d49d77136011c64f4835a 100644 (file)
@@ -11,14 +11,14 @@ IN: stack-checker
 ARTICLE: "inference-simple" "Straight-line stack effects"
 "The simplest case is when a piece of code does not have any branches or recursion, and just pushes literals and calls words."
 $nl
-"Pushing a literal has stack effect " { $snippet "( -- object )" } ". The stack effect of a most words is always known statically from the declaration. Stack effects of " { $link POSTPONE: inline } " words and " { $link "macros" } ", may depend on literals pushed on the stack prior to the call, and this case is discussed in " { $link "inference-combinators" } "."
+"Pushing a literal has stack effect " { $snippet "( -- x )" } ". The stack effect of a most words is always known statically from the declaration. Stack effects of " { $link POSTPONE: inline } " words and " { $link "macros" } ", may depend on literals pushed on the stack prior to the call, and this case is discussed in " { $link "inference-combinators" } "."
 $nl
 "The stack effect of each element in a code snippet is composed. The result is then the stack effect of the snippet."
 $nl
 "An example:"
-{ $example "[ 1 2 3 ] infer." "( -- object object object )" }
+{ $example "[ 1 2 3 ] infer." "( -- x x x )" }
 "Another example:"
-{ $example "[ 2 + ] infer." "( object -- object )" } ;
+{ $example "[ 2 + ] infer." "( x -- x )" } ;
 
 ARTICLE: "inference-combinators" "Combinator stack effects"
 "If a word calls a combinator, one of the following two conditions must hold for the stack checker to succeed:"
@@ -30,15 +30,15 @@ ARTICLE: "inference-combinators" "Combinator stack effects"
 { $heading "Examples" }
 { $subheading "Calling a combinator" }
 "The following usage of " { $link map } " passes the stack checker, because the quotation is the result of " { $link curry } ":"
-{ $example "USING: math sequences ;" "[ [ + ] curry map ] infer." "( object object -- object )" }
+{ $example "USING: math sequences ;" "[ [ + ] curry map ] infer." "( x x -- x )" }
 "The equivalent code using " { $vocab-link "fry" } " and " { $vocab-link "locals" } " likewise passes the stack checker:"
-{ $example "USING: fry math sequences ;" "[ '[ _ + ] map ] infer." "( object object -- object )" }
-{ $example "USING: locals math sequences ;" "[| a | [ a + ] map ] infer." "( object object -- object )" }
+{ $example "USING: fry math sequences ;" "[ '[ _ + ] map ] infer." "( x x -- x )" }
+{ $example "USING: locals math sequences ;" "[| a | [ a + ] map ] infer." "( x x -- x )" }
 { $subheading "Defining an inline combinator" }
 "The following word calls a quotation twice; the word is declared " { $link POSTPONE: inline } ", since it invokes " { $link call } " on the result of " { $link compose } " on an input parameter:"
 { $code ": twice ( value quot -- result ) dup compose call ; inline" }
 "The following code now passes the stack checker; it would fail were " { $snippet "twice" } " not declared " { $link POSTPONE: inline } ":"
-{ $unchecked-example "USE: math.functions" "[ [ sqrt ] twice ] infer." "( object -- object )" }
+{ $unchecked-example "USE: math.functions" "[ [ sqrt ] twice ] infer." "( x -- x )" }
 { $subheading "Defining a combinator for unknown quotations" }
 "In the next example, " { $link POSTPONE: call( } " must be used because the quotation the result of calling a runtime accessor, and the compiler cannot make any static assumptions about this quotation at all:"
 { $code
@@ -61,14 +61,14 @@ $nl
 }
 "To make this work, use " { $link dip } " to pass the quotation instead:"
 { $example
-  "[ [ reverse ] [ [ reverse ] map ] dip call ] infer." "( object -- object )"
+  "[ [ reverse ] [ [ reverse ] map ] dip call ] infer." "( x -- x )"
 } ;
 
 ARTICLE: "inference-branches" "Branch stack effects"
 "Conditionals such as " { $link if } " and combinators built on top have the same restrictions as " { $link POSTPONE: inline } " combinators (see " { $link "inference-combinators" } ") with the additional requirement that all branches leave the stack at the same height. If this is not the case, the stack checker throws a " { $link unbalanced-branches-error } "."
 $nl
 "If all branches leave the stack at the same height, then the stack effect of the conditional is just the maximum of the stack effect of each branch. For example,"
-{ $example "[ [ + ] [ drop ] if ] infer." "( object object object -- object )" }
+{ $example "[ [ + ] [ drop ] if ] infer." "( x x x -- x )" }
 "The call to " { $link if } " takes one value from the stack, a generalized boolean. The first branch " { $snippet "[ + ]" } " has stack effect " { $snippet "( x x -- x )" } " and the second has stack effect " { $snippet "( x -- )" } ". Since both branches decrease the height of the stack by one, we say that the stack effect of the two branches is " { $snippet "( x x -- x )" } ", and together with the boolean popped off the stack by " { $link if } ", this gives a total stack effect of " { $snippet "( x x x -- x )" } "." ;
 
 ARTICLE: "inference-recursive-combinators" "Recursive combinator stack effects"
@@ -87,7 +87,7 @@ $nl
 "An inline recursive word cannot pass a quotation on the data stack through the recursive call. For example, the following will not infer:"
 { $unchecked-example ": bad ( ? quot: ( ? -- ) -- ) 2dup [ not ] dip bad call ; inline recursive" "[ [ drop ] bad ] infer." "Cannot apply “call” to a run-time computed value\nmacro call" }
 "However a small change can be made:"
-{ $example ": good ( ? quot: ( ? -- ) -- ) [ good ] 2keep [ not ] dip call ; inline recursive" "[ [ drop ] good ] infer." "( object -- )" }
+{ $example ": good ( ? quot: ( ? -- ) -- ) [ good ] 2keep [ not ] dip call ; inline recursive" "[ [ drop ] good ] infer." "( x -- )" }
 "An inline recursive word must have a fixed stack effect in its base case. The following will not infer:"
 { $code
     ": foo ( quot ? -- ) [ f foo ] [ call ] if ; inline"
index 6718d31d7aa819f522303ddcc5e88f69b5c706d2..8a0724556e8ad95a676ff964716b17b778740a70 100644 (file)
@@ -289,21 +289,21 @@ DEFER: an-inline-word
 
 ERROR: custom-error ;
 
-[ T{ effect f 0 0 t } ] [
+[ T{ effect f { } { } t } ] [
     [ custom-error ] infer
 ] unit-test
 
 : funny-throw ( a -- * ) throw ; inline
 
-[ T{ effect f 0 0 t } ] [
+[ T{ effect f { } { } t } ] [
     [ 3 funny-throw ] infer
 ] unit-test
 
-[ T{ effect f 0 0 t } ] [
+[ T{ effect f { } { } t } ] [
     [ custom-error inference-error ] infer
 ] unit-test
 
-[ T{ effect f 1 2 t } ] [
+[ T{ effect f { "x" } { "x" "x" } t } ] [
     [ dup [ 3 throw ] dip ] infer
 ] unit-test
 
index fe52357f9ef95d7e9654bd7c796daeb50a61bbc7..12e86609004c992de19e056ff95352967b4d18df 100644 (file)
@@ -1,7 +1,8 @@
-! Copyright (C) 2004, 2009 Slava Pestov.
+! Copyright (C) 2004, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel io effects namespaces sequences quotations vocabs
-vocabs.loader generic words stack-checker.backend stack-checker.state
+USING: accessors kernel io effects namespaces sequences
+quotations vocabs vocabs.loader generic words
+stack-checker.backend stack-checker.state
 stack-checker.known-words stack-checker.transforms
 stack-checker.errors stack-checker.inlining
 stack-checker.visitor.dummy ;
@@ -15,3 +16,7 @@ M: callable infer ( quot -- effect )
 : infer. ( quot -- )
     #! Safe to call from inference transforms.
     infer effect>string print ;
+
+: inputs ( quot -- n ) infer in>> length ;
+
+: outputs ( quot -- n ) infer out>> length ;
index 1c527abfe49e63eb59f6ae889dd3911fb82049af..f0b595ebe5c2ebfa4f54be0a36f65fa7312ad223 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: assocs arrays namespaces sequences kernel definitions
 math effects accessors words fry classes.algebra
@@ -38,7 +38,9 @@ SYMBOL: literals
 : current-stack-height ( -- n ) meta-d length input-count get - ;
 
 : current-effect ( -- effect )
-    input-count get meta-d length terminated? get effect boa ;
+    input-count get "x" <array>
+    meta-d length "x" <array>
+    terminated? get effect boa ;
 
 : init-inference ( -- )
     terminated? off
index 51032264c7ad4c50aafdf4f50e8b02afcd6334c1..19d0051d176a6008fd92b0f955bee142a236adb2 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2009 Slava Pestov.
+! Copyright (C) 2009, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel sequences fry math.order splitting ;
 IN: strings.tables
@@ -6,7 +6,7 @@ IN: strings.tables
 <PRIVATE
 
 : map-last ( seq quot -- seq )
-    [ dup length <reversed> ] dip '[ 0 = @ ] 2map ; inline
+    [ dup length iota <reversed> ] dip '[ 0 = @ ] 2map ; inline
 
 : max-length ( seq -- n )
     [ length ] [ max ] map-reduce ;
index f486adcb32e27f882289eb4a6b4b567c41706126..134c144fda07442be067257492139cfb21299452 100644 (file)
@@ -7,7 +7,7 @@ IN: suffix-arrays
 <PRIVATE
 
 : suffixes ( string -- suffixes-seq )
-    dup length [ tail-slice ] with map ;
+    dup length iota [ tail-slice ] with map ;
 
 : prefix<=> ( begin seq -- <=> )
     [ <=> ] [ swap head? ] 2bi [ drop +eq+ ] when ;
index f9196e295186e23f49012eb73376d09929dcc905..4568b7c491c76cf73b077f5ffdd3108107ed076c 100644 (file)
@@ -1,6 +1,6 @@
 USING: namespaces io tools.test threads kernel
 concurrency.combinators concurrency.promises locals math
-words calendar ;
+words calendar sequences ;
 IN: threads.tests
 
 3 "x" set
@@ -20,7 +20,7 @@ yield
 [ f ] [ f get-global ] unit-test
 
 { { 0 3 6 9 12 15 18 21 24 27 } } [
-    10 [
+    10 iota [
         0 "i" tset
         [
             "i" [ yield 3 + ] tchange
index 9d1cd29337665b60434c6e1979965b2619a45a92..952652d801dbeeb036e200ef1337694732eb4165 100644 (file)
@@ -21,7 +21,7 @@ mailbox
 variables
 sleep-entry ;
 
-: self ( -- thread ) 63 getenv ; inline
+: self ( -- thread ) 63 special-object ; inline
 
 ! Thread-local storage
 : tnamespace ( -- assoc )
@@ -36,7 +36,7 @@ sleep-entry ;
 : tchange ( key quot -- )
     tnamespace swap change-at ; inline
 
-: threads ( -- assoc ) 64 getenv ;
+: threads ( -- assoc ) 64 special-object ;
 
 : thread ( id -- thread ) threads at ;
 
@@ -61,7 +61,7 @@ ERROR: not-running thread ;
 : unregister-thread ( thread -- )
     check-registered id>> threads delete-at ;
 
-: set-self ( thread -- ) 63 setenv ; inline
+: set-self ( thread -- ) 63 set-special-object ; inline
 
 PRIVATE>
 
@@ -75,9 +75,9 @@ PRIVATE>
 : <thread> ( quot name -- thread )
     \ thread new-thread ;
 
-: run-queue ( -- dlist ) 65 getenv ;
+: run-queue ( -- dlist ) 65 special-object ;
 
-: sleep-queue ( -- heap ) 66 getenv ;
+: sleep-queue ( -- heap ) 66 special-object ;
 
 : resume ( thread -- )
     f >>state
@@ -216,9 +216,9 @@ GENERIC: error-in-thread ( error thread -- )
 <PRIVATE
 
 : init-threads ( -- )
-    H{ } clone 64 setenv
-    <dlist> 65 setenv
-    <min-heap> 66 setenv
+    H{ } clone 64 set-special-object
+    <dlist> 65 set-special-object
+    <min-heap> 66 set-special-object
     initial-thread global
     [ drop [ ] "Initial" <thread> ] cache
     <box> >>continuation
index ea02aa03c9d6327ca0ccc683339cf12d3711aaac..06009992adaac802bb094ed15126a3cf30736b99 100644 (file)
@@ -393,7 +393,7 @@ IN: tools.deploy.shaker
         '[ drop _ member? not ] assoc-filter
         [ drop string? not ] assoc-filter ! strip CLI args
         sift-assoc
-        21 setenv
+        21 set-special-object
     ] [ drop ] if ;
 
 : strip-c-io ( -- )
@@ -518,7 +518,7 @@ SYMBOL: deploy-vocab
     strip-c-io
     strip-default-methods
     strip-compiler-classes
-    f 5 setenv ! we can't use the Factor debugger or Factor I/O anymore
+    f 5 set-special-object ! we can't use the Factor debugger or Factor I/O anymore
     deploy-vocab get vocab-main deploy-startup-quot
     find-megamorphic-caches
     stripped-word-props
index d5c5bd54da5d5692a529f8ca2da9b0249279713f..7bb2f651dc2da794c00c92814f3b3ba460365008 100644 (file)
@@ -17,7 +17,7 @@ IN: cocoa.application
 
 : objc-error ( error -- ) die ;
 
-[ [ die ] 19 setenv ] "cocoa.application" add-startup-hook
+[ [ die ] 19 set-special-object ] "cocoa.application" add-startup-hook
 
 H{ } clone \ pool [
     global [
index f75adcbf04d6944b670346f7813ef0a921b2e819..690103edf5eeb2a0ca8ee22e1c62d805188182ed 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: byte-arrays strings sequences sequences.private ascii
 fry kernel words parser lexer assocs math math.order summary ;
@@ -17,7 +17,7 @@ M: bad-tr summary
     [ [ ascii? ] all? ] both? [ bad-tr ] unless ;
 
 : compute-tr ( quot from to -- mapping )
-    [ 128 ] 3dip zip
+    [ 128 iota ] 3dip zip
     '[ [ _ call( x -- y ) _ at ] keep or ] B{ } map-as ; inline
 
 : tr-hints ( word -- )
index 92e7541616f3507d05075fa5a7ec5d04d38db358..1bc62705247606841eb01af36b34cc9593d375fe 100644 (file)
@@ -10,7 +10,7 @@ IN: tuple-arrays
 
 MACRO: boa-unsafe ( class -- quot ) tuple-layout '[ _ <tuple-boa> ] ;
 
-MACRO: infer-in ( class -- quot ) infer in>> '[ _ ] ;
+MACRO: infer-in ( class -- quot ) inputs '[ _ ] ;
 
 : tuple-arity ( class -- quot ) '[ _ boa ] infer-in ; inline
 
@@ -28,7 +28,7 @@ MACRO: infer-in ( class -- quot ) infer in>> '[ _ ] ;
 
 MACRO: write-tuple ( class -- quot )
     [ '[ [ _ boa ] undo ] ]
-    [ tuple-arity <reversed> [ '[ [ _ ] dip set-nth-unsafe ] ] map '[ _ cleave ] ]
+    [ tuple-arity iota <reversed> [ '[ [ _ ] dip set-nth-unsafe ] ] map '[ _ cleave ] ]
     bi '[ _ dip @ ] ;
 
 PRIVATE>
index d7f77d9e549301c9bd19ce58b763ac47165eda80..ea16abb9bae6ba80697f68042a5e483800086216 100644 (file)
@@ -123,7 +123,7 @@ M: mock-gadget ungraft*
             <mock-gadget> over <model> >>model
             "g" get over add-gadget drop
             swap 1 + number>string set
-        ] each ;
+        ] each-integer ;
 
     : status-flags ( -- seq )
         { "g" "1" "2" "3" } [ get graft-state>> ] map prune ;
index b49f46c05a9e4429533f9a0c4cc8fdcd45f9f743..7ca83ce465c1ba3e6fd8ebb24d661a53f3e15ff7 100644 (file)
@@ -1,14 +1,14 @@
 USING: ui.gadgets.packs ui.gadgets.packs.private
 ui.gadgets.labels ui.gadgets ui.gadgets.debug ui.render
 ui.baseline-alignment kernel namespaces tools.test math.parser
-sequences math.rectangles accessors ;
+sequences math.rectangles accessors math ;
 IN: ui.gadgets.packs.tests
 
 [ t ] [
     { 0 0 } { 100 100 } <rect> clip set
 
     <pile>
-        100 [ number>string <label> add-gadget ] each
+        100 [ number>string <label> add-gadget ] each-integer
     dup layout
 
     visible-children [ label? ] all?
index 01abe8b3d958c0175ee1f81b2a7be511fc65a917..847e14df8a07aba9da31061cfa505085710951ae 100644 (file)
@@ -12,7 +12,7 @@ IN: ui.gadgets.panes.tests
 [ ] [ #children "num-children" set ] unit-test
 
 [ ] [
-    "pane" get <pane-stream> [ 100 [ . ] each ] with-output-stream*
+    "pane" get <pane-stream> [ 100 [ . ] each-integer ] with-output-stream*
 ] unit-test
 
 [ t ] [ #children "num-children" get = ] unit-test
index 5f5cc91846cd1a5649a550ff03b6bd81f0910d14..c89461cd5ab01d218238199692632e35a46c6072 100644 (file)
@@ -70,7 +70,7 @@ dup layout
 "s" set
 
 [ t ] [
-    10 [
+    10 iota [
         drop
         "g2" get scroll>gadget
         "s" get layout
index e49c60a3ed21458d264e0b24abc5c5be21b6bcb3..f1b856949c05024b16b91318d67161504a96d930 100644 (file)
@@ -1,4 +1,4 @@
 IN: ui.gadgets.slots.tests
 USING: assocs ui.gadgets.slots tools.test refs ;
 
-[ t ] [ [ ] [ ] { 1 2 3 } 2 <value-ref> <slot-editor> slot-editor? ] unit-test
+[ t ] [ [ ] [ ] { { 1 1 } { 2 2 } { 3 3 } } 2 <value-ref> <slot-editor> slot-editor? ] unit-test
index 63134b3c8e6a91026031f9430b08f8ebf1a07f5a..22802d39aee565d29a34af5f8e8843fd669cc3f0 100644 (file)
@@ -1,4 +1,24 @@
-! Copyright (C) 2009 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: tools.test ui.pens.gradient ;
+USING: tools.test ui.pens.gradient ui.pens.gradient.private
+colors.constants specialized-arrays alien.c-types ;
+SPECIALIZED-ARRAY: float
 IN: ui.pens.gradient.tests
+
+[
+    float-array{
+        0.0
+        0.0
+        0.0
+        100.0
+        50.0
+        0.0
+        50.0
+        100.0
+        100.0
+        0.0
+        100.0
+        100.0
+    }
+] [
+    { 1 0 } { 100 100 } { COLOR: red COLOR: green COLOR: blue }
+    gradient-vertices
+] unit-test
index 7f7bd02204884598504d9fc1644108186b3adec8..fbf190a218fcf4a7e5d22495a4d906c4368e0167 100644 (file)
@@ -16,7 +16,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 [ iota ] [ 1 - ] bi v/n [ v*n ] with map
     swap [ over v+ 2array ] curry map
     concat concat >float-array ;
 
index bbce857681bd17540a928ce624a8eff2ffae4fd5..0311b43474860111105d812f62fe4b5eec0c9f97 100644 (file)
@@ -27,7 +27,12 @@ IN: unicode.breaks.tests
     utf8 file-lines
     [ "#" split1 drop ] map harvest [
         "÷" split
-        [ "×" split [ [ blank? ] trim hex> ] map harvest >string ] map
+        [
+            "×" split
+            [ [ blank? ] trim hex> ] map
+            [ { f 0 } member? not ] filter
+            >string
+        ] map
         harvest
     ] map ;
 
@@ -46,4 +51,4 @@ IN: unicode.breaks.tests
 grapheme-break-test parse-test-file [ >graphemes ] test
 word-break-test parse-test-file [ >words ] test
 
-[ { t f t t f t } ] [ 6 [ "as df" word-break-at? ] map ] unit-test
+[ { t f t t f t } ] [ 6 iota [ "as df" word-break-at? ] map ] unit-test
index 7c7b8a1f50771499672eb752680021570141ccd4..46651bd7de8c1f2a345c7dc742e115d3f403ce95 100644 (file)
@@ -74,14 +74,14 @@ SYMBOL: table
   
 : make-grapheme-table ( -- )
     { CR } { LF } connect
-    { Control CR LF } graphemes disconnect
-    graphemes { Control CR LF } disconnect
+    { Control CR LF } graphemes iota disconnect
+    graphemes iota { Control CR LF } disconnect
     { L } { L V LV LVT } connect
     { LV V } { V T } connect
     { LVT T } { T } connect
-    graphemes { Extend } connect
-    graphemes { SpacingMark } connect
-    { Prepend } graphemes connect ;
+    graphemes iota { Extend } connect
+    graphemes iota { SpacingMark } connect
+    { Prepend } graphemes iota connect ;
 
 VALUE: grapheme-table
 
@@ -154,8 +154,8 @@ SYMBOL: check-number-after
 
 : make-word-table ( -- )
     { wCR } { wLF } connect
-    { wNewline wCR wLF } words disconnect
-    words { wNewline wCR wLF } disconnect
+    { wNewline wCR wLF } words iota disconnect
+    words iota { wNewline wCR wLF } disconnect
     { wALetter } { wMidLetter wMidNumLet } check-letter-after set-table
     { wMidLetter wMidNumLet } { wALetter } check-letter-before set-table
     { wNumeric wALetter } { wNumeric wALetter } connect
@@ -252,7 +252,7 @@ PRIVATE>
     over tail-slice first-word + ;
 
 : last-word ( str -- i )
-    [ length ] keep '[ _ word-break-at? ] find-last drop 0 or ;
+    [ length iota ] keep '[ _ word-break-at? ] find-last drop 0 or ;
 
 : last-word-from ( end str -- i )
     swap head-slice last-word ;
index ea0487c703525e8c9b311ebdf8f7e5484e3ca269..dc3cd89b51097f5b6cfcdd50a486b444e512d1b5 100644 (file)
@@ -82,7 +82,7 @@ ducet insert-helpers
 \r
 : add ( char -- )\r
     dup blocked? [ 1string , ] [\r
-        dup possible-bases dup length\r
+        dup possible-bases dup length iota\r
         [ ?combine ] with with any?\r
         [ drop ] [ 1string , ] if\r
     ] if ;\r
index 1c6c6afdf35711473774469afc0cc9e116e0a907..24dfba6be02dab57ec4a1f89bd091c22d67b7529 100644 (file)
@@ -108,7 +108,8 @@ PRIVATE>
 
 : exclusions ( -- set )
     exclusions-file utf8 file-lines
-    [ "#" split1 drop [ blank? ] trim-tail hex> ] map harvest ;
+    [ "#" split1 drop [ blank? ] trim-tail hex> ] map
+    [ 0 = not ] filter ;
 
 : remove-exclusions ( alist -- alist )
     exclusions [ dup ] H{ } map>assoc assoc-diff ;
index a672c850d29914a8cacab1b40dc4d371e0e7b243..e9cb9d59188aca5fc0ab8a95a883df54fffe770f 100644 (file)
@@ -1,11 +1,11 @@
-! Copyright (C) 2005, 2008 Slava Pestov.
+! Copyright (C) 2005, 2010 Slava Pestov.
 ! Copyright (C) 2008 Eduardo Cavazos.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: alien alien.c-types alien.syntax kernel libc
-sequences continuations byte-arrays strings math namespaces
-system combinators vocabs.loader accessors
-stack-checker macros locals generalizations unix.types
-io vocabs classes.struct unix.time alien.libraries ;
+USING: alien alien.c-types alien.syntax kernel libc sequences
+continuations byte-arrays strings math namespaces system
+combinators combinators.smart vocabs.loader accessors
+stack-checker macros locals generalizations unix.types io vocabs
+classes.struct unix.time alien.libraries ;
 IN: unix
 
 CONSTANT: PROT_NONE   0
@@ -48,7 +48,7 @@ ERROR: unix-error errno message ;
 ERROR: unix-system-call-error args errno message word ;
 
 MACRO:: unix-system-call ( quot -- )
-    quot infer in>> :> n
+    quot inputs :> n
     quot first :> word
     [
         n ndup quot call dup 0 < [
index 89eb1cdebd48a923595818bfee3d8194d601ea93..8eadfb9cbfebff667807a7980f124ea31858522a 100644 (file)
@@ -1,5 +1,5 @@
 USING: unrolled-lists tools.test deques kernel sequences
-random prettyprint grouping ;
+random prettyprint grouping math ;
 IN: unrolled-lists.tests
 
 [ 1 ] [ <unrolled-list> 1 over push-front pop-front ] unit-test
@@ -35,14 +35,14 @@ IN: unrolled-lists.tests
 
 [ { 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 } ] [
     <unrolled-list>
-    32 [ over push-front ] each
+    32 [ over push-front ] each-integer
     32 [ dup pop-back ] replicate
     nip
 ] unit-test
 
 [ { 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 } ] [
     <unrolled-list>
-    32 [ over push-front ] each
+    32 [ over push-front ] each-integer
     32 [ dup pop-front ] replicate reverse
     nip
 ] unit-test
@@ -51,7 +51,7 @@ IN: unrolled-lists.tests
     <unrolled-list>
     1000 [ 1000 random ] replicate
     [ [ over push-front ] each ]
-    [ [ dup pop-back ] replicate ]
+    [ length [ dup pop-back ] replicate ]
     [ ]
     tri
     =
@@ -64,7 +64,7 @@ IN: unrolled-lists.tests
     [
         10 group [
             [ [ over push-front ] each ]
-            [ [ dup pop-back ] replicate ]
+            [ length [ dup pop-back ] replicate ]
             bi 
         ] map concat
     ] keep
index 20428c40f3b5dbea4ea518769cd5bfdaa2d405a5..cc4a291a8b089922fda2dd93bb77174c2e827e1d 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2009 Phil Dawes.
+! Copyright (C) 2009, 2010 Phil Dawes, Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: classes.struct alien.c-types alien.syntax ;
 IN: vm
@@ -30,7 +30,7 @@ STRUCT: vm
 { nursery zone }
 { cards-offset cell }
 { decks-offset cell }
-{ userenv cell[70] } ;
+{ special-objects cell[70] } ;
 
 : vm-field-offset ( field -- offset ) vm offset-of ; inline
 
index dfe12aaf3c21e7147e017400933ac2f33e2c4cbe..904c85200e583509959a70edf683461f5815ed8f 100644 (file)
@@ -8,8 +8,7 @@ IN: windows.time
 : >64bit ( lo hi -- n )
     32 shift bitor ; inline
 
-: windows-1601 ( -- timestamp )
-    1601 1 1 0 0 0 instant <timestamp> ;
+: windows-1601 ( -- timestamp ) 1601 <year-gmt> ;
 
 : FILETIME>windows-time ( FILETIME -- n )
     [ dwLowDateTime>> ] [ dwHighDateTime>> ] bi >64bit ;
index 55b5147abba72a48b0bbddc5bb3e719e4a0e0de1..2cbc5890b16da57b5239cb54b7918889532f6da1 100644 (file)
@@ -1,6 +1,7 @@
-USING: accessors assocs combinators continuations fry generalizations
-io.pathnames kernel macros sequences stack-checker tools.test xml
-xml.traversal xml.writer arrays xml.data ; 
+USING: accessors assocs combinators combinators.smart
+continuations fry generalizations io.pathnames kernel macros
+sequences stack-checker tools.test xml xml.traversal xml.writer
+arrays xml.data ;
 IN: xml.tests.suite
 
 TUPLE: xml-test id uri sections description type ;
@@ -19,14 +20,11 @@ TUPLE: xml-test id uri sections description type ;
 
 CONSTANT: base "vocab:xml/tests/xmltest/"
 
-MACRO: drop-output ( quot -- newquot )
-    dup infer out>> '[ @ _ ndrop ] ;
-
-MACRO: drop-input ( quot -- newquot )
-    infer in>> '[ _ ndrop ] ;
+MACRO: drop-inputs ( quot -- newquot )
+    inputs '[ _ ndrop ] ;
 
 : fails? ( quot -- ? )
-    [ drop-output f ] [ nip drop-input t ] bi-curry recover ; inline
+    [ drop-outputs f ] [ nip drop-inputs t ] bi-curry recover ; inline
 
 : well-formed? ( uri -- answer )
     [ file>xml ] fails? "not-wf" "valid" ? ;
index beb5983b5a61ce1f1158736e3bd0212b6de9f60d..ef8420d66c8012199bf001a55c9069ad63749e87 100644 (file)
@@ -95,7 +95,7 @@ HINTS: next* { spot } ;
     get-char [ missing-close ] unless next ;
 
 : expect ( string -- )
-    dup spot get '[ _ [ char>> ] keep next* ] replicate
+    dup length spot get '[ _ [ char>> ] keep next* ] "" replicate-as
     2dup = [ 2drop ] [ expected ] if ;
 
 ! Suddenly XML-specific
index d090433d98e2fe705bcdc39826292362d0c65f49..c2775f435afb114d67af0f1123ce340f46a7237c 100755 (executable)
@@ -25,9 +25,9 @@ test_program_installed() {
 
 exit_script() {
     if [[ $FIND_MAKE_TARGET -eq true ]] ; then
-               echo $MAKE_TARGET;
-       fi
-       exit $1
+        echo $MAKE_TARGET;
+    fi
+    exit $1
 }
 
 ensure_program_installed() {
@@ -347,8 +347,8 @@ update_script_name() {
 
 update_script() {
     update_script=`update_script_name`
-    
-    echo "#!/bin/sh" >"$update_script"
+    bash_path=`which bash`
+    echo "#!$bash_path" >"$update_script"
     echo "git pull \"$GIT_URL\" master" >>"$update_script"
     echo "if [[ \$? -eq 0 ]]; then exec \"$0\" $SCRIPT_ARGS; else echo \"git pull failed\"; exit 2; fi" \
         >>"$update_script"
@@ -433,7 +433,7 @@ make_factor() {
 update_boot_images() {
     echo "Deleting old images..."
     $DELETE checksums.txt* > /dev/null 2>&1
-       # delete boot images with one or two characters after the dot
+    # delete boot images with one or two characters after the dot
     $DELETE $BOOT_IMAGE.{?,??} > /dev/null 2>&1
     $DELETE temp/staging.*.image > /dev/null 2>&1
     if [[ -f $BOOT_IMAGE ]] ; then
index 8e09fa8c2c24ea6b9563d37be834d49602c5df7f..15e0370ba081daa8f2ed53b25bf5da83e81920fb 100644 (file)
@@ -67,6 +67,6 @@ M: string string>symbol string>symbol* ;
 M: sequence string>symbol [ string>symbol* ] map ;
 
 [
-    8 getenv utf8 alien>string string>cpu \ cpu set-global
-    9 getenv utf8 alien>string string>os \ os set-global
+    8 special-object utf8 alien>string string>cpu \ cpu set-global
+    9 special-object utf8 alien>string string>os \ os set-global
 ] "alien.strings" add-startup-hook
index e441855ed1929ba011a029a72004d257dcddcf9c..7b50d7c443232d3943f0c6c7be56d8f3d6bb0e45 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2007, 2009 Daniel Ehrenberg, Slava Pestov
+! Copyright (C) 2007, 2010 Daniel Ehrenberg, Slava Pestov
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel sequences arrays math sequences.private vectors
 accessors ;
@@ -225,7 +225,7 @@ M: enum set-at seq>> set-nth ; inline
 M: enum delete-at seq>> remove-nth! drop ; inline
 
 M: enum >alist ( enum -- alist )
-    seq>> [ length ] keep zip ; inline
+    seq>> [ length iota ] keep zip ; inline
 
 M: enum assoc-size seq>> length ; inline
 
index a0b278c7a4f3ece423e077144daac38cad7ce2b3..2a791bf42dae9db130e23c39802c9e4423b1f2df 100644 (file)
@@ -421,8 +421,8 @@ tuple
     { "float-u>=" "math.private" (( x y -- ? )) }
     { "(word)" "words.private" (( name vocab -- word )) }
     { "word-xt" "words" (( word -- start end )) }
-    { "getenv" "kernel.private" (( n -- obj )) }
-    { "setenv" "kernel.private" (( obj n -- )) }
+    { "special-object" "kernel.private" (( n -- obj )) }
+    { "set-special-object" "kernel.private" (( obj n -- )) }
     { "(exists?)" "io.files.private" (( path -- ? )) }
     { "minor-gc" "memory" (( -- )) }
     { "gc" "memory" (( -- )) }
index fdf4ab6aca99c6c4600a20d76ae80abbf36d5b14..286b7c419e101749edc59c51ca2b838c9157aa36 100644 (file)
@@ -1,11 +1,11 @@
 USING: tools.test byte-vectors vectors sequences kernel\r
-prettyprint ;\r
+prettyprint math ;\r
 IN: byte-vectors.tests\r
 \r
 [ 0 ] [ 123 <byte-vector> length ] unit-test\r
 \r
 : do-it ( seq -- seq )\r
-    123 [ over push ] each ;\r
+    123 [ over push ] each-integer ;\r
 \r
 [ t ] [\r
     3 <byte-vector> do-it\r
index c016b0169bf22808088a86abbd700c94c738fa78..11cb11d334c4f692e1d9789ee96f4d58969c54dc 100644 (file)
@@ -206,7 +206,6 @@ INSTANCE: union-with-one-member mixin-with-one-member
 \r
 ! class<=>\r
 \r
-[ +lt+ ] [ integer sequence class<=> ] unit-test\r
 [ +lt+ ] [ sequence object class<=> ] unit-test\r
 [ +gt+ ] [ object sequence class<=> ] unit-test\r
 [ +eq+ ] [ integer integer class<=> ] unit-test\r
@@ -266,7 +265,7 @@ INSTANCE: union-with-one-member mixin-with-one-member
 10 [\r
     [ ] [\r
         20 [ random-op ] [ ] replicate-as\r
-        [ infer in>> [ random-class ] times ] keep\r
+        [ infer in>> length [ random-class ] times ] keep\r
         call\r
         drop\r
     ] unit-test\r
@@ -300,7 +299,7 @@ INSTANCE: union-with-one-member mixin-with-one-member
 20 [\r
     [ t ] [\r
         20 [ random-boolean-op ] [ ] replicate-as dup .\r
-        [ infer in>> [ random-boolean ] replicate dup . ] keep\r
+        [ infer in>> length [ random-boolean ] replicate dup . ] keep\r
         \r
         [ [ [ ] each ] dip call ] 2keep\r
         \r
index 2bef1a568a1b3dd99d6b350aa56cb56e11a56963..55cc55c3341a315882fe22884ab8f2e29f857a29 100644 (file)
@@ -11,7 +11,9 @@ IN: combinators
 
 : execute-effect-unsafe ( word effect -- ) drop execute ;
 
-M: object throw 5 getenv [ die ] or (( error -- * )) call-effect-unsafe ;
+M: object throw
+    5 special-object [ die ] or
+    (( error -- * )) call-effect-unsafe ;
 
 PRIVATE>
 
index 996a6e9bd46b828f8b1dcef0719bde219285209d..a64080e510afce7f0a888dcc1acf196d9efe3c29 100644 (file)
@@ -100,7 +100,7 @@ GENERIC: definitions-changed ( assoc obj -- )
 ! Incremented each time stack effects potentially changed, used
 ! by compiler.tree.propagation.call-effect for call( and execute(
 ! inline caching
-: effect-counter ( -- n ) 47 getenv ; inline
+: effect-counter ( -- n ) 47 special-object ; inline
 
 GENERIC: bump-effect-counter* ( defspec -- ? )
 
@@ -132,7 +132,11 @@ M: object bump-effect-counter* drop f ;
     or ;
 
 : bump-effect-counter ( -- )
-    bump-effect-counter? [ 47 getenv 0 or 1 + 47 setenv ] when ;
+    bump-effect-counter? [
+        47 special-object 0 or
+        1 +
+        47 set-special-object
+    ] when ;
 
 : notify-observers ( -- )
     updated-definitions dup assoc-empty?
index a2617d0ebbfda4df8da27e91fde0b5f9e167a1f9..988be0dd88a6bf3c5257cec15fed13fbec127cd3 100644 (file)
@@ -22,7 +22,7 @@ IN: continuations.tests
         ] with-scope
     ] callcc0 "x" get 5 = ;
 
-[ t ] [ 10 callcc1-test 10 reverse >vector = ] unit-test
+[ t ] [ 10 callcc1-test 10 iota reverse >vector = ] unit-test
 [ t ] [ callcc-namespace-test ] unit-test
 
 [ 5 throw ] [ 5 = ] must-fail-with
index 02c129aefee0e75eaf01a2f1a39b01169c7f1200..d63acae8836213fbbef3ae6ad5431717f06e55fa 100644 (file)
@@ -13,7 +13,7 @@ SYMBOL: restarts
 <PRIVATE
 
 : catchstack* ( -- catchstack )
-    1 getenv { vector } declare ; inline
+    1 special-object { vector } declare ; inline
 
 : >c ( continuation -- ) catchstack* push ;
 
@@ -23,13 +23,13 @@ SYMBOL: restarts
 : dummy-1 ( -- obj ) f ;
 : dummy-2 ( obj -- obj ) dup drop ;
 
-: init-catchstack ( -- ) V{ } clone 1 setenv ;
+: init-catchstack ( -- ) V{ } clone 1 set-special-object ;
 
 PRIVATE>
 
 : catchstack ( -- catchstack ) catchstack* clone ; inline
 
-: set-catchstack ( catchstack -- ) >vector 1 setenv ; inline
+: set-catchstack ( catchstack -- ) >vector 1 set-special-object ; inline
 
 TUPLE: continuation data call retain name catch ;
 
@@ -71,12 +71,12 @@ PRIVATE>
 
 : continue-with ( obj continuation -- * )
     [
-        swap 4 setenv
+        swap 4 set-special-object
         >continuation<
         set-catchstack
         set-namestack
         set-retainstack
-        [ set-datastack drop 4 getenv f 4 setenv f ] dip
+        [ set-datastack drop 4 special-object f 4 set-special-object f ] dip
         set-callstack
     ] (( obj continuation -- * )) call-effect-unsafe ;
 
@@ -173,12 +173,12 @@ M: condition compute-restarts
     ! VM calls on error
     [
         ! 63 = self
-        63 getenv error-thread set-global
+        63 special-object error-thread set-global
         continuation error-continuation set-global
         rethrow
-    ] 5 setenv
+    ] 5 set-special-object
     ! VM adds this to kernel errors, so that user-space
     ! can identify them
-    "kernel-error" 6 setenv ;
+    "kernel-error" 6 set-special-object ;
 
 PRIVATE>
index 38b8ab4dad2986985777795cdb52f4dc9891e200..134faea0270bc5f10adeb087e2d828f4d2e41d8c 100644 (file)
@@ -56,7 +56,7 @@ HELP: effect>string
 { $values { "obj" object } { "str" string } }
 { $description "Turns a stack effect object into a string mnemonic." }
 { $examples
-    { $example "USING: effects io ;" "1 2 <effect> effect>string print" "( object -- object object )" }
+    { $example "USING: effects io ;" "{ \"x\" } { \"y\" \"z\" } <effect> effect>string print" "( x -- y z )" }
 } ;
 
 HELP: stack-effect
index 8adef62795081e24116fde8d3a1c4bb96b3f1f44..ffc0c9780b27daeeb35dca386d6fa3112607bd32 100644 (file)
@@ -2,11 +2,11 @@ USING: effects kernel tools.test prettyprint accessors
 quotations sequences ;
 IN: effects.tests
 
-[ t ] [ 1 1 <effect> 2 2 <effect> effect<= ] unit-test
-[ f ] [ 1 0 <effect> 2 2 <effect> effect<= ] unit-test
-[ t ] [ 2 2 <effect> 2 2 <effect> effect<= ] unit-test
-[ f ] [ 3 3 <effect> 2 2 <effect> effect<= ] unit-test
-[ f ] [ 2 3 <effect> 2 2 <effect> effect<= ] unit-test
+[ t ] [ { "a" } { "a" } <effect> { "a" "b" } { "a" "b" } <effect> effect<= ] unit-test
+[ f ] [ { "a" } { } <effect> { "a" "b" } { "a" "b" } <effect> effect<= ] unit-test
+[ t ] [ { "a" "b" } { "a" "b" } <effect> { "a" "b" } { "a" "b" } <effect> effect<= ] unit-test
+[ f ] [ { "a" "b" "c" } { "a" "b" "c" } <effect> { "a" "b" } { "a" "b" } <effect> effect<= ] unit-test
+[ f ] [ { "a" "b" } { "a" "b" "c" } <effect> { "a" "b" } { "a" "b" } <effect> effect<= ] unit-test
 [ 2 ] [ (( a b -- c )) in>> length ] unit-test
 [ 1 ] [ (( a b -- c )) out>> length ] unit-test
 
index 8c1699f8d654def0d58ae5bae2f4d2eb124e222c..1790399e04d2c47a964f98c52a8c608a98be2c99 100644 (file)
@@ -1,34 +1,33 @@
-! Copyright (C) 2006, 2009 Slava Pestov.
+! Copyright (C) 2006, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel math math.parser math.order namespaces make sequences strings
 words assocs combinators accessors arrays quotations ;
 IN: effects
 
-TUPLE: effect { in read-only } { out read-only } { terminated? read-only } ;
-
-GENERIC: effect-length ( obj -- n )
-M: sequence effect-length length ;
-M: integer effect-length ;
+TUPLE: effect
+{ in array read-only }
+{ out array read-only }
+{ terminated? read-only } ;
 
 : <effect> ( in out -- effect )
-    dup { "*" } sequence= [ drop { } t ] [ f ] if
+    dup { "*" } = [ drop { } t ] [ f ] if
     effect boa ;
 
 : effect-height ( effect -- n )
-    [ out>> effect-length ] [ in>> effect-length ] bi - ; inline
+    [ out>> length ] [ in>> length ] bi - ; inline
 
 : effect<= ( effect1 effect2 -- ? )
     {
         { [ over terminated?>> ] [ t ] }
         { [ dup terminated?>> ] [ f ] }
-        { [ 2dup [ in>> effect-length ] bi@ > ] [ f ] }
+        { [ 2dup [ in>> length ] bi@ > ] [ f ] }
         { [ 2dup [ effect-height ] bi@ = not ] [ f ] }
         [ t ]
     } cond 2nip ; inline
 
 : effect= ( effect1 effect2 -- ? )
-    [ [ in>> effect-length ] bi@ = ]
-    [ [ out>> effect-length ] bi@ = ]
+    [ [ in>> length ] bi@ = ]
+    [ [ out>> length ] bi@ = ]
     [ [ terminated?>> ] bi@ = ]
     2tri and and ;
 
@@ -40,7 +39,6 @@ M: integer effect>string number>string ;
 M: pair effect>string first2 [ effect>string ] bi@ ": " glue ;
 
 : stack-picture ( seq -- string )
-    dup integer? [ "object" <repetition> ] when
     [ [ effect>string % CHAR: \s , ] each ] "" make ;
 
 M: effect effect>string ( effect -- string )
@@ -56,10 +54,14 @@ M: effect effect>string ( effect -- string )
 GENERIC: effect>type ( obj -- type )
 M: object effect>type drop object ;
 M: word effect>type ;
-! attempting to specialize on callable breaks compiling
-! M: effect effect>type drop callable ;
 M: pair effect>type second effect>type ;
 
+: effect-in-types ( effect -- input-types )
+    in>> [ effect>type ] map ;
+
+: effect-out-types ( effect -- input-types )
+    out>> [ effect>type ] map ;
+
 GENERIC: stack-effect ( word -- effect/f )
 
 M: word stack-effect "declared-effect" word-prop ;
@@ -73,7 +75,7 @@ M: effect clone
     stack-effect effect-height ;
 
 : split-shuffle ( stack shuffle -- stack1 stack2 )
-    in>> effect-length cut* ;
+    in>> length cut* ;
 
 : shuffle-mapping ( effect -- mapping )
     [ out>> ] [ in>> ] bi [ index ] curry map ;
@@ -88,14 +90,9 @@ M: effect clone
     over terminated?>> [
         drop
     ] [
-        [ [ [ in>> effect-length ] [ out>> effect-length ] bi ] [ in>> effect-length ] bi* swap [-] + ]
-        [ [ out>> effect-length ] [ [ in>> effect-length ] [ out>> effect-length ] bi ] bi* [ [-] ] dip + ]
+        [ [ [ in>> length ] [ out>> length ] bi ] [ in>> length ] bi* swap [-] + ]
+        [ [ out>> length ] [ [ in>> length ] [ out>> length ] bi ] bi* [ [-] ] dip + ]
         [ nip terminated?>> ] 2tri
-        [ [ [ "obj" ] replicate ] bi@ ] dip
+        [ [ "x" <array> ] bi@ ] dip
         effect boa
     ] if ; inline
-
-: effect-in-types ( effect -- input-types )
-    in>> [ effect>type ] map ;
-: effect-out-types ( effect -- input-types )
-    out>> [ effect>type ] map ;
index dea523538eec6384d9b51179269d4c2e22d3581b..240fdd96e0aab3c1a3a899adabe8baa3f182fed7 100644 (file)
@@ -11,15 +11,13 @@ $nl
 { $code
     "GENERIC: explain ( object -- )"
     "M: object explain drop \"an object\" print ;"
-    "M: number explain drop \"a number\" print ;"
-    "M: sequence explain drop \"a sequence\" print ;"
+    "M: generic explain drop \"a class word\" print ;"
+    "M: class explain drop \"a generic word\" print ;"
 }
 "The linear order is the following, from least-specific to most-specific:"
-{ $code "{ object sequence number }" }
-"Neither " { $link number } " nor " { $link sequence } " are subclasses of each other, yet their intersection is the non-empty " { $link integer } " class. Calling " { $snippet "explain" } " with an integer on the stack will print " { $snippet "a number" } " because " { $link number } " precedes " { $link sequence } " in the class linearization order. If this was not the desired outcome, define a method on the intersection:"
-{ $code "M: integer explain drop \"an integer\" print ;" }
-"Now, the linear order is the following, from least-specific to most-specific:"
-{ $code "{ object sequence number integer }" }
+{ $code "{ object generic class }" }
+"Neither " { $link class } " nor " { $link generic } " are subclasses of each other, and their intersection is non-empty. Calling " { $snippet "explain" } " with a word on the stack that is both a class and a generic word will print " { $snippet "a generic word" } " because " { $link class } " precedes " { $link generic } " in the class linearization order. (One example of a word which is both a class and a generic word is the class of classes, " { $link class } ", which is also a word to get the class of an object.)"
+$nl
 "The " { $link order } " word can be useful to clarify method dispatch order:"
 { $subsections order } ;
 
index 05cc27f5e8bfc0e48e61ba4336de65717e7cd81f..541f98ab9ca3ecbe00ac4c3996f84343568d0346 100644 (file)
@@ -3,14 +3,12 @@ sequences.private hashtables io prettyprint assocs
 continuations ;
 IN: hashtables.tests
 
-[ f ] [ "hi" V{ 1 2 3 } at ] unit-test
-
 [ H{ } ] [ { } [ dup ] H{ } map>assoc ] unit-test
 
-[ ] [ 1000 [ dup sq ] H{ } map>assoc "testhash" set ] unit-test
+[ ] [ 1000 iota [ dup sq ] H{ } map>assoc "testhash" set ] unit-test
 
 [ V{ } ]
-[ 1000 [ dup sq swap "testhash" get at = not ] filter ]
+[ 1000 iota [ dup sq swap "testhash" get at = not ] filter ]
 unit-test
 
 [ t ]
@@ -118,7 +116,7 @@ H{ } clone "counting" set
 
 ! Resource leak...
 H{ } "x" set
-100 [ drop "x" get clear-assoc ] each
+100 [ drop "x" get clear-assoc ] each-integer
 
 ! Crash discovered by erg
 [ t ] [ 0.75 <hashtable> dup clone = ] unit-test
@@ -173,4 +171,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
+[ "A" ] [ 100 iota [ dup ] H{ } map>assoc 32 over delete-at "A" 32 pick set-at 32 swap at ] unit-test
index 40e5806fd594cdf9ccdfce2d60d17156e6cc887c..4e2d4b16a156f98b756d8c46760ff9309e8ec7d8 100644 (file)
@@ -27,12 +27,12 @@ shutdown-hooks global [ drop V{ } clone ] cache drop
 
 : boot ( -- ) init-namespaces init-catchstack init-error-handler ;
 
-: startup-quot ( -- quot ) 20 getenv ;
+: startup-quot ( -- quot ) 20 special-object ;
 
-: set-startup-quot ( quot -- ) 20 setenv ;
+: set-startup-quot ( quot -- ) 20 set-special-object ;
 
-: shutdown-quot ( -- quot ) 22 getenv ;
+: shutdown-quot ( -- quot ) 22 special-object ;
 
-: set-shutdown-quot ( quot -- ) 22 setenv ;
+: set-shutdown-quot ( quot -- ) 22 set-special-object ;
 
 [ do-shutdown-hooks ] set-shutdown-quot
index 088131acf9e0a0ba6c90a0ed2d99efc7b5509cc1..efebe7bd25431717da6a562a36012d87f3639bc0 100644 (file)
@@ -28,4 +28,4 @@ IN: io.encodings.utf8.tests
 
 [ 3 ] [ 2 "lápis" >utf8-index ] unit-test
 
-[ V{ } ] [ 100000 [ [ code-point-length ] [ 1string utf8 encode length ] bi = not ] filter ] unit-test
+[ V{ } ] [ 100000 iota [ [ code-point-length ] [ 1string utf8 encode length ] bi = not ] filter ] unit-test
index 9824fba18cdcb49c3cd1a903f12aaa44b3b38959..86d02acdd1721961de654c83bcc24a97794bb09e 100644 (file)
@@ -57,7 +57,7 @@ PRIVATE>
 
 [
     cwd current-directory set-global
-    13 getenv alien>native-string cwd prepend-path \ image set-global
-    14 getenv alien>native-string cwd prepend-path \ vm set-global
+    13 special-object alien>native-string cwd prepend-path \ image set-global
+    14 special-object alien>native-string cwd prepend-path \ vm set-global
     image parent-directory "resource-path" set-global
 ] "io.files" add-startup-hook
index cb978d5debb6589b0adaea3f65a54a56aa8ac726..d26f03aa5ee80e9279cf5a6e8334585572dd95ae 100644 (file)
@@ -61,9 +61,9 @@ M: c-reader stream-read-until
 
 M: c-io-backend init-io ;
 
-: stdin-handle ( -- alien ) 11 getenv ;
-: stdout-handle ( -- alien ) 12 getenv ;
-: stderr-handle ( -- alien ) 61 getenv ;
+: stdin-handle ( -- alien ) 11 special-object ;
+: stdout-handle ( -- alien ) 12 special-object ;
+: stderr-handle ( -- alien ) 61 special-object ;
 
 : init-c-stdio ( -- )
     stdin-handle <c-reader>
index 89ac1c9a05bd91740cca20570fc5bc60f5869f6c..7c80990d7a214d97353d53cc836329c12e6f5e4c 100644 (file)
@@ -655,13 +655,13 @@ HELP: tag ( object -- n )
 { $values { "object" object } { "n" "a tag number" } }
 { $description "Outputs an object's tag number, between zero and one less than " { $link num-types } ". This is implementation detail and user code should call " { $link class } " instead." } ;
 
-HELP: getenv ( n -- obj )
+HELP: special-object ( n -- obj )
 { $values { "n" "a non-negative integer" } { "obj" object } }
-{ $description "Reads an object from the Factor VM's environment table. User code never has to read the environment table directly; instead, use one of the callers of this word." } ;
+{ $description "Reads an object from the Factor VM's special object table. User code never has to read the special object table directly; instead, use one of the callers of this word." } ;
 
-HELP: setenv ( obj n -- )
+HELP: set-special-object ( obj n -- )
 { $values { "obj" object } { "n" "a non-negative integer" } }
-{ $description "Writes an object to the Factor VM's environment table. User code never has to write to the environment table directly; instead, use one of the callers of this word." } ;
+{ $description "Writes an object to the Factor VM's special object table. User code never has to write to the special object table directly; instead, use one of the callers of this word." } ;
 
 HELP: object
 { $class-description
index 05fe03315cc0ea603c396d384c38ed458d4555a7..5edb5d1d7271d16fc5583c6e5c94be7ad54ad8b7 100644 (file)
@@ -36,7 +36,7 @@ SYMBOL: header-bits
 ! We do this in its own compilation unit so that they can be
 ! folded below
 <<
-: cell ( -- n ) 7 getenv ; foldable
+: cell ( -- n ) 7 special-object ; foldable
 
 : (first-bignum) ( m -- n ) tag-bits get - 1 - 2^ ; foldable
 >>
index 220eb339606ae36704964dbe30e16e66c99dcbb5..84f993c5ac9a95dae1c149c22a7353909356dcdb 100644 (file)
@@ -1,4 +1,4 @@
-USING: kernel math math.constants tools.test sequences
+USING: kernel math math.constants math.order tools.test sequences
 grouping ;
 IN: math.floats.tests
 
@@ -58,7 +58,7 @@ unit-test
 
 [ 0 ] [ 1/0. >bignum ] unit-test
 
-[ t ] [ 64 [ 2^ 0.5 * ] map [ < ] monotonic? ] unit-test
+[ t ] [ 64 iota [ 2^ 0.5 * ] map [ < ] monotonic? ] unit-test
 
 [ 5 ] [ 10.5 1.9 /i ] unit-test
 
@@ -75,3 +75,6 @@ unit-test
 [ t ] [ -0.0 abs 0.0 fp-bitwise= ] unit-test
 [ 1.5 ] [ -1.5 abs ] unit-test
 [ 1.5 ] [ 1.5 abs ] unit-test
+
+[ 5.0 ] [ 3 5.0 max ] unit-test
+[ 3 ] [ 3 5.0 min ] unit-test
index bc419b94c52dde3c4ae9d3d5db0a4e9595cf30d4..97c6f7fc87659b71869eb35eb2c33c684f4b6dfe 100644 (file)
@@ -1,6 +1,6 @@
-! Copyright (C) 2004, 2009 Slava Pestov, Joe Groff.
+! Copyright (C) 2004, 2010 Slava Pestov, Joe Groff.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel math math.private ;
+USING: kernel math math.private math.order ;
 IN: math.floats.private
 
 : float-unordered? ( x y -- ? ) [ fp-nan? ] bi@ or ;
@@ -29,6 +29,9 @@ M: float u<= float-u<= ; inline
 M: float u>  float-u> ; inline
 M: float u>= float-u>= ; inline
 
+M: float min over float? [ float-min ] [ call-next-method ] if ; inline
+M: float max over float? [ float-max ] [ call-next-method ] if ; inline
+
 M: float + float+ ; inline
 M: float - float- ; inline
 M: float * float* ; inline
index 30d1254082017b9fb539cc141ba8fc4daa1e062a..3f3ea7ba1bd0975df2192defafd6198556ffe5e5 100644 (file)
@@ -1,5 +1,6 @@
-USING: kernel math math.functions namespaces prettyprint
-math.private continuations tools.test sequences random ;
+USING: kernel math math.functions math.order namespaces
+prettyprint math.private continuations tools.test sequences
+random ;
 IN: math.integers.tests
 
 [ "-8" ] [ -8 unparse ] unit-test
@@ -224,9 +225,12 @@ unit-test
         random-integer
         random-integer
         [ >float / ] [ /f ] 2bi 0.1 ~
-    ] all?
+    ] all-integers?
 ] unit-test
 
 ! Ensure that /f is accurate for fixnums > 2^53 on 64-bit platforms
 [ HEX: 1.758bec11492f9p-54 ] [ 1 12345678901234567 /f ] unit-test
 [ HEX: -1.758bec11492f9p-54 ] [ 1 -12345678901234567 /f ] unit-test
+
+[ 17 ] [ 17 >bignum 5 max ] unit-test
+[ 5 ] [ 17 >bignum 5 min ] unit-test
index eb94597160c68026ab6b7e8ae204715ecea16b39..e95c6d832b4591606a6bd75c8c84a5f4260950f7 100644 (file)
@@ -1,8 +1,8 @@
-! Copyright (C) 2004, 2009 Slava Pestov.
+! Copyright (C) 2004, 2010 Slava Pestov.
 ! Copyright (C) 2008, Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel kernel.private sequences
-sequences.private math math.private combinators ;
+USING: kernel kernel.private sequences sequences.private math
+math.private math.order combinators ;
 IN: math.integers.private
 
 : fixnum-min ( x y -- z ) [ fixnum< ] most ; foldable
@@ -29,6 +29,9 @@ M: fixnum u<= fixnum<= ; inline
 M: fixnum u> fixnum> ; inline
 M: fixnum u>= fixnum>= ; inline
 
+M: fixnum min over fixnum? [ fixnum-min ] [ call-next-method ] if ; inline
+M: fixnum max over fixnum? [ fixnum-max ] [ call-next-method ] if ; inline
+
 M: fixnum + fixnum+ ; inline
 M: fixnum - fixnum- ; inline
 M: fixnum * fixnum* ; inline
index e56753887c3211db0960cabb9281f2d57d65e7ce..6af48d00de19270d6c53f050cfb066a769d8d752 100644 (file)
@@ -283,7 +283,7 @@ HELP: unless-zero
 { $examples "This word is equivalent to " { $link if-zero } " with an empty first quotation:"
     { $example
     "USING: sequences math prettyprint ;"
-    "3 [ ] [ sq ] if-empty ."
+    "3 [ ] [ sq ] if-zero ."
     "9"
     }
     { $example
index 5d294c1f6f9edeb321a597734dd1867810ea7192..418107fcd158f9bf23c1054d0fa48fdb152ab817 100644 (file)
@@ -44,18 +44,18 @@ HELP: compare
 } ;
 
 HELP: max
-{ $values { "x" object } { "y" object } { "z" object } }
+{ $values { "obj1" object } { "obj2" object } { "obj" object } }
 { $description "Outputs the greatest of two ordered values." }
 { $notes "If one value is a floating point positive zero and the other is a negative zero, the result is undefined." } ;
 
 HELP: min
-{ $values { "x" object } { "y" object } { "z" object } }
+{ $values { "obj1" object } { "obj2" object } { "obj" object } }
 { $description "Outputs the smallest of two ordered values." }
 { $notes "If one value is a floating point positive zero and the other is a negative zero, the result is undefined." } ;
 
 HELP: clamp
 { $values { "x" object } { "min" object } { "max" object } { "y" object } }
-{ $description "Outputs " { $snippet "x" } " if contained in the interval " { $snippet "[min,max]" } " or outputs one of the endpoints." } ;
+{ $description "Outputs " { $snippet "x" } " if contained in the interval " { $snippet "[min,max]" } " or else outputs one of the endpoints." } ;
 
 HELP: between?
 { $values { "x" object } { "y" object } { "z" real } { "?" "a boolean" } }
index fe1454d1d873fab0b7f9a621dccdc95d0df531fb..499cf06e9a6394d04d514331a88dc7f2c2949580 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008 Slava Pestov, Doug Coleman.
+! Copyright (C) 2008, 2010 Slava Pestov, Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel math ;
 IN: math.order
@@ -32,8 +32,12 @@ M: real after? ( obj1 obj2 -- ? ) > ; inline
 M: real before=? ( obj1 obj2 -- ? ) <= ; inline
 M: real after=? ( obj1 obj2 -- ? ) >= ; inline
 
-: min ( x y -- z ) [ before? ] most ;
-: max ( x y -- z ) [ after? ] most ;
+GENERIC: min ( obj1 obj2 -- obj )
+GENERIC: max ( obj1 obj2 -- obj )
+
+M: object min [ before? ] most ; inline
+M: object max [ after? ] most ; inline
+
 : clamp ( x min max -- y ) [ max ] dip min ; inline
 
 : between? ( x y z -- ? )
index cd0bb47bd5b39bd2a06d760c2f9d2969074eb2c8..0d039f2fe97bc2e6f5e09c0182018d237cef3af2 100644 (file)
@@ -29,12 +29,12 @@ $nl
 ABOUT: "number-strings"
 
 HELP: digits>integer
-{ $values { "seq" "a sequence of integers" } { "radix" "an integer between 2 and 36" } { "n/f" { $maybe integer } } }
+{ $values { "seq" "a sequence of integers" } { "radix" "an integer between 2 and 16" } { "n/f" { $maybe integer } } }
 { $description "Converts a sequence of digits (with most significant digit first) into an integer." }
 { $notes "This is one of the factors of " { $link string>number } "." } ;
 
 HELP: >digit
-{ $values { "n" "an integer between 0 and 35" } { "ch" "a character" } }
+{ $values { "n" "an integer between 0 and 15" } { "ch" "a character" } }
 { $description "Outputs a character representation of a digit." }
 { $notes "This is one of the factors of " { $link number>string } "." } ;
 
@@ -44,7 +44,7 @@ HELP: digit>
 { $notes "This is one of the factors of " { $link string>number } "." } ;
 
 HELP: base>
-{ $values { "str" string } { "radix" "an integer between 2 and 36" } { "n/f" "a real number or " { $link f } } }
+{ $values { "str" string } { "radix" "an integer between 2 and 16" } { "n/f" "a real number or " { $link f } } }
 { $description "Creates a real number from a string representation with the given radix. The radix is ignored for floating point literals; they are always taken to be in base 10."
 $nl
 "Outputs " { $link f } " if the string does not represent a number." } ;
@@ -84,7 +84,7 @@ $nl
 { >hex POSTPONE: HEX: hex> .h } related-words
 
 HELP: >base
-{ $values { "n" real } { "radix" "an integer between 2 and 36" } { "str" string } }
+{ $values { "n" real } { "radix" "an integer between 2 and 16" } { "str" string } }
 { $description "Converts a real number into a string representation using the given radix. If the number is a float, the radix is ignored and the output is always in base 10." } ;
 
 HELP: >bin
index 9428445d267adb1d83321d1d4c01b143085012f5..40b1db8a3f39a83fcfb1955cd85ce3aaf3ab23e8 100644 (file)
@@ -6,7 +6,7 @@ IN: namespaces
 
 <PRIVATE
 
-: namestack* ( -- namestack ) 0 getenv { vector } declare ; inline
+: namestack* ( -- namestack ) 0 special-object { vector } declare ; inline
 : >n ( namespace -- ) namestack* push ;
 : ndrop ( -- ) namestack* pop* ;
 
@@ -14,8 +14,8 @@ PRIVATE>
 
 : namespace ( -- namespace ) namestack* last ; inline
 : namestack ( -- namestack ) namestack* clone ;
-: set-namestack ( namestack -- ) >vector 0 setenv ;
-: global ( -- g ) 21 getenv { hashtable } declare ; inline
+: set-namestack ( namestack -- ) >vector 0 set-special-object ;
+: global ( -- g ) 21 special-object { hashtable } declare ; inline
 : init-namespaces ( -- ) global 1array set-namestack ;
 : get ( variable -- value ) namestack* assoc-stack ; inline
 : set ( value variable -- ) namespace set-at ;
index d920e1fc734767adfc95c518d4688a8c59478fd8..1433289f0a59fd8c02cd2e9c81ce34f32783647c 100644 (file)
@@ -55,8 +55,11 @@ ERROR: staging-violation word ;
     execute( accum -- accum ) ;
 
 : scan-object ( -- object )
-    scan-word dup parsing-word?
-    [ V{ } clone swap execute-parsing first ] when ;
+    scan-word {
+        { [ dup not ] [ unexpected-eof ] }
+        { [ dup parsing-word? ] [ V{ } clone swap execute-parsing first ] }
+        [ ]
+    } cond  ;
 
 : parse-step ( accum end -- accum ? )
     scan-word {
index ac3f565e5678784473968c1b752eedb3780a5cec..6711870f74c585a956f6aa65f65463d1688177e6 100644 (file)
@@ -21,4 +21,4 @@ IN: sbufs.tests
 
 [ fixnum ] [ 1 >bignum SBUF" " new-sequence length class ] unit-test
 
-[ fixnum ] [ 1 >bignum [ ] SBUF" " map-as length class ] unit-test
+[ fixnum ] [ 1 >bignum iota [ ] SBUF" " map-as length class ] unit-test
index aeab243a2f60adf3cb7c0145aa7e6e09a2e44381..9f570f97d5af49645c975d0b328f05c8fadbafea 100644 (file)
@@ -999,7 +999,7 @@ HELP: pusher
      { "quot" quotation } { "accum" vector } }
 { $description "Creates a new vector to accumulate the values which return true for a predicate.  Returns a new quotation which accepts an object to be tested and stored in the accumulator if the test yields true. The accumulator is left on the stack for convenience." }
 { $example "! Find all the even numbers:" "USING: prettyprint sequences math kernel ;"
-           "10 [ even? ] pusher [ each ] dip ."
+           "10 iota [ even? ] pusher [ each ] dip ."
            "V{ 0 2 4 6 8 }"
 }
 { $notes "Used to implement the " { $link filter } " word. Compare this word with " { $link accumulator } ", which is an unfiltering version." } ;
@@ -1140,9 +1140,9 @@ HELP: set-fourth
 
 HELP: replicate
 { $values
-     { "seq" sequence } { "quot" { $quotation "( -- elt )" } }
+     { "len" integer } { "quot" { $quotation "( -- elt )" } }
      { "newseq" sequence } }
-{ $description "Calls the quotation for every element of the sequence in order. However, the element is not passed to the quotation -- it is dropped, and the quotation produces an element of its own that is collected into a sequence of the same class as the input sequence." }
+     { $description "Calls the quotation " { $snippet "len" } " times, collecting results into a new array." }
 { $examples 
     { $unchecked-example "USING: kernel prettyprint random sequences ;"
         "5 [ 100 random ] replicate ."
@@ -1152,15 +1152,16 @@ HELP: replicate
 
 HELP: replicate-as
 { $values
-     { "seq" sequence } { "quot" quotation } { "exemplar" sequence }
+     { "len" integer } { "quot" quotation } { "exemplar" sequence }
      { "newseq" sequence } }
-{ $description "Calls the quotation for every element of the sequence in order. However, the element is not passed to the quotation -- it is dropped, and the quotation produces an element of its own that is collected into a sequence of the same class as the exemplar sequence." }
+ { $description "Calls the quotation " { $snippet "len" } " times, collecting results into a new sequence of the same type as the exemplar sequence." }
 { $examples 
     { $unchecked-example "USING: prettyprint kernel sequences ;"
         "5 [ 100 random ] B{ } replicate-as ."
         "B{ 44 8 2 33 18 }"
     }
 } ;
+
 { replicate replicate-as } related-words
 
 HELP: partition
@@ -1240,7 +1241,7 @@ HELP: binary-reduce
 { $description "Like " { $link reduce } ", but splits the sequence in half recursively until each sequence is small enough, and calls the quotation on these smaller sequences. If the quotation computes values that depend on the size of their input, such as bignum arithmetic, then this algorithm can be more efficient than using " { $link reduce } "." }
 { $examples "Computing factorial:"
     { $example "USING: prettyprint sequences math ;"
-    "40 rest-slice 1 [ * ] binary-reduce ."
+    "40 iota rest-slice 1 [ * ] binary-reduce ."
     "20397882081197443358640281739902897356800000000" }
 } ;
 
@@ -1408,17 +1409,20 @@ ARTICLE: "virtual-sequences" "Virtual sequences"
 "A virtual sequence is an implementation of the " { $link "sequence-protocol" } " which does not store its own elements, and instead computes them, either from scratch or by retrieving them from another sequence."
 $nl
 "Implementations include the following:"
-{ $subsections reversed slice iota }
-"Virtual sequences can be implemented with the " { $link "virtual-sequences-protocol" } ", by translating an index in the virtual sequence into an index in another sequence." ;
+{ $subsections reversed slice }
+"Virtual sequences can be implemented with the " { $link "virtual-sequences-protocol" } ", by translating an index in the virtual sequence into an index in another sequence."
+{ $see-also "sequences-integers" } ;
 
 ARTICLE: "sequences-integers" "Counted loops"
-"Integers support the sequence protocol in a trivial fashion; a non-negative integer presents its non-negative predecessors as elements. For example, the integer 3, when viewed as a sequence, contains the elements 0, 1, and 2. This is very useful for performing counted loops."
+"A virtual sequence is defined for iterating over integers from zero."
+{ $subsection iota }
+"For example, calling " { $link iota } " on the integer 3 produces a sequence containing the elements 0, 1, and 2. This is very useful for performing counted loops."
 $nl
-"For example, the " { $link each } " combinator, given an integer, simply calls a quotation that number of times, pushing a counter on each iteration that ranges from 0 up to that integer:"
-{ $example "3 [ . ] each" "0\n1\n2" }
+"This means the " { $link each } " combinator, given an integer, simply calls a quotation that number of times, pushing a counter on each iteration that ranges from 0 up to that integer:"
+{ $example "3 iota [ . ] each" "0\n1\n2" }
 "A common idiom is to iterate over a sequence, while also maintaining a loop counter. This can be done using " { $link each-index } ", " { $link map-index } " and " { $link reduce-index } "."
 $nl
-"Combinators that produce new sequences, such as " { $link map } ", will output an array if the input is an integer."
+"Combinators that produce new sequences, such as " { $link map } ", will output an array if the input is an instance of " { $link iota } "."
 $nl
 "More elaborate counted loops can be performed with " { $link "math.ranges" } "." ;
 
index c82caec3f9769772d61069f7a01fba6b122e7f23..10be0454b98f7c235cc45f01f9f16fb4f63577fc 100644 (file)
@@ -6,13 +6,13 @@ IN: sequences.tests
 [ "empty" ] [ { } [ "empty" ] [ "not empty" ] if-empty ] unit-test
 [ { 1 } "not empty" ] [ { 1 } [ "empty" ] [ "not empty" ] if-empty ] unit-test
 
-[ V{ 1 2 3 4 } ] [ 1 5 dup <slice> >vector ] unit-test
-[ 3 ] [ 1 4 dup <slice> length ] unit-test
+[ V{ 1 2 3 4 } ] [ 1 5 dup iota <slice> >vector ] unit-test
+[ 3 ] [ 1 4 dup iota <slice> length ] unit-test
 [ 2 ] [ 1 3 { 1 2 3 4 } <slice> length ] unit-test
 [ V{ 2 3 } ] [ 1 3 { 1 2 3 4 } <slice> >vector ] unit-test
 [ V{ 4 5 } ] [ { 1 2 3 4 5 } 2 tail-slice* >vector ] unit-test
-[ V{ 3 4 } ] [ 2 4 1 10 dup <slice> subseq >vector ] unit-test
-[ V{ 3 4 } ] [ 0 2 2 4 1 10 dup <slice> <slice> subseq >vector ] unit-test
+[ V{ 3 4 } ] [ 2 4 1 10 dup iota <slice> subseq >vector ] unit-test
+[ V{ 3 4 } ] [ 0 2 2 4 1 10 dup iota <slice> <slice> subseq >vector ] unit-test
 [ 0 10 "hello" <slice> ] must-fail
 [ -10 3 "hello" <slice> ] must-fail
 [ 2 1 "hello" <slice> ] must-fail
@@ -129,7 +129,7 @@ unit-test
 [ { 1 3 2 4 } ] [ { 1 2 3 4 } clone 1 2 pick exchange ] unit-test
 
 [ { "" "a" "aa" "aaa" } ]
-[ 4 [ CHAR: a <string> ] map ]
+[ 4 [ CHAR: a <string> ] { } map-integers ]
 unit-test
 
 [ V{ } ] [ "f" V{ } clone remove! ] unit-test
@@ -138,11 +138,11 @@ unit-test
 [ V{ "x" } ] [ "f" V{ "f" "x" "f" } clone remove! ] unit-test
 [ V{ "y" "x" } ] [ "f" V{ "y" "f" "x" "f" } clone remove! ] unit-test
 
-[ V{ 0 1 4 5 } ] [ 6 >vector 2 4 pick delete-slice ] unit-test
+[ V{ 0 1 4 5 } ] [ 6 iota >vector 2 4 pick delete-slice ] unit-test
 
 [ 6 >vector 2 8 pick delete-slice ] must-fail
 
-[ V{ } ] [ 6 >vector 0 6 pick delete-slice ] unit-test
+[ V{ } ] [ 6 iota >vector 0 6 pick delete-slice ] unit-test
 
 [ { 1 2 "a" "b" 5 6 7 } ] [
     { "a" "b" } 2 4 { 1 2 3 4 5 6 7 }
@@ -228,10 +228,10 @@ unit-test
 
 [ 0 ] [ f length ] unit-test
 [ f first ] must-fail
-[ 3 ] [ 3 10 nth ] unit-test
-[ 3 ] [ 3 10 nth-unsafe ] unit-test
-[ -3 10 nth ] must-fail
-[ 11 10 nth ] must-fail
+[ 3 ] [ 3 10 iota nth ] unit-test
+[ 3 ] [ 3 10 iota nth-unsafe ] unit-test
+[ -3 10 iota nth ] must-fail
+[ 11 10 iota nth ] must-fail
 
 [ -1/0. 0 remove-nth! ] must-fail
 [ "" ] [ "" [ CHAR: \s = ] trim ] unit-test
@@ -243,10 +243,10 @@ unit-test
 [ "asdf " ] [ " asdf " [ CHAR: \s = ] trim-head ] unit-test
 [ " asdf" ] [ " asdf " [ CHAR: \s = ] trim-tail ] unit-test
 
-[ 328350 ] [ 100 [ sq ] map-sum ] unit-test
+[ 328350 ] [ 100 iota [ sq ] map-sum ] unit-test
 
-[ 50 ] [ 100 [ even? ] count ] unit-test
-[ 50 ] [ 100 [ odd?  ] count ] unit-test
+[ 50 ] [ 100 iota [ even? ] count ] unit-test
+[ 50 ] [ 100 iota [ odd?  ] count ] unit-test
 
 [ { "b" "d" } ] [ { 1 3 } { "a" "b" "c" "d" } nths ] unit-test
 [ { "a" "b" "c" "d" } ] [ { 0 1 2 3 } { "a" "b" "c" "d" } nths ] unit-test
index 16949f5542da48d43daba98dfbaff786e7a655c2..7d1e45aca0ffb0db67182d67e0593b4c23dfd138 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2005, 2009 Slava Pestov, Daniel Ehrenberg.
+! Copyright (C) 2005, 2010 Slava Pestov, Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors kernel kernel.private slots.private math
 math.private math.order ;
@@ -98,12 +98,6 @@ M: f like drop [ f ] when-empty ; inline
 
 INSTANCE: f immutable-sequence
 
-! Integers used to support the sequence protocol
-M: integer length ; inline
-M: integer nth-unsafe drop ; inline
-
-INSTANCE: integer immutable-sequence
-
 PRIVATE>
 
 ! In the future, this will replace integer sequences
@@ -426,11 +420,11 @@ PRIVATE>
 : map ( seq quot -- newseq )
     over map-as ; inline
 
-: replicate ( seq quot -- newseq )
-    [ drop ] prepose map ; inline
+: replicate-as ( len quot exemplar -- newseq )
+    [ [ drop ] prepose ] dip map-integers ; inline
 
-: replicate-as ( seq quot exemplar -- newseq )
-    [ [ drop ] prepose ] dip map-as ; inline
+: replicate ( len quot -- newseq )
+    { } replicate-as ; inline
 
 : map! ( seq quot -- seq )
     over [ map-into ] keep ; inline
@@ -466,7 +460,7 @@ PRIVATE>
     (2each) all-integers? ; inline
 
 : 3each ( seq1 seq2 seq3 quot -- )
-    (3each) each ; inline
+    (3each) each-integer ; inline
 
 : 3map-as ( seq1 seq2 seq3 quot exemplar -- newseq )
     [ (3each) ] dip map-integers ; inline
index 0bda4ba9b0be9e4324c69677d6734c4a7c1e3d3e..101cd75a5ba1f7aaf3a53bf49eba55ea584d754c 100644 (file)
@@ -5,7 +5,7 @@ IN: sorting.tests
 [ { } ] [ { } natural-sort ] unit-test
 
 [ { 270000000 270000001 } ]
-[ T{ slice f 270000000 270000002 270000002 } natural-sort ]
+[ T{ slice f 270000000 270000002 T{ iota f 270000002 } } natural-sort ]
 unit-test
 
 [ t ] [
@@ -14,7 +14,7 @@ unit-test
         100 [ 20 random [ 1000 random ] replicate ] replicate
         dup natural-sort
         [ set= ] [ nip [ before=? ] monotonic? ] 2bi and
-    ] all?
+    ] all-integers?
 ] unit-test
 
 [ ] [ { 1 2 } [ 2drop 1 ] sort drop ] unit-test
index 4f5473ce9de921869ee2e94e7245102c19d90943..b3b6daee5957174fdb8a559caa25333f6576e6e9 100644 (file)
@@ -20,7 +20,7 @@ M: source-file-error error-line [ error>> error-line ] [ line#>> ] bi or ;
 M: source-file-error compute-restarts error>> compute-restarts ;
 
 : sort-errors ( errors -- alist )
-    [ [ line#>> ] sort-with ] { } assoc-map-as sort-keys ;
+    [ [ line#>> 0 or ] sort-with ] { } assoc-map-as sort-keys ;
 
 : group-by-source-file ( errors -- assoc )
     H{ } clone [ [ push-at ] curry [ dup file>> ] prepose each ] keep ;
index 689d88be7156cc2c1b60ad09df47e4cf5456f3ce..b90d96a356e0809616fa2d87c698139d8c747307 100644 (file)
@@ -116,5 +116,5 @@ unit-test
         drop
         300 100 CHAR: \u123456
         [ <string> clone resize-string first ] keep =
-    ] all?
+    ] all-integers?
 ] unit-test
index 59f2a030ceee8fcb44a3dee3a4925f52a5a3c6fd..715564c64dcf8c91cd8bd965890fb1ec2549b09a 100644 (file)
@@ -53,6 +53,6 @@ PRIVATE>
 
 : vm ( -- path ) \ vm get-global ;
 
-: embedded? ( -- ? ) 15 getenv ;
+: embedded? ( -- ? ) 15 special-object ;
 
 : exit ( n -- ) do-shutdown-hooks (exit) ;
index 9052638e7da914b9e41c0b1e4a8d2d5b45c4388a..8f644963bf0594cc33c12144eb3a20a19256dbbf 100644 (file)
@@ -91,11 +91,11 @@ IN: vectors.tests
 [ 4 ] [ 5 V{ 1 2 3 4 5 } index ] unit-test
 
 [ t ] [
-    100 >array dup >vector <reversed> >array [ reverse ] dip =
+    100 iota >array dup >vector <reversed> >array [ reverse ] dip =
 ] unit-test
 
 [ fixnum ] [ 1 >bignum V{ } new-sequence length class ] unit-test
 
-[ fixnum ] [ 1 >bignum [ ] V{ } map-as length class ] unit-test
+[ fixnum ] [ 1 >bignum iota [ ] V{ } map-as length class ] unit-test
 
 [ V{ "lulz" } ] [ "lulz" 1vector ] unit-test
index 15c610ce7a6a5e5086ab23848730666e99097d3e..28600b6c48667452795f794d4138ee6d3892699b 100644 (file)
@@ -56,7 +56,7 @@ DEFER: check-status
         [ end-game ] 
         [ dup quit? [ quit-game ] [ repeat ] if ]
     if ;
-: build-quad ( -- array ) 4 [ 10 random ] replicate >array ;
+: build-quad ( -- array ) 4 [ 10 random ] replicate ;
 : 24-able? ( quad -- t/f ) [ makes-24? ] with-datastack first ;
 : 24-able ( -- vector ) build-quad dup 24-able? [ drop build-quad ] unless ;
 : set-commands ( -- ) { + - * / rot swap q } commands set ;
index b97a356e6ef8496113fd13fadf8d9d83c4d48878..305ae6bdf236f4b7b2d07d23bd1e58218968abad 100644 (file)
@@ -1,6 +1,6 @@
 ! (c)Joe Groff bsd license
 USING: alien.data.map fry generalizations kernel locals math.vectors
-math.vectors.conversion math math.vectors.simd sequences
+math.vectors.conversion math math.vectors.simd math.ranges sequences
 specialized-arrays tools.test ;
 FROM: alien.c-types => uchar short int float ;
 SPECIALIZED-ARRAYS: int float float-4 uchar-16 ;
@@ -145,3 +145,11 @@ CONSTANT: plane-count 4
     B{  15  25  35  45  55  65  75  85  95 105 115 125 135 145 155 165 }
     fold-rgba-planes
 ] unit-test
+
+: data-map-compiler-bug-test ( n -- byte-array )
+    [ 0.0 1.0 1.0 ] dip /f <range>
+    [ ] data-map( object -- float ) ;
+
+[ float-array{ 0.0 0.5 1.0 } ]
+[ 2 data-map-compiler-bug-test byte-array>float-array ]
+unit-test
index 350a29f8659db7b5430cd8c5ac5c521f2cdaf416..95202f35f984f75e8a51d14a34008ca52f2cdaeb 100644 (file)
@@ -4,7 +4,7 @@ USING: math sequences kernel base64 ;
 IN: benchmark.base64
 
 : base64-benchmark ( -- )
-    65535 [ 255 bitand ] "" map-as
+    65535 iota [ 255 bitand ] "" map-as
     20 [ >base64 base64> ] times
     drop ;
 
index 31c202b803716a6d1a02a088b3f93ab9e6573754..839bd89dc06792a632fdfc01b3f44e1c547d0011 100644 (file)
@@ -8,7 +8,7 @@ IN: benchmark.dawes
 : count-ones ( int-array -- n ) [ 1 = ] count ; inline
 
 : make-int-array ( -- int-array )
-    120000 [ 255 bitand ] int-array{ } map-as ; inline
+    120000 iota [ 255 bitand ] int-array{ } map-as ; inline
 
 : dawes-benchmark ( -- )
     200 make-int-array '[ _ count-ones ] replicate drop ;
index 87848cee9dfae4532333da07036f259e756e4ac7..7db583d42a397bcc6fe97c0316c3afd305739945 100644 (file)
@@ -5,8 +5,8 @@ IN: benchmark.dispatch2
 
 : sequences ( -- seq )
     [
-        1 ,
-        10 >bignum ,
+        1 iota ,
+        10 >bignum iota ,
         { 1 2 3 } ,
         "hello world" ,
         SBUF" sbuf world" ,
@@ -14,7 +14,7 @@ IN: benchmark.dispatch2
         double-array{ 1.0 2.0 3.0 } ,
         "hello world" 4 tail-slice ,
         10 f <repetition> ,
-        100 2 <sliced-groups> ,
+        100 iota 2 <sliced-groups> ,
         "hello" <reversed> ,
         { { 1 2 } { 3 4 } } 0 <column> ,
         ?{ t f t } ,
index 2f989b77231f2b82cbd064b2b8e952534c1754c0..685c92a8cc05a6a3e6277707b72293b0fcaa641e 100644 (file)
@@ -54,14 +54,14 @@ IN: benchmark.dispatch4
     20000000 [
         20 [
             foobar-1 drop
-        ] each
+        ] each-integer
     ] times ;
 
 : foobar-test-2 ( -- )
     20000000 [
         20 [
             foobar-2 drop
-        ] each
+        ] each-integer
     ] times ;
 
 MAIN: foobar-test-1
index 7ef40aa65a0db40debd1965b9db1f5887383ead6..a7d875af3fe9c12aff922bd7dc486a4e5f22656a 100644 (file)
@@ -5,7 +5,7 @@ sequences ;
 IN: benchmark.e-decimals
 
 : D-factorial ( n -- D! )
-    D: 1 [ 0 <decimal> D: 1 D+ D* ] reduce ; inline
+    iota D: 1 [ 0 <decimal> D: 1 D+ D* ] reduce ; inline
 
 :: calculate-e-decimals ( n -- e )
     n [1,b] D: 1
index f09aee6adaa47a52e334d3ea18d51bf45ee356ce..a6541856a56a05ee9ab9fa4814280910ab5cae10 100644 (file)
@@ -2,7 +2,7 @@ USING: math math.private kernel sequences ;
 IN: benchmark.empty-loop-2
 
 : empty-loop-2 ( n -- )
-    [ drop ] each ;
+    iota [ drop ] each ;
 
 : empty-loop-main ( -- )
     50000000 empty-loop-2 ;
index 5ba285dbb18343441d63a89938a359b913571ace..bd7ccafb9fa01eb7ebfbfc0ee47b374db953113a 100644 (file)
@@ -56,7 +56,7 @@ CONSTANT: homo-sapiens
     chars nth-unsafe ; inline
 
 : make-random-fasta ( seed len chars floats -- seed )
-    [ rot drop select-random ] 2curry "" map-as print ; inline
+    [ iota ] 2dip [ [ drop ] 2dip select-random ] 2curry "" map-as print ; inline
 
 : write-description ( desc id -- )
     ">" write write bl print ; inline
@@ -72,7 +72,7 @@ CONSTANT: homo-sapiens
 
 :: make-repeat-fasta ( k len alu -- k' )
     alu length :> kn
-    len [ k + kn mod alu nth-unsafe ] "" map-as print
+    len iota [ k + kn mod alu nth-unsafe ] "" map-as print
     k len + ; inline
 
 : write-repeat-fasta ( n alu desc id -- )
index 4909496d125b65874f71e69b427b5d8c8517f125..91989f204a4e1aaa774f1a4c6d08e31e46f87fc2 100644 (file)
@@ -3,6 +3,6 @@
 USING: math sequences kernel ;
 IN: benchmark.gc1
 
-: gc1 ( -- ) 600000 [ >bignum 1 + ] map drop ;
+: gc1 ( -- ) 600000 iota [ >bignum 1 + ] map drop ;
 
 MAIN: gc1
index f49d21d5a36829664733903f94b73b54af176758..51cafbe1e8596b1f602e43df9e6da15c350e3b9b 100644 (file)
@@ -2,7 +2,7 @@ IN: benchmark.iteration
 USING: sequences vectors arrays strings sbufs math math.vectors
 kernel ;
 
-: <range> ( from to -- seq ) dup <slice> ; inline
+: <range> ( from to -- seq ) dup iota <slice> ; inline
 
 : vector-iter ( -- ) 100 [ 0 100000 <range> >vector [ ] map drop ] times ;
 : array-iter ( -- ) 100 [ 0 100000 <range> >array [ ] map drop ] times ;
index a28a676b904b72957dae0aed314e03c24d747317..70fa1bb061b367cac6f1a825ef3a5efc546819fc 100644 (file)
@@ -25,7 +25,7 @@ IN: benchmark.knucleotide
 
 : small-groups ( x n -- b )
     swap
-    [ length swap - 1 + ] 2keep
+    [ length swap - 1 + iota ] 2keep
     [ [ over + ] dip subseq ] 2curry map ;
 
 : handle-table ( inputs n -- )
index 023f5de5c24d8b21ba88629225294ef6fff92a38..aa6098a43458f4a82d61a51ff80977fd61d0a94d 100644 (file)
@@ -1,11 +1,11 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: math math.functions kernel io io.styles prettyprint
 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 ] [ iota ] [ ] tri* '[ 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
index 4eab7c16693ae6b49ceb09d1a01c70b22b9a9c0c..b5abc4f68736473cd9fb03abb02ea1617c489567 100644 (file)
@@ -1,5 +1,5 @@
 USING: io io.files io.files.temp io.encodings.ascii random
-math.parser math ;
+math.parser math sequences ;
 IN: benchmark.random
 
 : random-numbers-path ( -- path )
index 45407e5ad2676e23d30f5cd66c717633a9484e1e..dcdc911cbf676b08389f56a2b546c0b7935a159b 100644 (file)
@@ -149,7 +149,7 @@ DEFER: create ( level c r -- scene )
     [ oversampling /f ] bi@ 0.0 0.0 double-4-boa ;
 
 : ss-grid ( -- ss-grid )
-    oversampling [ oversampling [ ss-point ] with map ] map ;
+    oversampling iota [ oversampling iota [ ss-point ] with map ] map ;
 
 : ray-grid ( point ss-grid -- ray-grid )
     [
@@ -161,8 +161,8 @@ DEFER: create ( level c r -- scene )
     [ [ swap cast-ray + ] with each ] with each ;
 
 : pixel-grid ( -- grid )
-    size reverse [
-        size [
+    size iota reverse [
+        size iota [
             [ size 0.5 * - ] bi@ swap size
             0.0 double-4-boa
         ] with map
index 2413e7fd1e38991a47ccee77d20c543b542148f9..868743b46a2c2885f447fc17a7d1216b7176836e 100644 (file)
@@ -148,7 +148,7 @@ DEFER: create ( level c r -- scene )
     [ oversampling /f ] bi@ 0.0 double-array{ } 3sequence ;
 
 : ss-grid ( -- ss-grid )
-    oversampling [ oversampling [ ss-point ] with map ] map ;
+    oversampling iota [ oversampling iota [ ss-point ] with map ] map ;
 
 : ray-grid ( point ss-grid -- ray-grid )
     [
@@ -160,8 +160,8 @@ DEFER: create ( level c r -- scene )
     [ [ swap cast-ray + ] with each ] with each ;
 
 : pixel-grid ( -- grid )
-    size reverse [
-        size [
+    size iota reverse [
+        size iota [
             [ size 0.5 * - ] bi@ swap size
             double-array{ } 3sequence
         ] with map
index ae918b7ebcb9f3ccff4abd8c4319edbca97b68cf..08e8edbeff583df74523a62a9b925d4ab3f83e5a 100644 (file)
@@ -13,7 +13,7 @@ SYMBOL: done
     ] times ;
 
 : send-messages ( messages target -- )
-    dupd [ send ] curry each [ receive drop ] times ; 
+    [ dup iota ] dip [ send ] curry each [ receive drop ] times ; 
 
 : destroy-ring ( target -- )
     done swap send [ done eq? ] receive-if drop ;
index 68efffe08313b3f056c3033a796804b1ddd21db1..386ffb0ae10c6aa4498bc2515e4620c6ecc5c188 100644 (file)
@@ -7,8 +7,8 @@ SPECIALIZED-ARRAY: double
 IN: benchmark.spectral-norm
 
 :: inner-loop ( u n quot -- seq )
-    n [| i |
-        n 0.0 [| j |
+    n iota [| i |
+        n iota 0.0 [| j |
             u i j quot call +
         ] reduce
     ] double-array{ } map-as ; inline
index 38ce0087a2c209d74f61cd97848bf320c23b86ae..701db7713591de56154ca5c6a02218aa554ab84c 100644 (file)
@@ -9,7 +9,7 @@ TUPLE: point { x float } { y float } { z float } ;
 TUPLE-ARRAY: point
 
 : tuple-array-benchmark ( -- )
-    100 [
+    100 iota [
         drop 5000 <point-array> [
             [ 1 + ] change-x
             [ 1 - ] change-y
index 6fdbdaecf6d06ea5452799a56d7e68f5b75037b2..9d16f75e15d2da7b4ced9d835b34f04b01aa2ddd 100644 (file)
@@ -2,6 +2,6 @@ USING: ui.gadgets.panes prettyprint io sequences ;
 IN: benchmark.ui-panes
 
 : ui-pane-benchmark ( -- )
-    <pane> <pane-stream> [ 10000 [ . ] each ] with-output-stream* ;
+    <pane> <pane-stream> [ 10000 iota [ . ] each ] with-output-stream* ;
 
 MAIN: ui-pane-benchmark
index 024887991e9af4a12865846bd3cafecc2b994a84..b182b4f832ee703b18df1f437498400e3393ded7 100644 (file)
@@ -27,9 +27,9 @@ STRUCT: yuv_buffer
         h >>uv_height
         w >>y_stride
         w >>uv_stride
-        w h * [ dup * ] B{ } map-as malloc-byte-array &free >>y
-        w h * 2/ [ dup dup * * ] B{ } map-as malloc-byte-array &free >>u
-        w h * 2/ [ dup * dup * ] B{ } map-as malloc-byte-array &free >>v ;
+        w h * iota [ dup * ] B{ } map-as malloc-byte-array &free >>y
+        w h * 2/ iota [ dup dup * * ] B{ } map-as malloc-byte-array &free >>u
+        w h * 2/ iota [ dup * dup * ] B{ } map-as malloc-byte-array &free >>v ;
 
 : clamp ( n -- n )
     255 min 0 max ; inline
@@ -76,12 +76,12 @@ STRUCT: yuv_buffer
 
 : yuv>rgb-row ( index rgb yuv y -- index )
     over stride
-    pick y_width>>
+    pick y_width>> iota
     [ yuv>rgb-pixel ] with with with with each ; inline
 
 : yuv>rgb ( rgb yuv -- )
     [ 0 ] 2dip
-    dup y_height>>
+    dup y_height>> iota
     [ yuv>rgb-row ] with with each
     drop ;
 
index fa56aff8cc92898c8cf3c64c57054cc906c33f70..f4055ca9e06c74813889e190fd003a3996ef831f 100644 (file)
@@ -73,8 +73,8 @@ IN: bloom-filters.tests
 [ t ] [ 1000 iota [ drop most-positive-fixnum random 1000 + ] map
         full-bloom-filter
         [ bloom-filter-member? ] curry map
-        [ ] filter
+        [ ] count
         ! TODO: This should be 10, but the false positive rate is currently very
         ! high.  300 is large enough not to prevent builds from succeeding.
-        length 300 <=
+        300 <=
 ] unit-test
index ad24d74adffb00bd481869b37efaae500870009f..0f14ed1d975720323e0066f92c7ef4106c35390f 100644 (file)
@@ -4,7 +4,7 @@ USING: accessors arrays bit-arrays fry infix kernel layouts locals math
 math.functions multiline sequences ;
 IN: bloom-filters
 
-FROM: math.ranges => [1,b] [0,b) ;
+FROM: math.ranges => [1,b] ;
 FROM: math.intervals => (a,b) interval-contains? ;
 
 /*
@@ -121,7 +121,7 @@ PRIVATE>
     [infix hash0 + (index * hash1) + ((pow(index, 3) - index) / 6) infix] ;
 
 : enhanced-double-hashes ( hash0 hash1 n -- seq )
-    [0,b)
+    iota
     [ '[ _ _ enhanced-double-hash ] ] dip
     swap map ;
 
index 3cee3999255262ac981a48b72cde8953dd53b8e7..747c8f53fc1bdc47603e915a0af07e30e652a441 100644 (file)
@@ -49,8 +49,8 @@ MACRO:: slots>constructor ( class slots -- quot )
     reverse? [ reverse ] when
     '[ @ _ [ execute( obj -- obj ) ] each ] effect define-declared ;
 
-: scan-constructor ( -- class word )
-    scan-word [ name>> "<" ">" surround create-in ] keep ;
+: scan-constructor ( -- word class )
+    scan-word [ name>> "<" ">" surround create-in dup reset-generic ] keep ;
 
 : parse-constructor ( -- class word effect def )
     scan-constructor complete-effect parse-definition ;
index a5a6709c6d61c2d555ecbf68560cc3a1ca208fd4..4891eab6902f25fd115c0c02ecb20457a4ef222e 100644 (file)
@@ -44,7 +44,7 @@ CONSTANT: AES_BLOCK_SIZE 16
 
 : inv-sbox ( -- array )
     256 0 <array>
-    dup 256 [ dup sbox nth rot set-nth ] with each ;
+    dup 256 [ dup sbox nth rot set-nth ] with each-integer ;
 
 : rcon ( -- array )
     {
@@ -72,7 +72,7 @@ CONSTANT: AES_BLOCK_SIZE 16
 
 MEMO:: t-table ( -- array )
     1024 0 <array>
-    dup 256 [ set-t ] with each ;
+    dup 256 [ set-t ] with each-integer ;
 
 :: set-d ( D i -- )
     i inv-sbox nth :> a1
@@ -91,7 +91,7 @@ MEMO:: t-table ( -- array )
     
 MEMO:: d-table ( -- array )
     1024 0 <array>
-    dup 256 [ set-d ] with each ;
+    dup 256 [ set-d ] with each-integer ;
 
 
 USE: multiline
index 29b9d98b38548e4fa8489ceeb13ddb40558d2a07..5bd0fb0fa3a3868a63045970540aa95873f2132a 100644 (file)
@@ -26,15 +26,15 @@ ERROR: decimal-test-failure D1 D2 quot ;
 : test-decimal-op ( quot1 quot2 -- ? )
     [ random-test-decimal random-test-decimal ] 2dip (test-decimal-op) ; inline
 
-[ t ] [ 1000 [ drop [ D+ ] [ + ] test-decimal-op ] all? ] unit-test
-[ t ] [ 1000 [ drop [ D- ] [ - ] test-decimal-op ] all? ] unit-test
-[ t ] [ 1000 [ drop [ D* ] [ * ] test-decimal-op ] all? ] unit-test
+[ t ] [ 1000 [ drop [ D+ ] [ + ] test-decimal-op ] all-integers? ] unit-test
+[ t ] [ 1000 [ drop [ D- ] [ - ] test-decimal-op ] all-integers? ] unit-test
+[ t ] [ 1000 [ drop [ D* ] [ * ] test-decimal-op ] all-integers? ] unit-test
 [ t ] [
     1000 [
         drop
         [ [ 100 D/ ] [ /f ] test-decimal-op ]
         [ { "kernel-error" 4 f f } = ] recover
-    ] all?
+    ] all-integers?
 ] unit-test
 
 [ t ] [ 
diff --git a/extra/grid-meshes/grid-meshes-tests.factor b/extra/grid-meshes/grid-meshes-tests.factor
new file mode 100644 (file)
index 0000000..ef71a66
--- /dev/null
@@ -0,0 +1,21 @@
+IN: grid-meshes.tests
+USING: alien.c-types grid-meshes grid-meshes.private
+specialized-arrays tools.test ;
+SPECIALIZED-ARRAY: float
+
+[
+    float-array{
+        0.0 0.0 0.0 1.0
+        0.0 0.0 0.5 1.0
+        0.5 0.0 0.0 1.0
+        0.5 0.0 0.5 1.0
+        1.0 0.0 0.0 1.0
+        1.0 0.0 0.5 1.0
+        0.0 0.0 0.5 1.0
+        0.0 0.0 1.0 1.0
+        0.5 0.0 0.5 1.0
+        0.5 0.0 1.0 1.0
+        1.0 0.0 0.5 1.0
+        1.0 0.0 1.0 1.0
+    }
+] [ { 2 2 } vertex-array byte-array>float-array ] unit-test
index 10fcd9c449ade7c150ae2cb4469fa209cc13b645..2d0b9514ffee2dab36a0c2569a32df11cb9e6dbd 100644 (file)
@@ -61,10 +61,10 @@ TUPLE: link attributes clickable ;
     ] map ;
 
 : find-by-id ( vector id -- vector' elt/f )
-    '[ attributes>> "id" at _ = ] find ;
+    '[ attributes>> "id" swap at _ = ] find ;
     
 : find-by-class ( vector id -- vector' elt/f )
-    '[ attributes>> "class" at _ = ] find ;
+    '[ attributes>> "class" swap at _ = ] find ;
 
 : find-by-name ( vector string -- vector elt/f )
     >lower '[ name>> _ = ] find ;
index 9bb755807771054a1aaf8cda2a74ec6abd8f058d..bc3a387fd0cc4aa4b5e0bee8593de40527c5788a 100644 (file)
@@ -43,4 +43,4 @@ IN: id3.tests
 
 
 [ t ]
-[ 10000 [ synchsafe>seq seq>synchsafe ] map [ < ] monotonic? ] unit-test
+[ 10000 iota [ synchsafe>seq seq>synchsafe ] map [ < ] monotonic? ] unit-test
index 917480dd3ffe89a276158b4857c4f31fcf2aaf82..9c42bf256b84138e44984a73583ccf02264a5955 100644 (file)
@@ -68,9 +68,9 @@ $nl
 "Please note: in Factor " { $emphasis "fixnums are sequences too." } " If you are not careful with sequence accesses you may introduce subtle bugs:"
 { $example
     "USING: arrays infix locals ;"
-    ":: add-2nd-element ( x y -- res )"
+    ":: add-2nd-elements ( x y -- res )"
     "    [infix x[1] + y[1] infix] ;"
-    "{ 1 2 3 } 5 add-2nd-element ."
+    "{ 1 2 3 } { 0 1 2 3 } add-2nd-elements ."
     "3"
 }
 ;
index 48bf2b693a8c463c74cdc247e5689dc2488fd1b6..9e5d248c989726c93149a44476af3196109ece06 100644 (file)
@@ -44,7 +44,7 @@ CONSTANT: wall-drawing-offset 0.15
 
 : equally-spaced-radians ( n -- seq )
     #! return a sequence of n numbers between 0 and 2pi
-    dup [ / pi 2 * * ] curry map ;
+    [ iota ] keep [ / pi 2 * * ] curry map ;
 
 : draw-segment-vertex ( segment theta -- )
     over color>> gl-color segment-vertex-and-normal
index b1644ef443a5f308963e79c2510070935350d2c2..1b1d87fbab4f0ac093419c93cd9bd0e6f3cb8f90 100644 (file)
@@ -34,7 +34,7 @@ C: <oint> oint
 
 : random-float+- ( n -- m )
     #! find a random float between -n/2 and n/2
-    dup 10000 * >fixnum random 10000 / swap 2 / - ;
+    dup 10000 * >integer random 10000 / swap 2 / - ;
 
 : random-turn ( oint theta -- )
     2 / 2dup random-float+- left-pivot random-float+- up-pivot ;
index f5b30f49da7a61dfa2659cec521e483d30195ed8..c35ba6ac8c0193922ba85c8b53879987713a6b64 100644 (file)
@@ -71,10 +71,10 @@ SYMBOL: terms
     [ natural-sort ] keep [ index ] curry map ;
 
 : (inversions) ( n seq -- n )
-    [ > ] with filter length ;
+    [ > ] with count ;
 
 : inversions ( seq -- n )
-    0 swap [ length ] keep [
+    0 swap [ length iota ] keep [
         [ nth ] 2keep swap 1 + tail-slice (inversions) +
     ] curry each ;
 
@@ -145,12 +145,12 @@ DEFER: (d)
     [ dup length pick nth push ] reduce ;
 
 : nth-basis-elt ( generators n -- elt )
-    over length [
+    over length iota [
         3dup bit? [ nth ] [ 2drop f ] if
     ] map sift 2nip ;
 
 : basis ( generators -- seq )
-    natural-sort dup length 2^ [ nth-basis-elt ] with map ;
+    natural-sort dup length 2^ iota [ nth-basis-elt ] with map ;
 
 : (tensor) ( seq1 seq2 -- seq )
     [
@@ -180,7 +180,7 @@ DEFER: (d)
     dim-im/ker-d ;
 
 : graded-ker/im-d ( graded-basis -- seq )
-    [ length ] keep [ (graded-ker/im-d) ] curry map ;
+    [ length iota ] keep [ (graded-ker/im-d) ] curry map ;
 
 : graded-betti ( generators -- seq )
     basis graded graded-ker/im-d unzip but-last 0 prefix v- ;
@@ -269,8 +269,8 @@ DEFER: (d)
     3array ;
 
 :: bigraded-triples ( grid -- triples )
-    grid length [| z |
-        grid first length [| u |
+    grid length iota [| z |
+        grid first length iota [| u |
             u z grid bigraded-triple
         ] map
     ] map ;
index e77dacaf580bc2a3a23c3a085e4ef553d79cc20a..cac4180abd53c74a44a3e904c9d13980497f531d 100644 (file)
@@ -30,6 +30,7 @@ M: windows really-delete-tree
 M: unix really-delete-tree delete-tree ;
 
 : retry ( n quot -- )
+    [ iota ] dip
     '[ drop @ f ] attempt-all drop ; inline
 
 :: upload-safely ( local username host remote -- )
index 6d01744290ab9f889308788a092e11f22c6de9b3..e4052836b4ffca8662be7df633c198233b6f3746 100644 (file)
@@ -18,7 +18,7 @@ CONSTANT: gamma-p6
     }
 
 : gamma-z ( x n -- seq )
-    [ + recip ] with map 1.0 0 pick set-nth ;
+    [ + recip ] with { } map-integers 1.0 0 pick set-nth ;
 
 : (gamma-lanczos6) ( x -- log[gamma[x+1]] )
     #! log(gamma(x+1)
index 422036d5cc39ae6c44c819f5632c926439653c17..5b2af13489fd7286b01e658fb5edbf59729904fb 100644 (file)
@@ -83,7 +83,7 @@ SYMBOL: and-needed?
         first 3digits>text
     ] [
         [ set-conjunction "" ] [ length ] [ ] tri
-        [ (recombine) ] curry each
+        [ (recombine) ] curry each-integer
     ] if ;
 
 : (number>text) ( n -- str )
index c0623d96b6a64eb6da66f3797ed8ede3c8c94780..4238dab16888c53e09277076ea8b869ff822ee49 100644 (file)
@@ -44,7 +44,7 @@ SYMBOL: visited
     line-width 2 - glLineWidth
     line-width 2 - glPointSize
     1.0 1.0 1.0 1.0 glColor4d
-    dup [ drop t <array> ] with map visited set
+    dup iota [ drop t <array> ] with map visited set
     GL_LINE_STRIP glBegin
     { 0 0 } dup vertex (draw-maze)
     glEnd ;
index 33d1fbedcbc58fb36f51b36caed11f844f306fad..a053c058537d23333999916659b15aaada4d69a6 100644 (file)
@@ -1,6 +1,6 @@
 ! (c)2009 Joe Groff bsd license
 USING: accessors arrays bit-arrays classes
-classes.tuple.private fry kernel locals parser
+classes.tuple.private fry kernel locals math parser
 sequences sequences.private vectors words ;
 IN: memory.pools
 
@@ -10,7 +10,7 @@ TUPLE: pool
 
 : <pool> ( size class -- pool )
     [ nip new ]
-    [ [ iota ] dip '[ _ new ] V{ } replicate-as ] 2bi
+    [ '[ _ new ] V{ } replicate-as ] 2bi
     pool boa ;
 
 : pool-size ( pool -- size )
@@ -20,7 +20,7 @@ TUPLE: pool
 
 :: copy-tuple ( from to -- to )
     from tuple-size :> size
-    size [| n | n from array-nth n to set-array-nth ] each
+    size [| n | n from array-nth n to set-array-nth ] each-integer
     to ; inline
 
 : (pool-new) ( pool -- object )
index de131df3c6a84b4a3217dd7f3a37934c88318063..6bed6d5f32ee18f7dae771236ce64cd31b342770 100644 (file)
@@ -21,7 +21,7 @@ SYMBOL: total
 : canonicalize-specializer-1 ( specializer -- specializer' )
     [
         [ class? ] filter
-        [ length <reversed> [ 1 + neg ] map ] keep zip
+        [ length iota <reversed> [ 1 + neg ] map ] keep zip
         [ length args [ max ] change ] keep
     ]
     [
@@ -111,7 +111,7 @@ SYMBOL: total
     swap "predicate" word-prop append ;
 
 : multi-predicate ( classes -- quot )
-    dup length <reversed>
+    dup length iota <reversed>
     [ picker 2array ] 2map
     [ drop object eq? not ] assoc-filter
     [ [ t ] ] [
diff --git a/extra/noise/noise-tests.factor b/extra/noise/noise-tests.factor
new file mode 100644 (file)
index 0000000..e216637
--- /dev/null
@@ -0,0 +1,4 @@
+IN: noise.tests
+USING: noise tools.test sequences math ;
+
+[ t ] [ { 100 100 } perlin-noise-map-coords [ [ 100 <= ] all? ] all? ] unit-test
index a27cc186a0d58a43d31b81accae787dd8ba57587..9204fa55f124473314b2f452a7ff8e0e5fb9cd0a 100644 (file)
@@ -120,7 +120,7 @@ TYPED:: perlin-noise ( table: byte-array point: float-4 -- value: float )
     faded trilerp ;
 
 MEMO: perlin-noise-map-coords ( dim -- coords )
-    first2 [| x y | x [ y 0.0 0.0 float-4-boa ] float-4-array{ } map-as ] with map concat ; 
+    first2 iota [| x y | x iota [ y 0.0 0.0 float-4-boa ] float-4-array{ } map-as ] with map concat ;
 
 TYPED:: perlin-noise-map ( table: byte-array transform: matrix4 coords: float-4-array -- map: float-array )
     coords [| coord | table transform coord m4.v perlin-noise ] data-map( float-4 -- c:float )
index e3d8cb7fd91036be60d2c339b8c006b60142ae54..fb7f00f62912d0a69591202e782ba2fbc5e98f47 100644 (file)
@@ -6,7 +6,7 @@ SYMBOL: sum
 
 : range ( r from to -- n )
     over - 1 + rot [ 
-        '[ over + @ drop ] each drop f
+        '[ over + @ drop ] each-integer drop f
     ] bshift 2nip ; inline
 
 [ 55 ] [
index d59b9103449c5832c57fc9770bc35693764afa3e..5bf44eddc6ef1eb0ff164cec80d34f24d88593dd 100644 (file)
@@ -47,14 +47,14 @@ PRIVATE>
 
 
 : euler001b ( -- answer )
-    1000 [0,b) [ [ 5 mod ] [ 3 mod ] bi [ 0 = ] either? ] filter sum ;
+    1000 iota [ [ 5 mod ] [ 3 mod ] bi [ 0 = ] either? ] filter sum ;
 
 ! [ euler001b ] 100 ave-time
 ! 0 ms ave run time - 0.06 SD (100 trials)
 
 
 : euler001c ( -- answer )
-    1000 [0,b) [ { 3 5 } [ divisor? ] with any? ] filter sum ;
+    1000 iota [ { 3 5 } [ divisor? ] with any? ] filter sum ;
 
 ! [ euler001c ] 100 ave-time
 ! 0 ms ave run time - 0.06 SD (100 trials)
index beed787fba1504fb86708b992623b3e386fa72bb..241fc2b626355c7ff0f14387367225a3dd7164c3 100644 (file)
@@ -72,12 +72,12 @@ IN: project-euler.011
 
 : pad-front ( matrix -- matrix )
     [
-        length [ 0 <repetition> ] map
+        length iota [ 0 <repetition> ] map
     ] keep [ append ] 2map ;
 
 : pad-back ( matrix -- matrix )
     <reversed> [
-        length [ 0 <repetition> ] map
+        length iota [ 0 <repetition> ] map
     ] keep [ <reversed> append ] 2map ;
 
 : diagonal/ ( -- matrix )
index 49680177d525fb57bb69218141e32e270b1ab91c..cbf45c9e326281ab44a10276424cb421d97aa6cf 100644 (file)
@@ -47,7 +47,7 @@ PRIVATE>
     [ [ dup 1 > ] [ dup , next-collatz ] while , ] { } make ;
 
 : euler014 ( -- answer )
-    1000000 [1,b] 0 [ collatz longest ] reduce first ;
+    1000000 [1,b] { } [ collatz longest ] reduce first ;
 
 ! [ euler014 ] time
 ! 52868 ms run / 483 ms GC time
@@ -64,7 +64,7 @@ PRIVATE>
 PRIVATE>
 
 : euler014a ( -- answer )
-    500000 1000000 [a,b] 1 [
+    500000 1000000 [a,b] { 1 } [
         dup worth-calculating? [ collatz longest ] [ drop ] if
     ] reduce first ;
 
index f6b4d497c070ae45150178a0166e5b42e1c09717..71e44ccb1e925dc09570a8274a19d21a46da8eb7 100644 (file)
@@ -1,6 +1,7 @@
 ! Copyright (c) 2008 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel math.combinatorics math.parser project-euler.common ;
+USING: kernel math.combinatorics math.parser project-euler.common
+sequences ;
 IN: project-euler.024
 
 ! http://projecteuler.net/index.php?section=problems&id=24
@@ -23,7 +24,7 @@ IN: project-euler.024
 ! --------
 
 : euler024 ( -- answer )
-    999999 10 permutation 10 digits>integer ;
+    999999 10 iota permutation 10 digits>integer ;
 
 ! [ euler024 ] 100 ave-time
 ! 0 ms ave run time - 0.27 SD (100 trials)
index f97d8e9e0ddd700dc6b2b339a817d980c0d36908..0c697236aaa63d86dc05e17d46853db172e5c23c 100644 (file)
@@ -46,7 +46,7 @@ IN: project-euler.027
 <PRIVATE
 
 : source-027 ( -- seq )
-    1000 [0,b) [ prime? ] filter [ dup [ neg ] map append ] keep
+    1000 iota [ prime? ] filter [ dup [ neg ] map append ] keep
     cartesian-product [ first2 < ] filter ;
 
 : quadratic ( b a n -- m )
index 25d78d9465f58b533dcffe60980e7cdd6151b89a..6db9707f7323385378927b03e6e727d1b20ecfc1 100644 (file)
@@ -38,7 +38,7 @@ IN: project-euler.030
 PRIVATE>
 
 : euler030 ( -- answer )
-    325537 [0,b) [ dup sum-fifth-powers = ] filter sum 1 - ;
+    325537 iota [ dup sum-fifth-powers = ] filter sum 1 - ;
 
 ! [ euler030 ] 100 ave-time
 ! 1700 ms ave run time - 64.84 SD (100 trials)
index 814f8a5a6382d92187e616db9901315fc33d8a6e..8fb7a2bfaa8c83b45d0d8d7203cb1fb6ac3b1a46 100644 (file)
@@ -28,7 +28,7 @@ IN: project-euler.032
 
 : source-032 ( -- seq )
     9 factorial iota [
-        9 permutation [ 1 + ] map 10 digits>integer
+        9 iota permutation [ 1 + ] map 10 digits>integer
     ] map ;
 
 : 1and4 ( n -- ? )
index cf4955750636a769bdb4ba2e88086991ae5109e9..4991d65a895c4f7c032ed0f68c134d774c35d23b 100644 (file)
@@ -40,13 +40,13 @@ IN: project-euler.043
 
 : interesting? ( seq -- ? )
     {
-        [ 17 8 rot subseq-divisible? ]
-        [ 13 7 rot subseq-divisible? ]
-        [ 11 6 rot subseq-divisible? ]
-        [ 7  5 rot subseq-divisible? ]
-        [ 5  4 rot subseq-divisible? ]
-        [ 3  3 rot subseq-divisible? ]
-        [ 2  2 rot subseq-divisible? ]
+        [ [ 17 8 ] dip subseq-divisible? ]
+        [ [ 13 7 ] dip subseq-divisible? ]
+        [ [ 11 6 ] dip subseq-divisible? ]
+        [ [ 7  5 ] dip subseq-divisible? ]
+        [ [ 5  4 ] dip subseq-divisible? ]
+        [ [ 3  3 ] dip subseq-divisible? ]
+        [ [ 2  2 ] dip subseq-divisible? ]
     } 1&& ;
 
 PRIVATE>
@@ -82,7 +82,7 @@ PRIVATE>
     [ unclip 1 head prefix concat ] map [ all-unique? ] filter ;
 
 : add-missing-digit ( seq -- seq )
-    dup natural-sort 10 swap diff prepend ;
+    dup natural-sort 10 iota swap diff prepend ;
 
 : interesting-pandigitals ( -- seq )
     17 candidates { 13 11 7 5 3 2 } [
index 037cc87288420e13ab0823aaaef63ba22287663d..ae603c81fd498bf4f1e96c2139bc231b476e4cfd 100644 (file)
@@ -24,7 +24,7 @@ IN: project-euler.052
 <PRIVATE
 
 : map-nx ( n x -- seq )
-    [ 1 + * ] with map ; inline
+    iota [ 1 + * ] with map ; inline
 
 : all-same-digits? ( seq -- ? )
     [ number>digits natural-sort ] map all-equal? ;
index faca6a8ad56ce5c372767e0683282937ffb4f226..2e2d31740192e3df3f9181cd66a1f5b79732de2e 100644 (file)
@@ -27,7 +27,7 @@ IN: project-euler.053
 ! --------
 
 : euler053 ( -- answer )
-    23 100 [a,b] [ dup [ nCk 1000000 > ] with count ] map-sum ;
+    23 100 [a,b] [ dup iota [ nCk 1000000 > ] with count ] map-sum ;
 
 ! [ euler053 ] 100 ave-time
 ! 52 ms ave run time - 4.44 SD (100 trials)
index 09663d241fea5b13a467e0f72fd304faa96d9e7f..1d8967ff6ce68b3961e3a602e3c4265189f0ce2c 100644 (file)
@@ -61,7 +61,7 @@ IN: project-euler.055
 PRIVATE>
 
 : euler055 ( -- answer )
-    10000 [0,b) [ lychrel? ] count ;
+    10000 iota [ lychrel? ] count ;
 
 ! [ euler055 ] 100 ave-time
 ! 478 ms ave run time - 30.63 SD (100 trials)
index 97789944fe9b74ced76c1bfa7c19f53110f55273..4e35c9da58b2358bad80ef72099adae145857489 100644 (file)
@@ -36,7 +36,7 @@ IN: project-euler.057
     >fraction [ number>string length ] bi@ > ; inline
 
 : euler057 ( -- answer )
-    0 1000 [0,b) [ drop 2 + recip dup 1 + longer-numerator? ] count nip ;
+    0 1000 iota [ drop 2 + recip dup 1 + longer-numerator? ] count nip ;
 
 ! [ euler057 ] 100 ave-time
 ! 1728 ms ave run time - 80.81 SD (100 trials)
index 35bc1f10678f184237c0f9e14dfff56a2e27b1db..cc5e93d7a86412702e52cf175c1151c1b3162273 100644 (file)
@@ -60,7 +60,7 @@ IN: project-euler.081
     3dup minimal-path-sum-to '[ _ + ] change-matrix ;
 
 : (euler081) ( matrix -- n )
-    dup first length [0,b) dup cartesian-product
+    dup first length iota dup cartesian-product
     [ first2 pick update-minimal-path-sum ] each
     last last ;
 
index e6278a1e172297e77e4b7105274340352138ddb9..6e64d6ad3080a491121c003aca5ba5bc5f28f32e 100644 (file)
@@ -55,9 +55,9 @@ IN: project-euler.150
 
 :: (euler150) ( m -- n )
     sums-triangle :> table
-    m [| x |
-        x 1 + [| y |
-            m x - [0,b) [| z |
+    m iota [| x |
+        x 1 + iota [| y |
+            m x - iota [| z |
                 x z + table nth-unsafe
                 [ y z + 1 + swap nth-unsafe ]
                 [ y        swap nth-unsafe ] bi -
index ccdb76d80e05ca679f5b464c27b6adf5bb9fd396..b8db55e886e00421e9f7a1443b99540faff6f4e5 100644 (file)
@@ -62,7 +62,7 @@ DEFER: (euler151)
         { { 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 / ]
+        [ [ dup length iota [ pick-sheet ] with map sum ] [ sum ] bi / ]
      } case ] cache ;
 
 : euler151 ( -- answer )
index af8b7e49c064d3de79794f7602ce04f4edf0dbc7..be5d40df9b92aefd9405ab47c8fa0e6a1f5003bd 100644 (file)
@@ -18,7 +18,7 @@ IN: project-euler.164
 <PRIVATE
 
 : next-keys ( key -- keys )
-    [ last ] [ 10 swap sum - ] bi [ 2array ] with map ;
+    [ last ] [ 10 swap sum - iota ] bi [ 2array ] with map ;
 
 : next-table ( assoc -- assoc )
     H{ } clone swap
index 9eb9e968ca161c60b1f679206b873d88bf2772a4..a84f4fa48b3aff39506e2713581a89bc6fa142e4 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 - iota [ nth-pair max , ] with each ] { } make ;
 
 ! Propagate one row into the upper one
 : propagate ( bottom top -- newtop )
index 19b0dead484fc094396d936dae56544eac9b4747..fe552a77a1d6e9d9cc095d64b0e55e70c84e146b 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2007, 2009 Slava Pestov.
+! Copyright (C) 2007, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays hashtables help.markup help.stylesheet io
 io.styles kernel math models namespaces sequences ui ui.gadgets
@@ -94,7 +94,7 @@ TUPLE: slides < book ;
     [ first3 ] dip head 3array ;
 
 : strip-tease ( data -- seq )
-    dup third length 1 - [
+    dup third length 1 - iota [
         2 + (strip-tease)
     ] with map ;
 
index 81b38f2c1450946e8794fb2f017a21b0d519575e..afbeea61108daac1f2af7943404ffef7e0593afa 100644 (file)
@@ -10,7 +10,7 @@ IN: smalltalk.compiler.tests
     ] with-compilation-unit ;
 
 : test-inference ( ast -- in# out# )
-    test-compilation infer [ in>> ] [ out>> ] bi ;
+    test-compilation infer [ in>> ] [ out>> ] bi [ length ] bi@ ;
 
 [ 2 1 ] [
     T{ ast-block f
index 2ea1e99afd1ce349fa6e1871f449c756d7a63192..609498634574e2eb834adca3f4f186f524d7e50c 100644 (file)
@@ -1,6 +1,6 @@
-! Copyright (C) 2009 Slava Pestov.
+! Copyright (C) 2009, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: combinators effects generic generic.standard
+USING: arrays combinators effects generic generic.standard
 kernel sequences words lexer ;
 IN: smalltalk.selectors
 
@@ -15,9 +15,9 @@ SYMBOLS: unary binary keyword ;
 
 : selector>effect ( selector -- effect )
     dup selector-type {
-        { unary [ drop 0 ] }
-        { binary [ drop 1 ] }
-        { keyword [ [ CHAR: : = ] count ] }
+        { unary [ drop { } ] }
+        { binary [ drop { "x" } ] }
+        { keyword [ [ CHAR: : = ] count "x" <array> ] }
     } case "receiver" suffix { "result" } <effect> ;
 
 : selector>generic ( selector -- generic )
diff --git a/extra/sudoku/sudoku-tests.factor b/extra/sudoku/sudoku-tests.factor
new file mode 100644 (file)
index 0000000..60babf0
--- /dev/null
@@ -0,0 +1,4 @@
+IN: sudoku.tests
+USING: tools.test sudoku ;
+
+[ ] [ sudoku-demo ] unit-test
index 555f1e632a580b489131907d0b7d5259a597074f..848d647fe0561a91aac8d4453cde14bb4737f671 100644 (file)
@@ -19,7 +19,7 @@ SYMBOL: board
 
 : box-any? ( n x y -- ? )
     [ 3 /i 3 * ] bi@
-    9 [ [ 3dup ] dip cell-any? ] any?
+    9 iota [ [ 3dup ] dip cell-any? ] any?
     [ 3drop ] dip ;
 
 DEFER: search
@@ -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-integer 2drop ;
 
 : board. ( board -- )
     standard-table-style [
@@ -52,7 +52,7 @@ DEFER: search
                 ] each
             ] with-row
         ] each
-    ] tabular-output ;
+    ] tabular-output nl ;
 
 : solution. ( -- )
     solutions inc "Solution:" print board get board. ;
index 251f60e6d7ddedab514ee9815b1da9cc37f6cecd..4541a15eca34c04cad80305d4bbb701921d049d5 100644 (file)
@@ -9,6 +9,7 @@ ERROR: fica-base-unknown ;
 
 : fica-base-rate ( year -- x )
     H{
+        { 2009 106800 }
         { 2008 102000 }
         { 2007  97500 }
     } at [ fica-base-unknown ] unless* ;
index 1f12dcabe6454a5dd02ecc0651c2d255b40f05a4..2346999bcbc822ae69686dad6b97e191470d8842 100644 (file)
@@ -6,7 +6,7 @@ IN: tetris.board
 TUPLE: board { width integer } { height integer } rows ;
 
 : make-rows ( width height -- rows )
-    [ drop f <array> ] with map ;
+    iota [ drop f <array> ] with map ;
 
 : <board> ( width height -- board )
     2dup make-rows board boa ;
@@ -24,8 +24,8 @@ TUPLE: board { width integer } { height integer } rows ;
 : block-free? ( board block -- ? ) block not ;
 
 : block-in-bounds? ( board block -- ? )
-    [ first swap width>> bounds-check? ] 2keep
-    second swap height>> bounds-check? and ;
+    [ first swap width>> iota bounds-check? ]
+    [ second swap height>> iota bounds-check? ] 2bi and ;
 
 : location-valid? ( board block -- ? )
     2dup block-in-bounds? [ block-free? ] [ 2drop f ] if ;
index 0169249e81952ffe15cf1f86394d798c8721a5b4..8326da35842d586c979dc179b37ef472be584dc9 100644 (file)
@@ -26,10 +26,10 @@ IN: tetris.gl
     [ gl-color 2array draw-block ] [ 3drop ] if ;
 
 : draw-row ( y row -- )
-    dup length -rot [ (draw-row) ] 2curry each ;
+    [ length iota swap ] keep [ (draw-row) ] 2curry each ;
 
 : draw-board ( board -- )
-    rows>> dup length swap
+    rows>> [ length iota ] keep
     [ dupd nth draw-row ] curry each ;
 
 : scale-board ( width height board -- )
index c07357fbdf7a5ba91a25fad87c6de7a962478fdb..d858a14795d9c38d4df347ea24cd524c7c54129f 100644 (file)
@@ -5,10 +5,10 @@ sequences random sets make grouping ;
 IN: trees.splay.tests
 
 : randomize-numeric-splay-tree ( splay-tree -- )
-    100 [ drop 100 random swap at drop ] with each ;
+    100 iota [ drop 100 random swap at drop ] with each ;
 
 : make-numeric-splay-tree ( n -- splay-tree )
-    <splay> [ [ conjoin ] curry each ] keep ;
+    iota <splay> [ [ conjoin ] curry each ] keep ;
 
 [ t ] [
     100 make-numeric-splay-tree dup randomize-numeric-splay-tree
index b0b1352cb244f96949d6420af3cfd597a62d3758..11df4035416f159627d33886c462dd06ec318147 100644 (file)
@@ -1,4 +1,4 @@
-CFLAGS += -DWINDOWS -mno-cygwin
+CFLAGS += -mno-cygwin
 LIBS = -lm
 PLAF_DLL_OBJS += vm/os-windows.o
 SHARED_FLAG = -shared
index 314c14fe05641dd620712fc056408135a654bc24..8b137891791fe96927ad78e64b0aad7bded08bdc 100644 (file)
@@ -1 +1 @@
-CFLAGS += -DFACTOR_64
+
index f0f6f80ae355da0b00fbc719928ffbe0195afdeb..cd98d6a6ab553c7b90733416a89c5d43418d4969 100644 (file)
@@ -9,8 +9,8 @@ namespace factor
    B blah
 
    the offset from the immediate operand to LOAD32 to the instruction after
-   the branch is two instructions. */
-static const fixnum xt_tail_pic_offset = 4 * 2;
+   the branch is one instruction. */
+static const fixnum xt_tail_pic_offset = 4;
 
 inline static void check_call_site(cell return_address)
 {
@@ -77,16 +77,6 @@ inline static unsigned int fpu_status(unsigned int status)
 }
 
 /* Defined in assembly */
-VM_C_API void c_to_factor(cell quot, void *vm);
-VM_C_API void throw_impl(cell quot, void *new_stack, void *vm);
-VM_C_API void lazy_jit_compile_impl(cell quot, void *vm);
 VM_C_API void flush_icache(cell start, cell len);
 
-VM_C_API void set_callstack(
-       void *vm,
-       stack_frame *to,
-       stack_frame *from,
-       cell length,
-       void *(*memcpy)(void*,const void*, size_t));
-
 }
index e815fc96196baf585dfb83711c0d93c40ba340da..69b82b143583ffae5c91931297fafa94efd4578a 100644 (file)
@@ -38,9 +38,9 @@ fixnum instruction_operand::load_value(cell relative_to)
        case RC_ABSOLUTE_PPC_2:
                return load_value_masked(rel_absolute_ppc_2_mask,16,0);
        case RC_RELATIVE_PPC_2:
-               return load_value_masked(rel_relative_ppc_2_mask,16,0) + relative_to;
+               return load_value_masked(rel_relative_ppc_2_mask,16,0) + relative_to - sizeof(cell);
        case RC_RELATIVE_PPC_3:
-               return load_value_masked(rel_relative_ppc_3_mask,6,0) + relative_to;
+               return load_value_masked(rel_relative_ppc_3_mask,6,0) + relative_to - sizeof(cell);
        case RC_RELATIVE_ARM_3:
                return load_value_masked(rel_relative_arm_3_mask,6,2) + relative_to + sizeof(cell);
        case RC_INDIRECT_ARM:
@@ -107,10 +107,10 @@ void instruction_operand::store_value(fixnum absolute_value)
                store_value_masked(absolute_value,rel_absolute_ppc_2_mask,0);
                break;
        case RC_RELATIVE_PPC_2:
-               store_value_masked(relative_value,rel_relative_ppc_2_mask,0);
+               store_value_masked(relative_value + sizeof(cell),rel_relative_ppc_2_mask,0);
                break;
        case RC_RELATIVE_PPC_3:
-               store_value_masked(relative_value,rel_relative_ppc_3_mask,0);
+               store_value_masked(relative_value + sizeof(cell),rel_relative_ppc_3_mask,0);
                break;
        case RC_RELATIVE_ARM_3:
                store_value_masked(relative_value - sizeof(cell),rel_relative_arm_3_mask,2);
index 52fe70240149a82fae708f474c065b22f4f7498f..9a920efce73b170d78a3fcb855cb5906905e2e1b 100755 (executable)
 #include <vector>
 #include <iostream>
 
+/* Detect target CPU type */
+#if defined(__arm__)
+       #define FACTOR_ARM
+#elif defined(__amd64__) || defined(__x86_64__)
+       #define FACTOR_AMD64
+       #define FACTOR_64
+#elif defined(i386) || defined(__i386) || defined(__i386__) || defined(WIN32)
+       #define FACTOR_X86
+#elif defined(__POWERPC__) || defined(__ppc__) || defined(_ARCH_PPC)
+       #define FACTOR_PPC
+#else
+       #error "Unsupported architecture"
+#endif
+
+#ifdef WIN32
+       #define WINDOWS
+#endif
+
 /* Forward-declare this since it comes up in function prototypes */
 namespace factor
 {
index a7c69571d9beb2fc8fffee32fac885b0cbb33c62..6a280ea58031a46358936971bb629ff9fd76510f 100644 (file)
@@ -18,7 +18,6 @@ typedef wchar_t vm_char;
 #define STRCMP wcscmp
 #define STRNCMP wcsncmp
 #define STRDUP _wcsdup
-#define MIN(a,b) ((a)>(b)?(b):(a))
 #define FTELL ftello64
 #define FSEEK fseeko64
 
index 7b4356af56257a451e3974c4db58862f3359a6a8..96e19ad7f4b9eb71c5ef7d656c1543815e680000 100644 (file)
@@ -1,15 +1,3 @@
-#if defined(__arm__)
-       #define FACTOR_ARM
-#elif defined(__amd64__) || defined(__x86_64__)
-       #define FACTOR_AMD64
-#elif defined(i386) || defined(__i386) || defined(__i386__) || defined(WIN32)
-       #define FACTOR_X86
-#elif defined(__POWERPC__) || defined(__ppc__) || defined(_ARCH_PPC)
-       #define FACTOR_PPC
-#else
-       #error "Unsupported architecture"
-#endif
-
 #if defined(WINDOWS)
        #if defined(WINCE)
                #include "os-windows-ce.hpp"
@@ -18,6 +6,7 @@
        #endif
 
        #include "os-windows.hpp"
+
        #if defined(FACTOR_AMD64)
                #include "os-windows-nt.64.hpp"
        #elif defined(FACTOR_X86)