]> gitweb.factorcode.org Git - factor.git/commitdiff
Add copy-slots{ word to slots.syntax. Alias slots{ to get{ and set-slots{ to set...
authorDoug Coleman <doug.coleman@gmail.com>
Tue, 11 Oct 2011 01:24:35 +0000 (18:24 -0700)
committerDoug Coleman <doug.coleman@gmail.com>
Tue, 11 Oct 2011 01:25:48 +0000 (18:25 -0700)
extra/slots/syntax/syntax-docs.factor
extra/slots/syntax/syntax-tests.factor
extra/slots/syntax/syntax.factor

index 6e201eac770e9fc2cfa1f80d30195530cbea50f5..0845751ce9bff3c9c79f1b0ee9055b930fe91226 100755 (executable)
@@ -40,15 +40,25 @@ HELP: set-slots[
            "T{ rectangle { width 3 } { height 5 } }"
 } ;
 
+HELP: copy-slots{
+{ $description "Copy slots from the first object to the second and return the second object." }
+{ $example "USING: prettyprint slots.syntax kernel ;"
+           "IN: slots.syntax.example"
+           "TUPLE: thing1 a b ;"
+           "TUPLE: thing2 a b c ;"
+           "1 2 thing1 boa 11 22 33 thing2 boa copy-slots{ a b } ."
+           "T{ thing2 f 1 2 33 }"
+} ;
+
 ARTICLE: "slots.syntax" "Slots syntax sugar"
 "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[ }
+{ $subsections POSTPONE: slots[ POSTPONE: get[ }
 "Cleaving slots to an array:"
-{ $subsections POSTPONE: slots{ }
+{ $subsections POSTPONE: slots{ POSTPONE: get{ }
 "Setting slots from the stack:"
-{ $subsections POSTPONE: set-slots[ }
+{ $subsections POSTPONE: set-slots[ POSTPONE: set[ }
 "Setting slots from an array:"
-{ $subsections POSTPONE: set-slots{ } ;
+{ $subsections POSTPONE: set-slots{ POSTPONE: set{ } ;
 
 ABOUT: "slots.syntax"
index e4dac6e4a4927425f0483714842352d8f1c81cd9..01335f54d12bd52091d675428966fb70ab39fe2b 100755 (executable)
@@ -1,14 +1,19 @@
 ! Copyright (C) 2010 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: tools.test slots.syntax ;
+USING: kernel tools.test slots.syntax ;
 IN: slots.syntax.tests
 
-TUPLE: slot-test a b c ;
+TUPLE: slot-test1 a b c ;
 
-[ 1 2 3 ] [ T{ slot-test f 1 2 3 } slots[ a b c ] ] unit-test
-[ 3 ] [ T{ slot-test f 1 2 3 } slots[ c ] ] unit-test
-[ ] [ T{ slot-test f 1 2 3 } slots[ ] ] unit-test
+[ 1 2 3 ] [ T{ slot-test1 f 1 2 3 } slots[ a b c ] ] unit-test
+[ 3 ] [ T{ slot-test1 f 1 2 3 } slots[ c ] ] unit-test
+[ ] [ T{ slot-test1 f 1 2 3 } slots[ ] ] unit-test
 
-[ { 1 2 3 } ] [ T{ slot-test f 1 2 3 } slots{ a b c } ] unit-test
-[ { 3 } ] [ T{ slot-test f 1 2 3 } slots{ c } ] unit-test
-[ { } ] [ T{ slot-test f 1 2 3 } slots{ } ] unit-test
+[ { 1 2 3 } ] [ T{ slot-test1 f 1 2 3 } slots{ a b c } ] unit-test
+[ { 3 } ] [ T{ slot-test1 f 1 2 3 } slots{ c } ] unit-test
+[ { } ] [ T{ slot-test1 f 1 2 3 } slots{ } ] unit-test
+
+TUPLE: slot-test2 a b c d ;
+
+[ T{ slot-test2 f 1 2 33 44 } ]
+[ 1 2 3 slot-test1 boa 11 22 33 44 slot-test2 boa copy-slots{ a b } ] unit-test
index ef572910d821e3e2165c548467d95c5230535d36..cda8d402e6fe66fdb6d5505532de4294267fb32d 100755 (executable)
@@ -12,14 +12,29 @@ SYNTAX: slots{
     "}" [ reader-word 1quotation ] map-tokens
     '[ [ _ cleave ] output>array ] append! ;
 
-: writer-word* ( name -- word )
+: >>writer-word ( name -- word )
+    ">>" prepend "accessors" lookup ;
+    
+: writer-word<< ( name -- word )
     ">>" prepend "accessors" lookup ;
 
 SYNTAX: set-slots[
-    "]" [ writer-word* 1quotation ] map-tokens
+    "]" [ >>writer-word 1quotation ] map-tokens
     '[ _ spread ] append! ;
 
 SYNTAX: set-slots{
-    "}" [ writer-word* 1quotation ] map-tokens
+    "}" [ >>writer-word 1quotation ] map-tokens
     [ length ] [ ] bi
     '[ _ firstn _ spread ] append! ;
+
+SYNTAX: copy-slots{
+    "}" [
+        [ reader-word 1quotation ]
+        [ writer-word<< 1quotation ] bi append
+    ] map-tokens
+    '[ swap _ cleave ] append! ;
+    
+SYNTAX: get[ POSTPONE: slots[ ;
+SYNTAX: get{ POSTPONE: slots{ ;
+SYNTAX: set[ POSTPONE: set-slots[ ;
+SYNTAX: set{ POSTPONE: set-slots{ ;