{ V{ { red 0 } { green 3 } { blue 4 } } }
[ 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
GENERIC: enum>number ( enum -- number ) foldable
M: integer enum>number ;
-M: symbol enum>number "enum-value" word-prop ;
+M: word enum>number "enum-value" word-prop ;
<PRIVATE
: enum-boxer ( members -- quot )
<PRIVATE
: define-enum-value ( class value -- )
- "enum-value" set-word-prop ;
+ enum>number "enum-value" set-word-prop ;
: define-enum-members ( member-names -- )
- [
- [ first define-symbol ]
- [ first2 define-enum-value ] bi
- ] each ;
+ [ first define-symbol ] each ;
: define-enum-constructor ( word -- )
[ name>> "<" ">" surround create-in ] keep
assocs classes combinators combinators.short-circuit
compiler.units effects grouping kernel parser sequences
splitting words fry locals lexer namespaces summary math
-vocabs.parser words.constant ;
+vocabs.parser words.constant alien.enums ;
IN: alien.parser
SYMBOL: current-library
"*" ?head
[ [ <pointer> ] dip parse-pointers ] when ;
+: define-enum-value ( class value -- )
+ enum>number "enum-value" set-word-prop ;
+
: 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 )
scan (CREATE-C-TYPE) dup save-location ;