kernel: new combinator 2with = with with

db4
Björn Lindqvist 2014-07-22 15:09:26 +02:00 committed by John Benediktsson
parent 8c8f58dfee
commit 60ffe0680e
38 changed files with 105 additions and 85 deletions

View File

@ -29,8 +29,8 @@ PRIVATE>
: 0&& ( quots -- ? ) [ ] unoptimized-&& ;
: 1&& ( obj quots -- ? ) [ with ] unoptimized-&& ;
: 2&& ( obj1 obj2 quots -- ? ) [ with with ] unoptimized-&& ;
: 3&& ( obj1 obj2 obj3 quots -- ? ) [ with with with ] unoptimized-&& ;
: 2&& ( obj1 obj2 quots -- ? ) [ 2with ] unoptimized-&& ;
: 3&& ( obj1 obj2 obj3 quots -- ? ) [ 3 nwith ] unoptimized-&& ;
MACRO: n|| ( quots n -- quot )
[
@ -51,5 +51,5 @@ PRIVATE>
: 0|| ( quots -- ? ) [ ] unoptimized-|| ;
: 1|| ( obj quots -- ? ) [ with ] unoptimized-|| ;
: 2|| ( obj1 obj2 quots -- ? ) [ with with ] unoptimized-|| ;
: 3|| ( obj1 obj2 obj3 quots -- ? ) [ with with with ] unoptimized-|| ;
: 2|| ( obj1 obj2 quots -- ? ) [ 2with ] unoptimized-|| ;
: 3|| ( obj1 obj2 obj3 quots -- ? ) [ 3 nwith ] unoptimized-|| ;

View File

@ -44,7 +44,7 @@ IN: compiler.cfg.branch-splitting
: update-successor-predecessors ( copies old-bb -- )
dup successors>>
[ update-successor-predecessor ] with with each ;
[ update-successor-predecessor ] 2with each ;
: split-branch ( bb -- )
[ new-blocks ] keep

View File

@ -109,7 +109,7 @@ SYMBOLS: defs insns ;
: insn-of ( vreg -- insn ) insns get at ;
: set-def-of ( obj insn assoc -- )
swap defs-vregs [ swap set-at ] with with each ;
swap defs-vregs [ swap set-at ] 2with each ;
: compute-defs ( cfg -- )
H{ } clone [

View File

@ -162,7 +162,7 @@ M: hairy-clobber-insn compute-live-intervals* ( insn -- )
: handle-live-out ( bb -- )
live-out dup assoc-empty? [ drop ] [
[ from get to get ] dip keys
[ live-interval add-range ] with with each
[ live-interval add-range ] 2with each
] if ;
! A location where all registers have to be spilled

View File

@ -35,7 +35,7 @@ GENERIC: eval-generator ( singleton -- object )
: query-tuples ( exemplar-tuple statement -- seq )
[ out-params>> ] keep query-results [
[ sql-row-typed swap resulting-tuple ] with with query-map
[ sql-row-typed swap resulting-tuple ] 2with query-map
] with-disposal ;
: query-modify-tuple ( tuple statement -- )

View File

@ -105,7 +105,7 @@ HELP: type-check-error.
{ $error-description "Thrown by various primitives if one of the inputs does not have the expected type. Generic words throw " { $link no-method } " and " { $link no-math-method } " errors in such cases instead." } ;
HELP: divide-by-zero-error.
{ $error-description "This error is thrown when " { $link / } " or " { $link /i } " is called with with a zero denominator." }
{ $error-description "This error is thrown when " { $link / } " or " { $link /i } " is called with a zero denominator." }
{ $see-also "division-by-zero" } ;
HELP: signal-error.

View File

@ -79,7 +79,7 @@ SYMBOLS:
get-controllers [
[ product-id = ]
[ instance-id = ] bi-curry bi* and
] with with find nip ;
] 2with find nip ;
TUPLE: keyboard-state keys ;

View File

@ -69,7 +69,7 @@ M: recursive-monitor dispose*
{ +rename-file-new+ [ child-added ] }
[ 3drop ]
} case
] with with each ;
] 2with each ;
: pump-loop ( -- )
receive {

View File

@ -410,7 +410,7 @@ M: float round dup sgn 2 /f + truncate ;
: roots ( x t -- seq )
[ [ log ] [ recip ] bi* * e^ ]
[ recip 2pi * 0 swap complex boa e^ ]
[ iota [ ^ * ] with with map ] tri ;
[ iota [ ^ * ] 2with map ] tri ;
: sigmoid ( x -- y ) neg e^ 1 + recip ; inline

View File

@ -201,7 +201,7 @@ SIMD-INTRINSIC: (simd-vmax) ( a b rep -- c ) [ max ] components-2ma
! XXX
SIMD-INTRINSIC: (simd-v.) ( a b rep -- n )
[ 2byte>rep-array [ [ first ] bi@ * ] 2keep ] keep
1 swap rep-length [a,b) [ '[ _ swap nth-unsafe ] bi@ * + ] with with each ;
1 swap rep-length [a,b) [ '[ _ swap nth-unsafe ] bi@ * + ] 2with each ;
SIMD-INTRINSIC: (simd-vsqrt) ( a rep -- c ) [ fsqrt ] components-map ;
SIMD-INTRINSIC: (simd-vsad) ( a b rep -- c ) 2byte>rep-array [ - abs ] [ + ] 2map-reduce ;
SIMD-INTRINSIC: (simd-sum) ( a rep -- n ) [ + ] components-reduce ;

View File

@ -16,4 +16,4 @@ PRIVATE>
: insertion-sort ( ... seq quot: ( ... elt -- ... elt' ) -- ... )
! quot is a transformation on elements
over length [ insert ] with with 1 -rot (each-integer) ; inline
over length [ insert ] 2with 1 -rot (each-integer) ; inline

View File

@ -16,7 +16,7 @@ IN: sorting.slots
unclip-last-slice
[ [ execute-accessor ] each ] dip
] when execute-comparator
] with with map-find drop +eq+ or ;
] 2with map-find drop +eq+ or ;
: sort-by-with ( seq sort-specs quot: ( obj -- key ) -- seq' )
swap '[ _ bi@ _ compare-slots ] sort ; inline

View File

@ -1,7 +1,7 @@
! (c)Joe Groff bsd license
USING: accessors arrays classes classes.tuple combinators
combinators.short-circuit definitions effects fry hints
math kernel kernel.private namespaces parser quotations
combinators.short-circuit definitions effects fry generalizations
hints math kernel kernel.private namespaces parser quotations
sequences slots words locals effects.parser
locals.parser macros stack-checker.dependencies
classes.maybe classes.algebra ;
@ -52,7 +52,7 @@ PREDICATE: typed-word < word "typed-word" word-prop >boolean ;
compose compose ;
: make-unboxer ( error-quot word types -- quot )
dup [ unboxer ] with with with
dup [ unboxer ] 3 nwith
[ swap \ dip [ ] 2sequence prepend ] map-reduce ;
: (unboxed-types) ( type -- types )

View File

@ -57,7 +57,7 @@ M: ---- <menu-item>
] make-corners ;
: <commands-menu> ( target hook commands -- menu )
[ <menu-item> ] with with map <menu> ;
[ <menu-item> ] 2with map <menu> ;
: show-commands-menu ( target commands -- )
[ dup [ ] ] dip <commands-menu> show-menu ;

View File

@ -13,7 +13,7 @@ IN: unicode.collation.tests
: test-equality ( str1 str2 -- ? ? ? ? )
{ primary= secondary= tertiary= quaternary= }
[ execute( a b -- ? ) ] with with map
[ execute( a b -- ? ) ] 2with map
first4 ;
[ f f f f ] [ "hello" "hi" test-equality ] unit-test

View File

@ -83,7 +83,7 @@ ducet get-global insert-helpers
: add ( char -- )
dup blocked? [ 1string , ] [
dup possible-bases dup length iota
[ ?combine ] with with any?
[ ?combine ] 2with any?
[ drop ] [ 1string , ] if
] if ;

View File

@ -40,6 +40,5 @@ PRIVATE>
[ 2drop ] [
[ [ vocab-dir append-path ] [ vocab-dir-in-root ] bi ] dip
[ 2drop make-directories ]
[ [ copy-vocab-resource ] with with each ] 3bi
[ [ copy-vocab-resource ] 2with each ] 3bi
] if-empty ;

View File

@ -118,7 +118,7 @@ M: math-combination perform-combination
drop dup generic-word [
dup [ over ] [
dup math-class? [
[ dup ] [ math-method ] with with math-dispatch-step
[ dup ] [ math-method ] 2with math-dispatch-step
] [
drop object-method
] if

View File

@ -75,7 +75,7 @@ C: <predicate-engine> predicate-engine
: flatten-method ( method class assoc -- )
over flatten-class keys
[ swap push-method ] with with with each ;
[ swap push-method ] 2with with each ;
: flatten-methods ( assoc -- assoc' )
H{ } clone [ [ swapd flatten-method ] curry assoc-each ] keep ;

View File

@ -777,9 +777,19 @@ HELP: with
{ $notes "This operation is efficient and does not copy the quotation." }
{ $examples
{ $example "USING: kernel math prettyprint sequences ;" "1 { 1 2 3 } [ / ] with map ." "{ 1 1/2 1/3 }" }
{ $example "USING: kernel math prettyprint sequences ;" "1000 100 5 iota [ sq + + ] with with map ." "{ 1100 1101 1104 1109 1116 }" }
{ $example "USING: kernel math prettyprint sequences ;" "1000 100 5 iota [ sq + + ] 2with map ." "{ 1100 1101 1104 1109 1116 }" }
} ;
HELP: 2with
{ $values
{ "param1" object }
{ "param1" object }
{ "obj" object }
{ "quot" { $quotation ( param1 param2 elt -- ... ) } }
{ "curry" curry }
}
{ $description "Partial application on the left of two parameters." } ;
HELP: compose
{ $values { "quot1" callable } { "quot2" callable } { "compose" compose } }
{ $description "Quotation composition. Outputs a " { $link callable } " which calls " { $snippet "quot1" } " followed by " { $snippet "quot2" } "." }
@ -951,4 +961,3 @@ ARTICLE: "assertions" "Assertions"
assert
assert=
} ;

View File

@ -8,6 +8,21 @@ IN: kernel.tests
[ 0 ] [ f size ] unit-test
[ t ] [ [ \ = \ = ] all-equal? ] unit-test
[
{
{ 1 2 0 }
{ 1 2 1 }
{ 1 2 2 }
{ 1 2 3 }
{ 1 2 4 }
{ 1 2 5 }
{ 1 2 6 }
{ 1 2 7 }
{ 1 2 8 }
{ 1 2 9 }
}
] [ 1 2 10 iota [ 3array ] 2with map ] unit-test
! Don't leak extra roots if error is thrown
[ ] [ 1000 [ [ 3 throw ] ignore-errors ] times ] unit-test

View File

@ -135,6 +135,9 @@ DEFER: if
: with ( param obj quot -- obj curry )
swapd [ swapd call ] 2curry ; inline
: 2with ( param1 param2 obj quot -- obj curry )
with with ; inline
: prepose ( quot1 quot2 -- compose )
swap compose ; inline

View File

@ -1,7 +1,7 @@
! Factor port of the raytracer benchmark from
! http://www.ffconsultancy.com/languages/ray_tracer/index.html
USING: arrays accessors io io.files io.files.temp
USING: arrays accessors generalizations io io.files io.files.temp
io.encodings.binary kernel math math.constants math.functions
math.vectors math.vectors.simd math.vectors.simd.cords
math.parser make sequences words combinators ;
@ -129,7 +129,7 @@ CONSTANT: create-offsets
: create-group ( level c r -- scene )
2dup create-bound [
2dup <sphere> ,
create-offsets [ create-step , ] with with with each
create-offsets [ create-step , ] 3 nwith each
] make-group ;
: create ( level c r -- scene )
@ -145,15 +145,15 @@ CONSTANT: create-offsets
ss-point v+ normalize
double-4{ 0.0 0.0 -4.0 0.0 } swap <ray>
swap cast-ray +
] with with with each
] with with each ; inline no-compile
] 3 nwith each
] 2with each ; inline no-compile
: ray-trace ( scene -- grid )
size iota <reversed> [
size iota [
[ size 0.5 * - ] bi@ swap size
0.0 double-4-boa ray-pixel
] with with map
] 2with map
] with map ;
: pgm-header ( w h -- )

