On 2/set/2005, at 00:28, Rayiner Hashem wrote:
Hello! I've encountered some behavior in C-FFI that I would like to discuss. When you try to define an enumeration containing duplicate values, C-FFI gives the error:
"A foreign enum cannot contain duplicate values: 0."
However, C enumerations can contain duplicate values, and this feature is used by real code.
My bad. When adding that check I wondered if duplicate values would make sense, IIRC I probably let the check in because I wondered about what to do in this case:
(defcenum foo (:a 0) (:b 0))
When for example some function with FOO as a return type returns 0, what keyword should 0 be translated to? :A or :B?
CLISP warns and uses the last value: [this is what James's tree does iirc, except it doesn't warn]
[1]> (ffi:def-c-enum foo (a 0) (b 0)) WARNING: FFI:DEF-C-ENUM (FOO): value 0 will be assigned to both A and B FOO [2]> (ffi:enum-from-value 'foo 0) B
CMUCL and SBCL throw an error:
Error in function PARSE-ENUM: Element value 0 used more than once. [Condition of type SIMPLE-ERROR]
Lispworks doesn't warn and uses the first:
CL-USER 1 > (fli:define-c-enum foo (a 0) (b 0)) (:ENUM FOO)
CL-USER 2 > (fli:enum-value-symbol 'foo 0) A
Any suggestions?