IN: slots.tests
USING: math accessors slots strings generic.standard kernel
-tools.test generic words parser eval ;
+tools.test generic words parser eval math.functions ;
TUPLE: r/w-test foo ;
[ f ] [ r/w-test \ foo>> method "foldable" word-prop ] unit-test
[ t ] [ r/w-test \ foo>> method "flushable" word-prop ] unit-test
+
+! Test protocol slots
+SLOT: my-protocol-slot-test
+
+TUPLE: protocol-slot-test-tuple x ;
+
+M: protocol-slot-test-tuple my-protocol-slot-test>> x>> sq ;
+M: protocol-slot-test-tuple (>>my-protocol-slot-test) [ sqrt ] dip (>>x) ;
+
+[ 9 ] [ T{ protocol-slot-test-tuple { x 3 } } my-protocol-slot-test>> ] unit-test
+
+[ 4.0 ] [
+ T{ protocol-slot-test-tuple { x 3 } } clone
+ [ 7 + ] change-my-protocol-slot-test x>>
+] unit-test
: setter-word ( name -- word )
">>" prepend (( object value -- object )) create-accessor ;
-: define-setter ( slot-spec -- )
- name>> dup setter-word dup deferred? [
+: define-setter ( name -- )
+ dup setter-word dup deferred? [
[ \ over , swap writer-word , ] [ ] make define-inline
] [ 2drop ] if ;
: changer-word ( name -- word )
"change-" prepend (( object quot -- object )) create-accessor ;
-: define-changer ( slot-spec -- )
- name>> dup changer-word dup deferred? [
+: define-changer ( name -- )
+ dup changer-word dup deferred? [
[
[ over >r >r ] %
over reader-word ,
[ define-reader ]
[
dup read-only>> [ 2drop ] [
- [ define-setter drop ]
- [ define-changer drop ]
+ [ name>> define-setter drop ]
+ [ name>> define-changer drop ]
[ define-writer ]
2tri
] if
: define-protocol-slot ( name -- )
{
- [ reader-word drop ]
- [ writer-word drop ]
- [ setter-word drop ]
- [ changer-word drop ]
+ [ reader-word define-simple-generic ]
+ [ writer-word define-simple-generic ]
+ [ define-setter ]
+ [ define-changer ]
} cleave ;
ERROR: no-initial-value class ;