View File

@ -78,12 +78,12 @@ STRUCT: yuv-buffer
: yuv>rgb-row ( index rgb yuv y -- index )
over stride
pick y_width>> iota
[ yuv>rgb-pixel ] with with with with each ; inline
[ yuv>rgb-pixel ] 4 nwith each ; inline
TYPED: yuv>rgb ( rgb: byte-array yuv: yuv-buffer -- )
[ 0 ] 2dip
dup y_height>> iota
[ yuv>rgb-row ] with with each
[ yuv>rgb-row ] 2with each
drop ;
: yuv-to-rgb-benchmark ( -- )

View File

@ -65,7 +65,7 @@ GENERIC: force ( neighbors boid behaviour -- force )
:: simulate ( boids behaviours dt -- boids )
boids [| boid |
boid boids behaviours
[ [ (force) ] keep weight>> v*n ] with with map vsum :> a
[ [ (force) ] keep weight>> v*n ] 2with map vsum :> a
boid vel>> a dt v*n v+ normalize :> vel
boid pos>> vel dt v*n v+ wrap-pos :> pos
@ -98,4 +98,3 @@ M:: separation force ( neighbors boid behaviour -- force )
behaviour radius>> :> r
boid pos>> neighbors
[ pos>> v- [ normalize ] [ r v/n ] bi v- ] with map vsum ;

View File

@ -30,7 +30,7 @@ IN: bunny.model
vneg normalize ;
: normal ( ns vs triple -- )
[ n ] keep [ rot [ v+ ] change-nth ] with with each ;
[ n ] keep [ rot [ v+ ] change-nth ] 2with each ;
: normals ( vs is -- ns )
[ [ length { 0.0 0.0 0.0 } <array> ] keep ] dip
@ -55,7 +55,7 @@ CONSTANT: model-url "http://duriansoftware.com/joe/media/bun_zipper.ply"
] each ;
: draw-triangles ( ns vs is -- )
GL_TRIANGLES [ [ (draw-triangle) ] with with each ] do-state ;
GL_TRIANGLES [ [ (draw-triangle) ] 2with each ] do-state ;
TUPLE: bunny-dlist list ;
TUPLE: bunny-buffers array element-array nv ni ;

