add STRUCT: support to functors
parent
51405868d1
commit
4cc2330a2a
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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: }
|
||||||
|
|
Loading…
Reference in New Issue