extend T{ } syntax to build structs
parent
25c3434892
commit
ca592b9654
|
@ -87,19 +87,21 @@ ERROR: bad-literal-tuple ;
|
|||
: parse-slot-values ( -- values )
|
||||
[ (parse-slot-values) ] { } make ;
|
||||
|
||||
: boa>tuple ( class slots -- tuple )
|
||||
GENERIC# boa>object 1 ( class slots -- tuple )
|
||||
|
||||
M: tuple-class boa>object
|
||||
swap prefix >tuple ;
|
||||
|
||||
: assoc>tuple ( class slots -- tuple )
|
||||
[ [ ] [ initial-values ] [ all-slots ] tri ] dip
|
||||
swap [ [ slot-named offset>> 2 - ] curry dip ] curry assoc-map
|
||||
[ dup <enum> ] dip update boa>tuple ;
|
||||
: assoc>object ( class slots -- tuple )
|
||||
[ [ ] [ initial-values ] [ class-slots ] tri ] dip
|
||||
swap [ [ slot-named* drop ] curry dip ] curry assoc-map
|
||||
[ dup <enum> ] dip update boa>object ;
|
||||
|
||||
: parse-tuple-literal-slots ( class -- tuple )
|
||||
scan {
|
||||
{ f [ unexpected-eof ] }
|
||||
{ "f" [ \ } parse-until boa>tuple ] }
|
||||
{ "{" [ parse-slot-values assoc>tuple ] }
|
||||
{ "f" [ \ } parse-until boa>object ] }
|
||||
{ "{" [ parse-slot-values assoc>object ] }
|
||||
{ "}" [ new ] }
|
||||
[ bad-literal-tuple ]
|
||||
} case ;
|
||||
|
|
|
@ -55,11 +55,14 @@ M: tuple class layout-of 2 slot { word } declare ;
|
|||
|
||||
PRIVATE>
|
||||
|
||||
: initial-values ( class -- slots )
|
||||
: tuple-initial-values ( class -- slots )
|
||||
all-slots [ initial>> ] map ;
|
||||
|
||||
: initial-values ( class -- slots )
|
||||
class-slots [ initial>> ] map ;
|
||||
|
||||
: pad-slots ( slots class -- slots' class )
|
||||
[ initial-values over length tail append ] keep ; inline
|
||||
[ tuple-initial-values over length tail append ] keep ; inline
|
||||
|
||||
: tuple>array ( tuple -- array )
|
||||
prepare-tuple>array
|
||||
|
@ -156,7 +159,7 @@ ERROR: bad-superclass class ;
|
|||
dup boa-check-quot "boa-check" set-word-prop ;
|
||||
|
||||
: tuple-prototype ( class -- prototype )
|
||||
[ initial-values ] keep over [ ] any?
|
||||
[ tuple-initial-values ] keep over [ ] any?
|
||||
[ slots>tuple ] [ 2drop f ] if ;
|
||||
|
||||
: define-tuple-prototype ( class -- )
|
||||
|
|
|
@ -236,5 +236,8 @@ M: slot-spec make-slot
|
|||
: finalize-slots ( specs base -- specs )
|
||||
over length iota [ + ] with map [ >>offset ] 2map ;
|
||||
|
||||
: slot-named* ( name specs -- offset spec/f )
|
||||
[ name>> = ] with find ;
|
||||
|
||||
: slot-named ( name specs -- spec/f )
|
||||
[ name>> = ] with find nip ;
|
||||
slot-named* nip ;
|
||||
|
|
|
@ -47,6 +47,14 @@ MACRO: <struct-boa> ( class -- quot: ( ... -- struct ) )
|
|||
M: struct-class boa
|
||||
<struct-boa> ; inline
|
||||
|
||||
: pad-struct-slots ( slots class -- slots' class )
|
||||
[ class-slots [ initial>> ] map over length tail append ] keep ;
|
||||
|
||||
M: struct-class boa>object
|
||||
swap pad-struct-slots
|
||||
[ <struct> swap ] [ "struct-slots" word-prop ] bi
|
||||
[ name>> setter-word execute( struct value -- struct ) ] 2each ;
|
||||
|
||||
! Struct slot accessors
|
||||
|
||||
M: struct-class reader-quot
|
||||
|
|
Loading…
Reference in New Issue