View File

@ -129,7 +129,7 @@ VERTEX-FORMAT: collada-vertex-format
[
[ data>> ] [ offset>> ] bi
rot = [ nth ] [ 2drop f ] if
] with with map sift flatten ,
] 2with map sift flatten ,
] curry each-index
] V{ } make flatten ;
@ -153,7 +153,7 @@ VERTEX-FORMAT: collada-vertex-format
] bi ;
: mesh>triangles ( sources vertices mesh-tag -- models )
"triangles" tags-named [ triangles>model ] with with map ;
"triangles" tags-named [ triangles>model ] 2with map ;
: mesh>models ( mesh-tag -- models )
[

View File

@ -258,7 +258,7 @@ CONSTANT: edge-hitbox-radius 0.05
] [ f ] if ;
: intersecting-edge-node ( source direction b-rep -- edge/f )
edges>> [ intersects-edge-node? ] with with find nip ;
edges>> [ intersects-edge-node? ] 2with find nip ;
: select-edge ( world -- )
[ [ location>> ] [ hand-loc get wasd-pixel-ray ] bi ]
@ -311,4 +311,3 @@ M: gml-viewer-world wasd-mouse-scale drag?>> -1/600. 0.0 ? ;
_ >>selected
drop
] with-ui ;

View File

@ -59,7 +59,7 @@ IN: graphviz.notation
name>>
[ attrs-obj-=attr ] keep
graph-obj-=attr
] with with each ;
] 2with each ;
PRIVATE>

