alien: merge enum improvements from Blei/gtk-image-loader

db4
Joe Groff 2011-08-27 13:48:30 -07:00
parent 38c5652093
commit a820c1091d
4 changed files with 29 additions and 11 deletions

View File

@ -33,3 +33,19 @@ ENUM: instrument_t < ushort trombone trumpet ;
{ V{ { red 0 } { green 3 } { blue 4 } } } { V{ { red 0 } { green 3 } { blue 4 } } }
[ color_t "c-type" word-prop members>> ] unit-test [ color_t "c-type" word-prop members>> ] unit-test
ENUM: colores { rojo red } { verde green } { azul blue } { colorado rojo } ;
[ { 0 3 4 0 } ] [ { rojo verde azul colorado } [ enum>number ] map ] unit-test
SYMBOLS: couleurs rouge vert bleu jaune azure ;
<< \ couleurs int {
{ rouge red }
{ vert green }
{ bleu blue }
{ jaune 14 }
{ azure bleu }
} define-enum >>
[ { 0 3 4 14 4 } ] [ { rouge vert bleu jaune azure } [ enum>number ] map ] unit-test

View File

@ -30,16 +30,13 @@ M: enum-c-type c-type-unboxer-quot drop [ enum>number ] ;
M: enum-c-type c-type-setter M: enum-c-type c-type-setter
[ enum>number ] swap base-type>> c-type-setter '[ _ 2dip @ ] ; [ enum>number ] swap base-type>> c-type-setter '[ _ 2dip @ ] ;
: define-enum-value ( class value -- )
enum>number "enum-value" set-word-prop ;
<PRIVATE <PRIVATE
: define-enum-value ( class value -- )
"enum-value" set-word-prop ;
: define-enum-members ( members -- ) : define-enum-members ( members -- )
[ [ first define-singleton-class ] each ;
[ drop define-singleton-class ]
[ define-enum-value ] 2bi
] assoc-each ;
: define-enum-constructor ( word -- ) : define-enum-constructor ( word -- )
[ name>> "<" ">" surround create-in ] keep [ name>> "<" ">" surround create-in ] keep
@ -47,10 +44,14 @@ M: enum-c-type c-type-setter
PRIVATE> PRIVATE>
: define-enum ( word base-type members -- ) : (define-enum) ( word base-type members -- )
[ dup define-enum-constructor ] 2dip [ dup define-enum-constructor ] 2dip
[ define-enum-members ] [ define-enum-members ]
[ <enum-c-type> swap typedef ] bi ; [ <enum-c-type> swap typedef ] bi ;
: define-enum ( word base-type members -- )
[ (define-enum) ]
[ [ define-enum-value ] assoc-each ] bi ;
PREDICATE: enum-c-type-word < c-type-word PREDICATE: enum-c-type-word < c-type-word
"c-type" word-prop enum-c-type? ; "c-type" word-prop enum-c-type? ;

View File

@ -4,7 +4,7 @@ USING: accessors alien alien.c-types alien.libraries arrays
assocs classes combinators combinators.short-circuit assocs classes combinators combinators.short-circuit
compiler.units effects grouping kernel parser sequences compiler.units effects grouping kernel parser sequences
splitting words fry locals lexer namespaces summary math splitting words fry locals lexer namespaces summary math
vocabs.parser words.constant classes.parser ; vocabs.parser words.constant classes.parser alien.enums ;
IN: alien.parser IN: alien.parser
SYMBOL: current-library SYMBOL: current-library
@ -84,7 +84,8 @@ M: pointer return-type-name to>> return-type-name CHAR: * suffix ;
[ [ <pointer> ] dip parse-pointers ] when ; [ [ <pointer> ] dip parse-pointers ] when ;
: next-enum-member ( members name value -- members value' ) : next-enum-member ( members name value -- members value' )
[ 2array suffix! ] [ 1 + ] bi ; [ define-enum-value ]
[ [ 2array suffix! ] [ enum>number 1 + ] bi ] 2bi ;
: parse-enum-name ( -- name ) : parse-enum-name ( -- name )
scan (CREATE-C-TYPE) dup save-location ; scan (CREATE-C-TYPE) dup save-location ;

View File

@ -29,7 +29,7 @@ SYNTAX: TYPEDEF:
scan-c-type CREATE-C-TYPE dup save-location typedef ; scan-c-type CREATE-C-TYPE dup save-location typedef ;
SYNTAX: ENUM: SYNTAX: ENUM:
parse-enum define-enum ; parse-enum (define-enum) ;
SYNTAX: C-TYPE: SYNTAX: C-TYPE:
void CREATE-C-TYPE typedef ; void CREATE-C-TYPE typedef ;