} cond
[
- "FACTOR_ROOTS" os-env os windows? ";" ":" ? split
- [ add-vocab-root ] each
+ "FACTOR_ROOTS" os-env
+ [
+ os windows? ";" ":" ? split
+ [ add-vocab-root ] each
+ ] when*
] "environment" add-init-hook
"{ 10 20 30 } [ sq ] [ . ] compose each"\r
"{ 10 20 30 } [ sq . ] each"\r
}\r
-"The " { $link _ } " and " { $link @ } " specifiers may be freely mixed:"\r
+"The " { $link _ } " and " { $link @ } " specifiers may be freely mixed, and the result is considerably more concise and readable than the version using " { $link curry } " and " { $link compose } " directly:"\r
{ $code\r
"{ 8 13 14 27 } [ even? ] 5 '[ @ dup _ ? ] map"\r
- "{ 8 13 14 27 } [ even? ] 5 [ dup ] swap [ ? ] curry 3compose map"\r
+ "{ 8 13 14 27 } [ even? ] 5 [ dup ] swap [ ? ] curry compose compose map"\r
"{ 8 13 14 27 } [ even? dup 5 ? ] map"\r
}\r
"The following is a no-op:"\r
+++ /dev/null
-Doug Coleman
\ No newline at end of file
+++ /dev/null
-! Copyright (C) 2008 Doug Coleman.
-! See http://factorcode.org/license.txt for BSD license.
-USING: alien.syntax kernel unix.stat math unix
-combinators system io.backend accessors alien.c-types
-io.encodings.utf8 alien.strings unix.types unix.statfs io.files ;
-IN: unix.statfs.netbsd
+++ /dev/null
-unportable
{ linux [ "unix.statfs.linux" require ] }
{ macosx [ "unix.statfs.macosx" require ] }
{ freebsd [ "unix.statfs.freebsd" require ] }
- { netbsd [ "unix.statfs.netbsd" require ] }
- { openbsd [ "unix.statfs.openbsd" require ] }
+ ! { netbsd [ "unix.statfs.netbsd" require ] }
+ ! { openbsd [ "unix.statfs.openbsd" require ] }
} case
--- /dev/null
+unportable
USING: accessors sequences assocs kernel quotations namespaces
-xml.data xml.utilities combinators macros parser lexer words ;
+xml.data xml.utilities combinators macros parser lexer words fry ;
IN: xmode.utilities
-: implies >r not r> or ; inline
+: implies [ not ] dip or ; inline
: child-tags ( tag -- seq ) children>> [ tag? ] filter ;
: map-find ( seq quot -- result elt )
f -rot
- [ nip ] swap [ dup ] 3compose find
- >r [ drop f ] unless r> ; inline
+ '[ nip @ dup ] find
+ [ [ drop f ] unless ] dip ; inline
: tag-init-form ( spec -- quot )
{
{ [ dup quotation? ] [ [ object get tag get ] prepose ] }
{ [ dup length 2 = ] [
- first2 [
- >r >r tag get children>string
- r> [ execute ] when* object get r> execute
- ] 2curry
+ first2 '[
+ tag get children>string
+ _ [ execute ] when* object get _ execute
+ ]
] }
{ [ dup length 3 = ] [
- first3 [
- >r >r tag get at
- r> [ execute ] when* object get r> execute
- ] 3curry
+ first3 '[
+ _ tag get at
+ _ [ execute ] when* object get _ execute
+ ]
] }
} cond ;
[ with-tag-initializer ] curry ;
: init-from-tag ( tag tuple specs -- tuple )
- over >r (init-from-tag) r> ; inline
+ over [ (init-from-tag) ] dip ; inline
SYMBOL: tag-handlers
SYMBOL: tag-handler-word
: with-streams ( input output quot -- )
[ [ with-streams* ] 3curry ]
- [ [ drop dispose dispose ] 3curry ] 3bi
+ [ drop [ [ dispose ] bi@ ] 2curry ] 3bi
[ ] cleanup ; inline
: tabular-output ( style quot -- )
{ compose prepose } related-words
-HELP: 3compose
-{ $values { "quot1" callable } { "quot2" callable } { "quot3" callable } { "compose" compose } }
-{ $description "Quotation composition. Outputs a " { $link callable } " which calls " { $snippet "quot1" } ", " { $snippet "quot2" } " and then " { $snippet "quot3" } "." }
-{ $notes
- "The following two lines are equivalent:"
- { $code
- "3compose call"
- "3append call"
- }
- "However, " { $link 3compose } " runs in constant time, and the compiler is able to compile code which calls composed quotations."
-} ;
-
HELP: dip
{ $values { "x" object } { "quot" quotation } }
{ $description "Calls " { $snippet "quot" } " with " { $snippet "obj" } " hidden on the retain stack." }
{ $subsection 3curry }
{ $subsection with }
{ $subsection compose }
-{ $subsection 3compose }
{ $subsection prepose }
"Quotations also implement the sequence protocol, and can be manipulated with sequence words; see " { $link "quotations" } "." ;
: prepose ( quot1 quot2 -- compose )
swap compose ; inline
-: 3compose ( quot1 quot2 quot3 -- compose )
- compose compose ; inline
-
! Booleans
: not ( obj -- ? ) [ f ] [ t ] if ; inline
[ tuck 2slip ] dip while ; inline
: generate ( generator predicate -- obj )
- [ dup ] swap [ dup [ nip ] unless not ] 3compose
+ '[ dup @ dup [ nip ] unless not ]
swap [ ] do-while ;
MACRO: predicates ( seq -- quot/f )
continuations debugger classes.tuple namespaces make vectors
bit-arrays byte-arrays strings sbufs math.functions macros
sequences.private combinators mirrors
-combinators.short-circuit ;
+combinators.short-circuit fry ;
IN: inverse
TUPLE: fail ;
dup word? [ "Badly formed math inverse" throw ] when 1quotation ;
: swap-inverse ( math-inverse revquot -- revquot* quot )
- next assure-constant rot second [ swap ] swap 3compose ;
+ next assure-constant rot second '[ @ swap @ ] ;
: pull-inverse ( math-inverse revquot const -- revquot* quot )
assure-constant rot first compose ;
] recover ; inline
: true-out ( quot effect -- quot' )
- out>> [ ndrop ] curry
- [ t ] 3compose ;
+ out>> '[ @ _ ndrop t ] ;
: false-recover ( effect -- quot )
in>> [ ndrop f ] curry [ recover-fail ] curry ;
assocs random sequences.private shuffle math.functions arrays
math.parser math.private sorting strings ascii macros assocs.lib
quotations hashtables math.order locals generalizations
-math.ranges random ;
+math.ranges random fry ;
IN: sequences.lib
: each-withn ( seq quot n -- ) nwith each ; inline
dupd find over [ element-not-found ] unless
>r cut rest r> swap ; inline
-: (map-until) ( quot pred -- quot )
- [ dup ] swap 3compose
- [ [ drop t ] [ , f ] if ] compose [ find 2drop ] curry ;
-
: map-until ( seq quot pred -- newseq )
- (map-until) { } make ;
+ '[ [ @ dup @ [ drop t ] [ , f ] if ] find 2drop ] { } make ;
: take-while ( seq quot -- newseq )
[ not ] compose