View File

@ -28,7 +28,7 @@ M: irc-channel-chat has-participant? participants>> key? ;
dup participant-chats [ part-participant ] with each ;
: rename-participant* ( new old -- )
[ dup participant-chats [ rename-participant ] with with each ]
[ dup participant-chats [ rename-participant ] 2with each ]
[ dup chat> [ rename-nick-chat ] [ 2drop ] if ]
2bi ;

View File

@ -163,7 +163,7 @@ DEFER: (d)
swap call [ at 0 or ] curry map ; inline
: op-matrix ( domain range quot -- matrix )
rot [ (op-matrix) ] with with map ; inline
rot [ (op-matrix) ] 2with map ; inline
: d-matrix ( domain range -- matrix )
[ (d) ] op-matrix ;

View File

@ -32,7 +32,7 @@ TUPLE: nurbs-curve
: order-knot-constants ( curve order -- knot-constants )
2dup [ knots>> length ] dip - iota
[ order-index-knot-constants ] with with map ;
[ order-index-knot-constants ] 2with map ;
: knot-constants ( curve -- knot-constants )
2 over order>> [a,b]
@ -71,5 +71,3 @@ TUPLE: nurbs-curve
: eval-nurbs ( nurbs-curve t -- value )
2dup knot-interval 1 - { 1.0 } 2 (eval-bases) ;

