diff --git a/core/classes/tuple/tuple.factor b/core/classes/tuple/tuple.factor index 4216a5dc3d..42b5826e95 100755 --- a/core/classes/tuple/tuple.factor +++ b/core/classes/tuple/tuple.factor @@ -20,6 +20,10 @@ ERROR: not-a-tuple object ; : all-slots ( class -- slots ) superclasses [ "slots" word-prop ] map concat ; +PREDICATE: immutable-tuple-class < tuple-class ( class -- ? ) + #! Delegation + all-slots rest-slice [ read-only>> ] all? ; + boolean ( obj -- ? ) t f ? ; inline diff --git a/core/math/intervals/intervals.factor b/core/math/intervals/intervals.factor index 1896943a71..8afbee3478 100755 --- a/core/math/intervals/intervals.factor +++ b/core/math/intervals/intervals.factor @@ -135,6 +135,9 @@ TUPLE: interval { from read-only } { to read-only } ; ] } cond ; +: intervals-intersect? ( i1 i2 -- ? ) + interval-intersect empty-interval eq? not ; + : interval-union ( i1 i2 -- i3 ) { { [ dup empty-interval eq? ] [ drop ] } diff --git a/core/slots/slots.factor b/core/slots/slots.factor index 73d674782d..8754444ce0 100755 --- a/core/slots/slots.factor +++ b/core/slots/slots.factor @@ -8,13 +8,17 @@ IN: slots TUPLE: slot-spec name offset class initial read-only reader writer ; +PREDICATE: reader < word "reader" word-prop ; + +PREDICATE: writer < word "writer" word-prop ; + : ( -- slot-spec ) slot-spec new object bootstrap-word >>class ; : define-typecheck ( class generic quot props -- ) [ dup define-simple-generic create-method ] 2dip - [ [ props>> ] [ drop ] [ [ t ] H{ } map>assoc ] tri* update ] + [ [ props>> ] [ drop ] [ ] tri* update ] [ drop define ] 3bi ; @@ -31,17 +35,23 @@ TUPLE: slot-spec name offset class initial read-only reader writer ; ] [ ] make ; : reader-word ( name -- word ) - ">>" append (( object -- value )) create-accessor ; + ">>" append (( object -- value )) create-accessor + dup t "reader" set-word-prop ; -: reader-props ( slot-spec -- seq ) - read-only>> { "foldable" "flushable" } { "flushable" } ? ; +: reader-props ( slot-spec -- assoc ) + [ + [ "reading" set ] + [ read-only>> [ t "foldable" set ] when ] bi + t "flushable" set + ] H{ } make-assoc ; : define-reader ( class slot-spec -- ) [ name>> reader-word ] [ reader-quot ] [ reader-props ] tri define-typecheck ; : writer-word ( name -- word ) - "(>>" swap ")" 3append (( value object -- )) create-accessor ; + "(>>" swap ")" 3append (( value object -- )) create-accessor + dup t "writer" set-word-prop ; ERROR: bad-slot-value value class ; @@ -77,8 +87,12 @@ ERROR: bad-slot-value value class ; } cond ] [ ] make ; +: writer-props ( slot-spec -- assoc ) + [ "writing" set ] H{ } make-assoc ; + : define-writer ( class slot-spec -- ) - [ name>> writer-word ] [ writer-quot ] bi { } define-typecheck ; + [ name>> writer-word ] [ writer-quot ] [ writer-props ] tri + define-typecheck ; : setter-word ( name -- word ) ">>" prepend (( object value -- object )) create-accessor ; diff --git a/core/words/words.factor b/core/words/words.factor index 5cf15abfa4..535295007e 100755 --- a/core/words/words.factor +++ b/core/words/words.factor @@ -187,6 +187,7 @@ M: word reset-word "parsing" "inline" "recursive" "foldable" "flushable" "predicating" "reading" "writing" + "reader" "writer" "constructing" "declared-effect" "constructor-quot" "delimiter" } reset-props ; diff --git a/extra/24-game/24-game.factor b/extra/24-game/24-game.factor index 86940dfa95..569cef8302 100644 --- a/extra/24-game/24-game.factor +++ b/extra/24-game/24-game.factor @@ -2,7 +2,7 @@ ! 24, the Factor game! USING: kernel random namespaces shuffle sequences -parser io math prettyprint combinators +parser io math prettyprint combinators continuations vectors words quotations accessors math.parser backtrack math.ranges locals fry memoize macros assocs ; diff --git a/extra/io/launcher/launcher.factor b/extra/io/launcher/launcher.factor index f556bac35c..09f240c53a 100755 --- a/extra/io/launcher/launcher.factor +++ b/extra/io/launcher/launcher.factor @@ -183,7 +183,7 @@ M: object run-pipeline-element [ |dispose drop ] [ swap >process - [ swap in>> or ] change-stdout + [ swap in>> or ] change-stdin run-detached ] [ in>> dispose ] @@ -200,8 +200,8 @@ M: object run-pipeline-element [ [ |dispose drop ] bi@ ] [ rot >process - [ swap out>> or ] change-stdout [ swap in>> or ] change-stdin + [ swap out>> or ] change-stdout run-detached ] [ [ out>> dispose ] [ in>> dispose ] bi* ] diff --git a/extra/io/unix/launcher/launcher-tests.factor b/extra/io/unix/launcher/launcher-tests.factor index 6d1f7f1796..33988c273b 100755 --- a/extra/io/unix/launcher/launcher-tests.factor +++ b/extra/io/unix/launcher/launcher-tests.factor @@ -1,7 +1,8 @@ IN: io.unix.launcher.tests USING: io.files tools.test io.launcher arrays io namespaces continuations math io.encodings.binary io.encodings.ascii -accessors kernel sequences io.encodings.utf8 destructors ; +accessors kernel sequences io.encodings.utf8 destructors +io.streams.duplex ; [ ] [ [ "launcher-test-1" temp-file delete-file ] ignore-errors @@ -111,4 +112,12 @@ accessors kernel sequences io.encodings.utf8 destructors ; "append-test" temp-file utf8 file-contents ] unit-test -[ ] [ "ls" utf8 contents drop ] unit-test +[ t ] [ "ls" utf8 contents >boolean ] unit-test + +[ "Hello world.\n" ] [ + "cat" utf8 [ + "Hello world.\n" write + output-stream get dispose + input-stream get contents + ] with-stream +] unit-test diff --git a/extra/shell/shell.factor b/extra/shell/shell.factor index 45c6f1fb4d..e694b36007 100644 --- a/extra/shell/shell.factor +++ b/extra/shell/shell.factor @@ -50,7 +50,6 @@ DEFER: expansion METHOD: expand { back-quoted-expr } expr>> expr - ast>> command>> expansion utf8 @@ -122,7 +121,7 @@ DEFER: shell { [ dup f = ] [ drop ] } { [ dup "exit" = ] [ drop ] } { [ dup "" = ] [ drop shell ] } - { [ dup expr ] [ expr ast>> chant shell ] } + { [ dup expr ] [ expr chant shell ] } { [ t ] [ drop "ix: ignoring input" print shell ] } } cond ; diff --git a/extra/ui/gadgets/labelled/labelled.factor b/extra/ui/gadgets/labelled/labelled.factor index 686e940ae6..831ac1b1d8 100755 --- a/extra/ui/gadgets/labelled/labelled.factor +++ b/extra/ui/gadgets/labelled/labelled.factor @@ -12,9 +12,9 @@ TUPLE: labelled-gadget < track content ; : ( gadget title -- newgadget ) { 0 1 } labelled-gadget new-track - swap