In a FLAC (as in Free Lossless Audio Codec) package for version 0.4 I used @enum to create a type to pass to calls to the C library libflac.
""" Metadata for a flac stream object. Used in both encoding and decoding of a stream. Each type of metadata object contains an indicator of its `typ`, an indicator of whether this is the last metadata block and its length, in bytes. """ abstract StreamMetaData @enum(MetadataType, InfoType=UInt32(0), PaddingType, ApplicationType, SeektableType, VorbisCommentType, CueSheetType, PictureType) Some of the constructors are boilerplate, differing only in the MetadataType. Can I iterate over these values and create all the constructors in a macro call? Alternatively, if I iterate over the range 0:6, can I convert the integer to a MetadataType? The boilerplate looks like """ A block containing information on the stream including `samplerate`, `channels`, `bitspersample`, `totalsamples`, and `mdsum`. """ type StreamInfoMetaData <: StreamMetaData typ::MetadataType is_last::Cint len::Int64 minblocksize::Int32 maxblocksize::Int32 minframesize::Int32 maxframesize::Int32 samplerate::Int32 channels::Int32 bitspersample::Int32 totalsamples::Int64 md5sum::NTuple{16,UInt8} end """ The zero-argument constructor uses storage allocated by libflac. """ function StreamInfoMetaData() md = unsafe_load(ccall((:FLAC__metadata_object_new,libflac), Ptr{StreamInfoMetaData},(MetadataType,),InfoType)) finalizer(md,x->ccall((:FLAC__metadata_object_delete,libflac), Void,(Ptr{StreamInfoMetaData},),pointer(x))) md end