View File

@ -22,9 +22,6 @@ ERROR: pcre-error value ;
: split-subseqs ( seq subseqs -- seqs )
dup first [ replace-all ] keep split-subseq [ >string ] map harvest ;
: 2with ( param1 param2 obj quot -- obj curry )
[ -rot ] dip [ [ rot ] dip call ] 3curry ; inline
: utf8-start-byte? ( byte -- ? )
0xc0 bitand 0x80 = not ;

View File

@ -1,6 +1,7 @@
! Copyright (c) 2010 Samuel Tardieu.
! See http://factorcode.org/license.txt for BSD license.
USING: kernel math math.functions project-euler.common sequences sets ;
USING: generalizations kernel math math.functions project-euler.common
sequences sets ;
IN: project-euler.265
! http://projecteuler.net/index.php?section=problems&id=265
@ -51,7 +52,7 @@ CONSTANT: N 5
nip ?register
] [
[ 1 - ] dip
{ 0 1 } [ add-bit [ iterate ] [ 3drop ] if ] with with with each
{ 0 1 } [ add-bit [ iterate ] [ 3drop ] if ] 3 nwith each
] if ;
: euler265 ( -- answer )

View File

@ -1,5 +1,5 @@
! Based on http://www.ffconsultancy.com/ocaml/sudoku/index.html
USING: columns combinators combinators.short-circuit io
USING: columns combinators combinators.short-circuit generalizations io
io.styles kernel math math.parser namespaces sequences ;
IN: sudoku
@ -17,7 +17,7 @@ SYMBOL: board
: cell-any? ( n x y i -- ? ) 3 /mod pair+ board> = ;
: box-any? ( n x y -- ? )
[ 3 /i 3 * ] bi@ 9 iota [ cell-any? ] with with with any? ;
[ 3 /i 3 * ] bi@ 9 iota [ cell-any? ] 3 nwith any? ;
: board-any? ( n x y -- ? )
{ [ nip row-any? ] [ drop col-any? ] [ box-any? ] } 3|| ;

View File

@ -49,7 +49,7 @@ MEMO: cities-named ( name -- cities )
MEMO: cities-named-in ( name state -- cities )
cities [
[ name>> = ] [ state>> = ] bi-curry bi* and
] with with filter ;
] 2with filter ;
: find-zip-code ( code -- city )
cities [ first-zip>> <=> ] with search nip ;

View File

@ -39,6 +39,6 @@ M: window-controls-demo-world pref-dim*
open-window*
windows >>windows
windows push
] with with assoc-each ;
] 2with assoc-each ;
MAIN: window-controls-demo

View File

@ -426,7 +426,7 @@ M:: yaml-alias emit-value ( emitter event unused obj -- )
yaml_emitter_emit_asserted ;
: emit-sequence-body ( emitter event seq -- )
[ emit-object ] with with each ;
[ emit-object ] 2with each ;
: emit-assoc-body ( emitter event assoc -- )
[
@ -534,5 +534,5 @@ PRIVATE>
: >yaml-docs ( seq -- str )
[
[ init-emitter ] dip
[ [ replace-identities emit-doc ] with with each ] [ drop flush-emitter ] 3bi
[ [ replace-identities emit-doc ] 2with each ] [ drop flush-emitter ] 3bi
] with-destructors ;