From 0cb3eff34b1d03344d2894fdf34d6f99e21bf5f5 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Mon, 28 Jun 2010 15:56:44 -0700 Subject: [PATCH] alien.enums: allow enum members to be given values based on other enum symbols' values --- basis/alien/enums/enums-tests.factor | 4 ++++ basis/alien/enums/enums.factor | 9 +++------ basis/alien/parser/parser.factor | 8 ++++++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/basis/alien/enums/enums-tests.factor b/basis/alien/enums/enums-tests.factor index f0c665830d..52337594a1 100644 --- a/basis/alien/enums/enums-tests.factor +++ b/basis/alien/enums/enums-tests.factor @@ -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 diff --git a/basis/alien/enums/enums.factor b/basis/alien/enums/enums.factor index 18000105e7..4ac7c24cb5 100644 --- a/basis/alien/enums/enums.factor +++ b/basis/alien/enums/enums.factor @@ -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 ; 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 diff --git a/basis/alien/parser/parser.factor b/basis/alien/parser/parser.factor index 332683a0ac..baca25e078 100755 --- a/basis/alien/parser/parser.factor +++ b/basis/alien/parser/parser.factor @@ -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 [ [ ] 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 ; -- 2.34.1