]> gitweb.factorcode.org Git - factor.git/commitdiff
alien.enums: allow enum members to be given values based on other enum symbols' values
authorJoe Groff <arcata@gmail.com>
Mon, 28 Jun 2010 22:56:44 +0000 (15:56 -0700)
committerJoe Groff <arcata@gmail.com>
Mon, 28 Jun 2010 22:56:44 +0000 (15:56 -0700)
basis/alien/enums/enums-tests.factor
basis/alien/enums/enums.factor
basis/alien/parser/parser.factor

index f0c665830d25296c1c4c8d17f410b87eb47af403..52337594a1d7edd839bc6525dfacf1bc108f49ed 100644 (file)
@@ -33,3 +33,7 @@ ENUM: instrument_t < ushort trombone trumpet ;
 
 { 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
index 18000105e7d0107a1bc7e750e9ed321a23b89d26..4ac7c24cb5c3c301985992f9b1657d3c4f8915ce 100644 (file)
@@ -12,7 +12,7 @@ PRIVATE>
 
 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 )
@@ -32,13 +32,10 @@ M: enum-c-type c-type-setter
 <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
index 332683a0ac02218a9400b0463ac0b16eb3dc24d3..baca25e07836896904fb678f4a48a1e6075627db 100755 (executable)
@@ -4,7 +4,7 @@ USING: accessors alien alien.c-types alien.libraries arrays
 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
@@ -75,8 +75,12 @@ M: pointer return-type-name to>> return-type-name CHAR: * suffix ;
     "*" ?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 ;