Tuple redefinition fixes
parent
e1ad21a439
commit
4844bae31a
|
@ -2,18 +2,18 @@ USING: definitions generic kernel kernel.private math
|
||||||
math.constants parser sequences tools.test words assocs
|
math.constants parser sequences tools.test words assocs
|
||||||
namespaces quotations sequences.private classes continuations
|
namespaces quotations sequences.private classes continuations
|
||||||
generic.standard effects tuples tuples.private arrays vectors
|
generic.standard effects tuples tuples.private arrays vectors
|
||||||
strings compiler.units ;
|
strings compiler.units accessors ;
|
||||||
IN: tuples.tests
|
IN: tuples.tests
|
||||||
|
|
||||||
TUPLE: rect x y w h ;
|
TUPLE: rect x y w h ;
|
||||||
: <rect> rect construct-boa ;
|
: <rect> rect construct-boa ;
|
||||||
|
|
||||||
: move ( x rect -- )
|
: move ( x rect -- rect )
|
||||||
[ rect-x + ] keep set-rect-x ;
|
[ + ] change-x ;
|
||||||
|
|
||||||
[ f ] [ 10 20 30 40 <rect> dup clone 5 swap [ move ] keep = ] unit-test
|
[ f ] [ 10 20 30 40 <rect> dup clone 5 swap move = ] unit-test
|
||||||
|
|
||||||
[ t ] [ 10 20 30 40 <rect> dup clone 0 swap [ move ] keep = ] unit-test
|
[ t ] [ 10 20 30 40 <rect> dup clone 0 swap move = ] unit-test
|
||||||
|
|
||||||
GENERIC: delegation-test
|
GENERIC: delegation-test
|
||||||
M: object delegation-test drop 3 ;
|
M: object delegation-test drop 3 ;
|
||||||
|
@ -34,27 +34,46 @@ TUPLE: quuux-tuple-2 ;
|
||||||
|
|
||||||
[ 4 ] [ <quux-tuple-2> <quuux-tuple-2> delegation-test-2 ] unit-test
|
[ 4 ] [ <quux-tuple-2> <quuux-tuple-2> delegation-test-2 ] unit-test
|
||||||
|
|
||||||
|
! Make sure we handle tuple class redefinition
|
||||||
|
TUPLE: redefinition-test ;
|
||||||
|
|
||||||
|
C: <redefinition-test> redefinition-test
|
||||||
|
|
||||||
|
<redefinition-test> "redefinition-test" set
|
||||||
|
|
||||||
|
[ t ] [ "redefinition-test" get redefinition-test? ] unit-test
|
||||||
|
|
||||||
|
"IN: tuples.tests TUPLE: redefinition-test ;" eval
|
||||||
|
|
||||||
|
[ t ] [ "redefinition-test" get redefinition-test? ] unit-test
|
||||||
|
|
||||||
! Make sure we handle changing shapes!
|
! Make sure we handle changing shapes!
|
||||||
TUPLE: point x y ;
|
TUPLE: point x y ;
|
||||||
|
|
||||||
C: <point> point
|
C: <point> point
|
||||||
|
|
||||||
100 200 <point> "p" set
|
[ ] [ 100 200 <point> "p" set ] unit-test
|
||||||
|
|
||||||
! Use eval to sequence parsing explicitly
|
! Use eval to sequence parsing explicitly
|
||||||
"IN: tuples.tests TUPLE: point x y z ;" eval
|
[ ] [ "IN: tuples.tests TUPLE: point x y z ;" eval ] unit-test
|
||||||
|
|
||||||
[ 100 ] [ "p" get point-x ] unit-test
|
[ 100 ] [ "p" get x>> ] unit-test
|
||||||
[ 200 ] [ "p" get point-y ] unit-test
|
[ 200 ] [ "p" get y>> ] unit-test
|
||||||
[ f ] [ "p" get "point-z" "tuples.tests" lookup execute ] unit-test
|
[ f ] [ "p" get "z>>" "accessors" lookup execute ] unit-test
|
||||||
|
|
||||||
300 "p" get "set-point-z" "tuples.tests" lookup execute
|
"p" get 300 ">>z" "accessors" lookup execute drop
|
||||||
|
|
||||||
|
[ 4 ] [ "p" get tuple-size ] unit-test
|
||||||
|
|
||||||
|
[ 300 ] [ "p" get "z>>" "accessors" lookup execute ] unit-test
|
||||||
|
|
||||||
"IN: tuples.tests TUPLE: point z y ;" eval
|
"IN: tuples.tests TUPLE: point z y ;" eval
|
||||||
|
|
||||||
[ "p" get point-x ] must-fail
|
[ 3 ] [ "p" get tuple-size ] unit-test
|
||||||
[ 200 ] [ "p" get point-y ] unit-test
|
|
||||||
[ 300 ] [ "p" get "point-z" "tuples.tests" lookup execute ] unit-test
|
[ "p" get x>> ] must-fail
|
||||||
|
[ 200 ] [ "p" get y>> ] unit-test
|
||||||
|
[ 300 ] [ "p" get "z>>" "accessors" lookup execute ] unit-test
|
||||||
|
|
||||||
TUPLE: predicate-test ;
|
TUPLE: predicate-test ;
|
||||||
|
|
||||||
|
@ -68,10 +87,10 @@ PREDICATE: tuple silly-pred
|
||||||
class \ rect = ;
|
class \ rect = ;
|
||||||
|
|
||||||
GENERIC: area
|
GENERIC: area
|
||||||
M: silly-pred area dup rect-w swap rect-h * ;
|
M: silly-pred area dup w>> swap h>> * ;
|
||||||
|
|
||||||
TUPLE: circle radius ;
|
TUPLE: circle radius ;
|
||||||
M: circle area circle-radius sq pi * ;
|
M: circle area radius>> sq pi * ;
|
||||||
|
|
||||||
[ 200 ] [ T{ rect f 0 0 10 20 } area ] unit-test
|
[ 200 ] [ T{ rect f 0 0 10 20 } area ] unit-test
|
||||||
|
|
||||||
|
@ -88,7 +107,7 @@ TUPLE: delegate-clone ;
|
||||||
[ T{ delegate-clone T{ empty f } } clone ] unit-test
|
[ T{ delegate-clone T{ empty f } } clone ] unit-test
|
||||||
|
|
||||||
! Compiler regression
|
! Compiler regression
|
||||||
[ t length ] [ no-method-object t eq? ] must-fail-with
|
[ t length ] [ object>> t eq? ] must-fail-with
|
||||||
|
|
||||||
[ "<constructor-test>" ]
|
[ "<constructor-test>" ]
|
||||||
[ "TUPLE: constructor-test ; C: <constructor-test> constructor-test" eval word word-name ] unit-test
|
[ "TUPLE: constructor-test ; C: <constructor-test> constructor-test" eval word word-name ] unit-test
|
||||||
|
@ -96,7 +115,7 @@ TUPLE: delegate-clone ;
|
||||||
TUPLE: size-test a b c d ;
|
TUPLE: size-test a b c d ;
|
||||||
|
|
||||||
[ t ] [
|
[ t ] [
|
||||||
T{ size-test } array-capacity
|
T{ size-test } tuple-size
|
||||||
size-test tuple-size =
|
size-test tuple-size =
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
|
@ -213,55 +232,50 @@ C: <erg's-reshape-problem> erg's-reshape-problem
|
||||||
! tuples are reshaped
|
! tuples are reshaped
|
||||||
: cons-test-1 \ erg's-reshape-problem construct-empty ;
|
: cons-test-1 \ erg's-reshape-problem construct-empty ;
|
||||||
: cons-test-2 \ erg's-reshape-problem construct-boa ;
|
: cons-test-2 \ erg's-reshape-problem construct-boa ;
|
||||||
: cons-test-3
|
|
||||||
{ set-erg's-reshape-problem-a }
|
|
||||||
\ erg's-reshape-problem construct ;
|
|
||||||
|
|
||||||
"IN: tuples.tests TUPLE: erg's-reshape-problem a b c d e f ;" eval
|
! "IN: tuples.tests TUPLE: erg's-reshape-problem a b c d e f ;" eval
|
||||||
|
!
|
||||||
[ ] [ 1 2 3 4 5 6 cons-test-2 "a" set ] unit-test
|
! [ ] [ 1 2 3 4 5 6 cons-test-2 "a" set ] unit-test
|
||||||
|
!
|
||||||
[ t ] [ cons-test-1 array-capacity "a" get array-capacity = ] unit-test
|
! [ t ] [ cons-test-1 tuple-size "a" get tuple-size = ] unit-test
|
||||||
|
!
|
||||||
[ t ] [ 1 cons-test-3 array-capacity "a" get array-capacity = ] unit-test
|
! [
|
||||||
|
! "IN: tuples.tests SYMBOL: not-a-class C: <not-a-class> not-a-class" eval
|
||||||
[
|
! ] [ [ no-tuple-class? ] is? ] must-fail-with
|
||||||
"IN: tuples.tests SYMBOL: not-a-class C: <not-a-class> not-a-class" eval
|
!
|
||||||
] [ [ no-tuple-class? ] is? ] must-fail-with
|
! ! Hardcore unit tests
|
||||||
|
! USE: threads
|
||||||
! Hardcore unit tests
|
!
|
||||||
USE: threads
|
! \ thread "slot-names" word-prop "slot-names" set
|
||||||
|
!
|
||||||
\ thread "slot-names" word-prop "slot-names" set
|
! [ ] [
|
||||||
|
! [
|
||||||
[ ] [
|
! \ thread { "xxx" } "slot-names" get append
|
||||||
[
|
! define-tuple-class
|
||||||
\ thread { "xxx" } "slot-names" get append
|
! ] with-compilation-unit
|
||||||
define-tuple-class
|
!
|
||||||
] with-compilation-unit
|
! [ 1337 sleep ] "Test" spawn drop
|
||||||
|
!
|
||||||
[ 1337 sleep ] "Test" spawn drop
|
! [
|
||||||
|
! \ thread "slot-names" get
|
||||||
[
|
! define-tuple-class
|
||||||
\ thread "slot-names" get
|
! ] with-compilation-unit
|
||||||
define-tuple-class
|
! ] unit-test
|
||||||
] with-compilation-unit
|
!
|
||||||
] unit-test
|
! USE: vocabs
|
||||||
|
!
|
||||||
USE: vocabs
|
! \ vocab "slot-names" word-prop "slot-names" set
|
||||||
|
!
|
||||||
\ vocab "slot-names" word-prop "slot-names" set
|
! [ ] [
|
||||||
|
! [
|
||||||
[ ] [
|
! \ vocab { "xxx" } "slot-names" get append
|
||||||
[
|
! define-tuple-class
|
||||||
\ vocab { "xxx" } "slot-names" get append
|
! ] with-compilation-unit
|
||||||
define-tuple-class
|
!
|
||||||
] with-compilation-unit
|
! all-words drop
|
||||||
|
!
|
||||||
all-words drop
|
! [
|
||||||
|
! \ vocab "slot-names" get
|
||||||
[
|
! define-tuple-class
|
||||||
\ vocab "slot-names" get
|
! ] with-compilation-unit
|
||||||
define-tuple-class
|
! ] unit-test
|
||||||
] with-compilation-unit
|
|
||||||
] unit-test
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
USING: arrays definitions hashtables kernel
|
USING: arrays definitions hashtables kernel
|
||||||
kernel.private math namespaces sequences sequences.private
|
kernel.private math namespaces sequences sequences.private
|
||||||
strings vectors words quotations memory combinators generic
|
strings vectors words quotations memory combinators generic
|
||||||
classes classes.private slots slots.deprecated slots.private
|
classes classes.private slots.deprecated slots.private slots
|
||||||
compiler.units ;
|
compiler.units ;
|
||||||
IN: tuples
|
IN: tuples
|
||||||
|
|
||||||
|
@ -49,43 +49,6 @@ PRIVATE>
|
||||||
2drop f
|
2drop f
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
: permutation ( seq1 seq2 -- permutation )
|
|
||||||
swap [ index ] curry map ;
|
|
||||||
|
|
||||||
: reshape-tuple ( oldtuple permutation -- newtuple )
|
|
||||||
>r tuple>array 2 cut r>
|
|
||||||
[ [ swap ?nth ] [ drop f ] if* ] with map
|
|
||||||
append >tuple ;
|
|
||||||
|
|
||||||
: reshape-tuples ( class newslots -- )
|
|
||||||
>r dup "slot-names" word-prop r> permutation
|
|
||||||
[
|
|
||||||
>r [ swap class eq? ] curry instances dup r>
|
|
||||||
[ reshape-tuple ] curry map
|
|
||||||
become
|
|
||||||
] 2curry after-compilation ;
|
|
||||||
|
|
||||||
: old-slots ( class newslots -- seq )
|
|
||||||
swap "slots" word-prop 1 tail-slice
|
|
||||||
[ slot-spec-name swap member? not ] with subset ;
|
|
||||||
|
|
||||||
: forget-slots ( class newslots -- )
|
|
||||||
dupd old-slots [
|
|
||||||
2dup
|
|
||||||
slot-spec-reader 2array forget
|
|
||||||
slot-spec-writer 2array forget
|
|
||||||
] with each ;
|
|
||||||
|
|
||||||
: check-shape ( class newslots -- )
|
|
||||||
over tuple-class? [
|
|
||||||
over "slot-names" word-prop over = [
|
|
||||||
2dup forget-slots
|
|
||||||
2dup reshape-tuples
|
|
||||||
over changed-word
|
|
||||||
over redefined
|
|
||||||
] unless
|
|
||||||
] when 2drop ;
|
|
||||||
|
|
||||||
M: tuple-class tuple-layout "layout" word-prop ;
|
M: tuple-class tuple-layout "layout" word-prop ;
|
||||||
|
|
||||||
: define-tuple-predicate ( class -- )
|
: define-tuple-predicate ( class -- )
|
||||||
|
@ -114,15 +77,59 @@ M: tuple-class tuple-layout "layout" word-prop ;
|
||||||
dup "slot-names" word-prop length 1+ { } 0 <tuple-layout>
|
dup "slot-names" word-prop length 1+ { } 0 <tuple-layout>
|
||||||
"layout" set-word-prop ;
|
"layout" set-word-prop ;
|
||||||
|
|
||||||
PRIVATE>
|
: removed-slots ( class newslots -- seq )
|
||||||
|
swap "slot-names" word-prop seq-diff ;
|
||||||
|
|
||||||
: define-tuple-class ( class slots -- )
|
: forget-slots ( class newslots -- )
|
||||||
2dup check-shape
|
dupd removed-slots [
|
||||||
over f tuple tuple-class define-class
|
2dup
|
||||||
|
reader-word forget-method
|
||||||
|
writer-word forget-method
|
||||||
|
] with each ;
|
||||||
|
|
||||||
|
: permutation ( seq1 seq2 -- permutation )
|
||||||
|
swap [ index ] curry map ;
|
||||||
|
|
||||||
|
: reshape-tuple ( oldtuple permutation -- newtuple )
|
||||||
|
>r tuple>array 2 cut r>
|
||||||
|
[ [ swap ?nth ] [ drop f ] if* ] with map
|
||||||
|
append >tuple ;
|
||||||
|
|
||||||
|
: reshape-tuples ( class newslots -- )
|
||||||
|
>r dup "slot-names" word-prop r> permutation
|
||||||
|
[
|
||||||
|
>r [ swap class eq? ] curry instances dup r>
|
||||||
|
[ reshape-tuple ] curry map
|
||||||
|
become
|
||||||
|
] 2curry after-compilation ;
|
||||||
|
|
||||||
|
: tuple-class-unchanged 2drop ;
|
||||||
|
|
||||||
|
: prepare-tuple-class ( class slots -- )
|
||||||
dupd define-tuple-slots
|
dupd define-tuple-slots
|
||||||
dup define-tuple-layout
|
dup define-tuple-layout
|
||||||
define-tuple-predicate ;
|
define-tuple-predicate ;
|
||||||
|
|
||||||
|
: redefine-tuple-class ( class slots -- )
|
||||||
|
2dup forget-slots
|
||||||
|
2dup reshape-tuples
|
||||||
|
over changed-word
|
||||||
|
over redefined
|
||||||
|
prepare-tuple-class ;
|
||||||
|
|
||||||
|
: define-new-tuple-class ( class slots -- )
|
||||||
|
over f tuple tuple-class define-class
|
||||||
|
prepare-tuple-class ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
: define-tuple-class ( class slots -- )
|
||||||
|
{
|
||||||
|
{ [ over tuple-class? not ] [ define-new-tuple-class ] }
|
||||||
|
{ [ over "slot-names" word-prop over = ] [ tuple-class-unchanged ] }
|
||||||
|
{ [ t ] [ redefine-tuple-class ] }
|
||||||
|
} cond ;
|
||||||
|
|
||||||
M: tuple clone
|
M: tuple clone
|
||||||
(clone) dup delegate clone over set-delegate ;
|
(clone) dup delegate clone over set-delegate ;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue