add STRUCT: support to functors

db4
Joe Groff 2009-08-29 19:56:42 -05:00
parent 51405868d1
commit 4cc2330a2a
2 changed files with 99 additions and 5 deletions

View File

@ -1,5 +1,5 @@
USING: functors tools.test math words kernel multiline parser USING: classes.struct functors tools.test math words kernel
io.streams.string generic ; multiline parser io.streams.string generic ;
IN: functors.tests IN: functors.tests
<< <<
@ -151,3 +151,64 @@ SYMBOL: W-symbol
test-redefinition test-redefinition
<<
FUNCTOR: define-a-struct ( T NAME TYPE N -- )
T-class DEFINES-CLASS ${T}
WHERE
STRUCT: T-class
{ NAME int }
{ "x" { TYPE 4 } }
{ "y" { "short" N } }
{ "z" TYPE initial: 5 }
{ "w" { "int" 2 } } ;
;FUNCTOR
"a-struct" "nemo" "char" 2 define-a-struct
>>
[
{
T{ struct-slot-spec
{ name "nemo" }
{ offset 0 }
{ class integer }
{ initial 0 }
{ c-type "int" }
}
T{ struct-slot-spec
{ name "x" }
{ offset 4 }
{ class object }
{ initial f }
{ c-type { "char" 4 } }
}
T{ struct-slot-spec
{ name "y" }
{ offset 8 }
{ class object }
{ initial f }
{ c-type { "short" 2 } }
}
T{ struct-slot-spec
{ name "z" }
{ offset 12 }
{ class fixnum }
{ initial 5 }
{ c-type "char" }
}
T{ struct-slot-spec
{ name "w" }
{ offset 16 }
{ class object }
{ initial f }
{ c-type { "int" 2 } }
}
}
] [ a-struct struct-slots ] unit-test

View File

@ -1,11 +1,11 @@
! Copyright (C) 2008, 2009 Slava Pestov. ! Copyright (C) 2008, 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays classes.mixin classes.parser USING: accessors arrays classes.mixin classes.parser
classes.singleton classes.tuple classes.tuple.parser classes.singleton classes.struct classes.tuple classes.tuple.parser
combinators effects.parser fry generic generic.parser combinators effects.parser fry generic generic.parser
generic.standard interpolate io.streams.string kernel lexer generic.standard interpolate io.streams.string kernel lexer
locals.parser locals.types macros make namespaces parser locals locals.parser locals.types macros make namespaces parser
quotations sequences vocabs.parser words words.symbol ; quotations sequences slots vectors vocabs.parser words words.symbol ;
IN: functors IN: functors
! This is a hack ! This is a hack
@ -58,6 +58,32 @@ M: object (fake-quotations>) , ;
[ parse-definition* ] dip [ parse-definition* ] dip
parsed ; parsed ;
: scan-c-type* ( -- c-type/param )
scan {
{ [ dup "{" = ] [ drop \ } parse-until >array ] }
{ [ dup search ] [ search ] }
[ ]
} cond ;
:: parse-struct-slot* ( accum -- accum )
scan-param :> name
scan-c-type* :> c-type
\ } parse-until :> attributes
accum {
\ struct-slot-spec new
name >>name
c-type [ >>c-type ] [ struct-slot-class >>class ] bi
attributes [ dup empty? ] [ peel-off-attributes ] until drop
over push
} over push-all ;
: parse-struct-slots* ( accum -- accum more? )
scan {
{ ";" [ f ] }
{ "{" [ parse-struct-slot* t ] }
[ invalid-struct-slot ]
} case ;
SYNTAX: `TUPLE: SYNTAX: `TUPLE:
scan-param parsed scan-param parsed
scan { scan {
@ -71,6 +97,12 @@ SYNTAX: `TUPLE:
} case } case
\ define-tuple-class parsed ; \ define-tuple-class parsed ;
SYNTAX: `STRUCT:
scan-param parsed
[ 8 <vector> ] over push-all
[ parse-struct-slots* ] [ ] while
[ >array define-struct-class ] over push-all ;
SYNTAX: `SINGLETON: SYNTAX: `SINGLETON:
scan-param parsed scan-param parsed
\ define-singleton-class parsed ; \ define-singleton-class parsed ;
@ -147,6 +179,7 @@ DEFER: ;FUNCTOR delimiter
: functor-words ( -- assoc ) : functor-words ( -- assoc )
H{ H{
{ "TUPLE:" POSTPONE: `TUPLE: } { "TUPLE:" POSTPONE: `TUPLE: }
{ "STRUCT:" POSTPONE: `STRUCT: }
{ "SINGLETON:" POSTPONE: `SINGLETON: } { "SINGLETON:" POSTPONE: `SINGLETON: }
{ "MIXIN:" POSTPONE: `MIXIN: } { "MIXIN:" POSTPONE: `MIXIN: }
{ "M:" POSTPONE: `M: } { "M:" POSTPONE: `M: }