Home  |  Linux  | Mysql  | PHP  | XML
From:Darren Duncan Date:Wed Oct  1 18:49:53 2008
Subject:Re: RCF for option enhanced type constraints
Pre-defining type constraints like this is akin conceptually to defining 
subtypes.  If you want to do this at a level which is conceptually generic 
and intended to be widely used, you need to have more generic thinking than 
some of the examples suggest.

I'll suggest some alternatives here:

John Napiorkowski wrote:
>   Item[
>   	Default
>   ]
>       Bool
>       Maybe[`a]
>       Undef
>       Defined
>           Value[
>           	IsOneOf||Enum

You should also add an IsNotOneOf.

>           ]
>               Num[
> 				LessThanOrEqual || '<='
> 				LessThan || '<'
> 				GreaterThanOrEqual || '>='
> 				GreaterThan || '>'

First, all of these above 4 constraints should be applicable to any ordered 
type, not just Num; you should also be able to use them on Int and Str at 
least.  Or considering the context, Int and Str should have their own 
versions of these, so say, name them [NumLessThan, IntLessThan, 
StrLessThan].  Maybe also have versions for Bool for simple determinism; 
False is ordered before True; or maybe that's overkill.

Next, to aid code brevity, you should add Between and NotBetween 
constraints, which takes 2 boundary parameters to test the constrained 
value against.  Or have it take 4 parameters, where the extra 2 say whether 
each boundary value is inclusive or exclusive.  Or have separate Incl/Excl 
versions of the constraints, or something.  Likewise these should work with 
all ordered types.

For example:

   NumBetween[32,Incl,212,Excl]

> 				EqualTo || '='

The above 1 constraint I see limited utility for since then you've 
effectively declared a constant.  But perhaps a NotEqualTo constraint would 
have more utility.  If either exists, every type should have one.

> 				Precision
> 				Scale

These have a problem of being, on the face of it, radix-specific.  You 
should generalize those into versions that also have radix parameters, 
where 2 and 10 are likely the most common values; or maybe you already had 
a radix parameter in mind.

>               ]
>                 Int[
>                 	Signed

Signed has no purpose as it would allow all Int and is redundant; unless 
this was meant to be parameterized.

>                 	UnSigned

I would also add Positive to this list.  If they're not parameterized, then 
ditch Signed and add Int to these names, maybe abbrev to UInt and PInt.

If the above 2 are parameterized, then just ditch them and people can use 
IntBetween instead, which will let people have all of the above control, 
plus more, and its radix independent.

>                 ]
>                 	SmallInt
>                 	BigInt

These above 2 are particularly bad; at least get rid of them if you don't 
adopt any of my other suggestions.  Instead, let people use IntBetween (or 
a parameterized Signed/UnSigned) to specify what range of integers they 
want to allow.  Saying 'Small' or 'Big' means different things to everyone 
and such things are better off being user-defined.

>               Str[
>               	ASCII
>               	Printable
>               	Word (must be a single 'word')

No specific comments but the above 3 seem interesting; there should be 
something more generic there, maybe Repertoire, eg:

   Repertoire[ASCII]
   Repertoire[IsoLatin1]

>               	MaxLength
>               	MinLength
> 				EqualTo || 'eq'

About EqualTo, see my previous comment on Num's version.

>               ]
>                 ClassName[
>                 	PackageBase (For stuff like '::Plugin::MyPlugin')
>                 ]
>           Ref
>               ScalarRef
>               ArrayRef[`a][
>               	MaxElements
>               	MinElements
>               ]
>               HashRef[`a][
>               	HasAllKeys
>               ]
>               CodeRef
>               RegexpRef
>               GlobRef
>                 FileHandle
>               Object[
>               	HasMethods
>               	ISA
>               ]
>                   Role[
>                   	Requires
>                   	Does
>                   ]

-- Darren Duncan
Navigate in group perl.moose at sever nntp.perl.org
Previous Next




  
© No Copyright
You are free to use Anything
Site Maintained by PHP Developer
Powered By PHP Consultants