Daniel Ruoso pointed out:

> Using bitsets in Perl 6 is just as easy as using in Perl 5 -- which
> happens to be the same as using in C, but it's not C...
> constant PERM_WRITE = 0b0001;
> constant PERM_READ  = 0b0010;
> constant PERM_EXEC  = 0b0100;
> constant PERM_NAMES = { PERM_WRITE => 'Write',
>                        PERM_READ  => 'Read',
>                        PERM_EXEC  => 'Exec' };
> subset Perm of Int where * < 8;

Sure. This certainly works, but the technique requires the developer to
hard-code each name twice and to hard-code the constant 8 as well.
This seems unfortunately brittle from a maintainability point of view.

I know hardware engineers aren't supposed to care about maintainability,
but I'd like us to make it easier for them to do the right thing than not. ;-)

> The thing that bugs me is that sets have way more uses then bitsets, and
> we might be overspecializing sets to support that semantics.

Yes. I have the same concern.

> If there's a strong case for bitsets, maybe it's worth having a
> specialized declarator.

Or maybe it doesn't need to be core syntax at all and I just need to create
a module that implements my original dream syntax/semantics; namely
a macro implementing a C<bitset> type declarator that allows:

    use Type::Bitset;

    bitset Perms <Read Write Exec Fold Spindle Mutilate>;
    # Declares enumerated constants with successive powers-of-two values
    # Also declares: subset Perms of Int where 0 .. [+|] @constant_values;
    # Hence allows:

    my Perms $perms     = Read +| Write +| Mutilate;   # Okay

    my Perms $bad_perms = Read +| Write +| 42;         # Error

Aw heck, now that I've specified it, the implementation is just a SMOP.
Forget I asked. I'll just write it myself! ;-)


Reply via email to