"{ 3 5 }"
} ;
+HELP: set-slots{
+{ $description "Sets slot values in a tuple from an array." }
+{ $example "USING: prettyprint slots.syntax kernel ;"
+ "IN: slots.syntax.example"
+ "TUPLE: rectangle width height ;"
+ "rectangle new { 3 5 } set-slots{ width height } ."
+ "T{ rectangle { width 3 } { height 5 } }"
+} ;
+
+HELP: set-slots[
+{ $description "Sets slot values in a tuple from the stack." }
+{ $example "USING: prettyprint slots.syntax kernel ;"
+ "IN: slots.syntax.example"
+ "TUPLE: rectangle width height ;"
+ "rectangle new 3 5 set-slots[ width height ] ."
+ "T{ rectangle { width 3 } { height 5 } }"
+} ;
+
ARTICLE: "slots.syntax" "Slots syntax sugar"
-"The " { $vocab-link "slots.syntax" } " vocabulary provides an alternative syntax for taking a sequence of slots from a tuple." $nl
+"The " { $vocab-link "slots.syntax" } " vocabulary provides an alternative syntax for getting and setting multiple values of a tuple." $nl
"Syntax sugar for cleaving slots to the stack:"
{ $subsections POSTPONE: slots[ }
-"Syntax sugar for cleaving slots to an array:"
-{ $subsections POSTPONE: slots{ } ;
+"Cleaving slots to an array:"
+{ $subsections POSTPONE: slots{ }
+"Setting slots from the stack:"
+{ $subsections POSTPONE: set-slots[ }
+"Setting slots from an array:"
+{ $subsections POSTPONE: set-slots{ } ;
ABOUT: "slots.syntax"
! Copyright (C) 2010 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: combinators combinators.smart fry lexer quotations
-sequences slots ;
+sequences slots words ;
IN: slots.syntax
SYNTAX: slots[
SYNTAX: slots{
"}" [ reader-word 1quotation ] map-tokens
'[ [ _ cleave ] output>array ] append! ;
+
+: writer-word* ( name -- word )
+ ">>" prepend "accessors" lookup ;
+
+SYNTAX: set-slots[
+ "]" [ writer-word* 1quotation ] map-tokens
+ '[ _ spread ] append! ;
+
+SYNTAX: set-slots{
+ "}" [ writer-word* 1quotation ] map-tokens
+ [ length ] [ ] bi
+ '[ _ firstn _ spread ] append! ;