add initial-quot: syntax for tuples
parent
46a50fe0b9
commit
059eb399f0
|
@ -80,6 +80,7 @@ IN: bootstrap.syntax
|
||||||
">>"
|
">>"
|
||||||
"call-next-method"
|
"call-next-method"
|
||||||
"initial:"
|
"initial:"
|
||||||
|
"initial-quot:"
|
||||||
"read-only"
|
"read-only"
|
||||||
"call("
|
"call("
|
||||||
"execute("
|
"execute("
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
IN: classes.tuple.parser.tests
|
IN: classes.tuple.parser.tests
|
||||||
USING: accessors classes.tuple.parser lexer words classes
|
USING: accessors classes.tuple.parser lexer words classes
|
||||||
sequences math kernel slots tools.test parser compiler.units
|
sequences math kernel slots tools.test parser compiler.units
|
||||||
arrays classes.tuple eval ;
|
arrays classes.tuple eval multiline ;
|
||||||
|
|
||||||
TUPLE: test-1 ;
|
TUPLE: test-1 ;
|
||||||
|
|
||||||
|
@ -142,3 +142,17 @@ TUPLE: parsing-corner-case x ;
|
||||||
" x 3 }"
|
" x 3 }"
|
||||||
} "\n" join eval( -- tuple )
|
} "\n" join eval( -- tuple )
|
||||||
] [ error>> unexpected-eof? ] must-fail-with
|
] [ error>> unexpected-eof? ] must-fail-with
|
||||||
|
|
||||||
|
|
||||||
|
[ ] [
|
||||||
|
<" USE: sequences
|
||||||
|
IN: classes.tuple.tests
|
||||||
|
TUPLE: book { name initial-quot: [ "Lord of the " "Rings" append ] } ;">
|
||||||
|
eval( -- )
|
||||||
|
] unit-test
|
||||||
|
|
||||||
|
[ ] [
|
||||||
|
<" IN: classes.tuple.tests
|
||||||
|
TUPLE: monster { hp virtual } ;">
|
||||||
|
eval( -- )
|
||||||
|
] unit-test
|
||||||
|
|
|
@ -50,8 +50,19 @@ M: tuple class layout-of 2 slot { word } declare ;
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
|
: initial-value ( slot -- obj )
|
||||||
|
dup initial>> [
|
||||||
|
nip
|
||||||
|
] [
|
||||||
|
dup initial-quot>> [
|
||||||
|
nip call( -- obj )
|
||||||
|
] [
|
||||||
|
drop f
|
||||||
|
] if*
|
||||||
|
] if* ;
|
||||||
|
|
||||||
: initial-values ( class -- slots )
|
: initial-values ( class -- slots )
|
||||||
all-slots [ initial>> ] map ;
|
all-slots [ initial-value ] map ;
|
||||||
|
|
||||||
: pad-slots ( slots class -- slots' class )
|
: pad-slots ( slots class -- slots' class )
|
||||||
[ initial-values over length tail append ] keep ; inline
|
[ initial-values over length tail append ] keep ; inline
|
||||||
|
@ -176,7 +187,7 @@ ERROR: bad-superclass class ;
|
||||||
: compute-slot-permutation ( new-slots old-slots -- triples )
|
: compute-slot-permutation ( new-slots old-slots -- triples )
|
||||||
[ [ [ name>> ] map ] bi@ [ index ] curry map ]
|
[ [ [ name>> ] map ] bi@ [ index ] curry map ]
|
||||||
[ drop [ class>> ] map ]
|
[ drop [ class>> ] map ]
|
||||||
[ drop [ initial>> ] map ]
|
[ drop [ initial-value ] map ]
|
||||||
2tri 3array flip ;
|
2tri 3array flip ;
|
||||||
|
|
||||||
: update-slot ( old-values n class initial -- value )
|
: update-slot ( old-values n class initial -- value )
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
USING: arrays byte-arrays kernel kernel.private math namespaces
|
USING: arrays byte-arrays kernel kernel.private math namespaces
|
||||||
make sequences strings effects generic generic.standard
|
make sequences strings effects generic generic.standard
|
||||||
classes classes.algebra slots.private combinators accessors
|
classes classes.algebra slots.private combinators accessors
|
||||||
words sequences.private assocs alien quotations hashtables ;
|
words sequences.private assocs alien quotations hashtables summary ;
|
||||||
IN: slots
|
IN: slots
|
||||||
|
|
||||||
TUPLE: slot-spec name offset class initial read-only ;
|
TUPLE: slot-spec name offset class initial initial-quot read-only ;
|
||||||
|
|
||||||
PREDICATE: reader < word "reader" word-prop ;
|
PREDICATE: reader < word "reader" word-prop ;
|
||||||
|
|
||||||
|
@ -190,6 +190,7 @@ ERROR: bad-slot-attribute key ;
|
||||||
dup empty? [
|
dup empty? [
|
||||||
unclip {
|
unclip {
|
||||||
{ initial: [ [ first >>initial ] [ rest ] bi ] }
|
{ initial: [ [ first >>initial ] [ rest ] bi ] }
|
||||||
|
{ initial-quot: [ [ first >>initial-quot ] [ rest ] bi ] }
|
||||||
{ read-only [ [ t >>read-only ] dip ] }
|
{ read-only [ [ t >>read-only ] dip ] }
|
||||||
[ bad-slot-attribute ]
|
[ bad-slot-attribute ]
|
||||||
} case
|
} case
|
||||||
|
@ -197,7 +198,17 @@ ERROR: bad-slot-attribute key ;
|
||||||
|
|
||||||
ERROR: bad-initial-value name ;
|
ERROR: bad-initial-value name ;
|
||||||
|
|
||||||
|
ERROR: duplicate-initial-values slot ;
|
||||||
|
|
||||||
|
M: duplicate-initial-values summary
|
||||||
|
drop "Slots can either define initial: or initial-quot:, but not both" ;
|
||||||
|
|
||||||
|
: check-duplicate-initial-values ( slot-spec -- slot-spec )
|
||||||
|
dup [ initial>> ] [ initial-quot>> ] bi and
|
||||||
|
[ duplicate-initial-values ] when ;
|
||||||
|
|
||||||
: check-initial-value ( slot-spec -- slot-spec )
|
: check-initial-value ( slot-spec -- slot-spec )
|
||||||
|
check-duplicate-initial-values
|
||||||
dup initial>> [
|
dup initial>> [
|
||||||
[ ] [
|
[ ] [
|
||||||
dup [ initial>> ] [ class>> ] bi instance?
|
dup [ initial>> ] [ class>> ] bi instance?
|
||||||
|
|
|
@ -246,6 +246,8 @@ IN: bootstrap.syntax
|
||||||
|
|
||||||
"initial:" "syntax" lookup define-symbol
|
"initial:" "syntax" lookup define-symbol
|
||||||
|
|
||||||
|
"initial-quot:" "syntax" lookup define-symbol
|
||||||
|
|
||||||
"read-only" "syntax" lookup define-symbol
|
"read-only" "syntax" lookup define-symbol
|
||||||
|
|
||||||
"call(" [ \ call-effect parse-call( ] define-core-syntax
|
"call(" [ \ call-effect parse-call( ] define-core-syntax
|
||||||
|
|
Loading…
Reference in New Issue