Treating the abusive unsigned syndrome

Nick Sabalausky a at a.a
Wed Nov 26 05:17:34 PST 2008


"KennyTM~" <kennytm at gmail.com> wrote in message 
news:ggipu6$26mr$1 at digitalmars.com...
> Nick Sabalausky wrote:
>> "bearophile" <bearophileHUGS at lycos.com> wrote in message 
>> news:gghc97$1mfo$1 at digitalmars.com...
>>> Steven Schveighoffer:
>>>> lol!!!
>>> I know, I know... :-) But when people do errors so often, the error is 
>>> elsewhere, in the original choice of that word to denote how many items 
>>> an iterable has.
>>>
>>> In my libs I have defined len() like this, that I use now and then 
>>> (where running speed isn't essential):
>>>
>>> long len(TyItems)(TyItems items) {
>>>    static if (HasLength!(TyItems))
>>>        return items.length;
>>>    else {
>>>        long len;
>>>        // this generates: foreach (p1, p2, p3; items) len++;  with a 
>>> variable number of p1, p2...
>>>        mixin("foreach (" ~ SeriesGen1!("p", ", ", 
>>> OpApplyCount!(TyItems), 1) ~ "; items) len++;");
>>>        return len;
>>>    }
>>> } // End of len(items)
>>>
>>> /// ditto
>>> long len(TyItems, TyFun)(TyItems items, TyFun pred) {
>>>    static assert(IsCallable!(TyFun), "len(): predicate must be a 
>>> callable");
>>>    long len;
>>>
>>>    static if (IsAA!(TyItems)) {
>>>        foreach (key, val; items)
>>>            if (pred(key, val))
>>>                len++;
>>>    } else static if (is(typeof(TyItems.opApply))) {
>>>        mixin("foreach (" ~ SeriesGen1!("p", ", ", 
>>> OpApplyCount!(TyItems), 1) ~ "; items)
>>>            if (pred(" ~ SeriesGen1!("p", ", ", OpApplyCount!(TyItems), 
>>> 1) ~ "))
>>>                len++;");
>>>    } else {
>>>        foreach (el; items)
>>>            if (pred(el))
>>>                len++;
>>>    }
>>>
>>>    return len;
>>> } // End of len(items, pred)
>>>
>>> alias len!(string) strLen; /// ditto
>>> alias len!(int[]) intLen; /// ditto
>>> alias len!(float[]) floatLen; /// ditto
>>>
>>> Having a global callable like len() instead of an attribute is 
>>> (sometimes) better, because you can use it for example like this (this 
>>> is working syntax of my dlibs):
>>>
>>> children.sort(&len!(string));
>>> That sorts the array of strings "children" according to the given 
>>> callable key, that is the len of the strings.
>>>
>>
>> If we ever get extension methods, then maybe something along these lines 
>> would be nice:
>>
>> extension typeof(T.length) len(T t)
>> {
>>     return T.length;
>> }
>>
>>
>
> Already works:
>
> uint len(A) (in A x) { return x.length; }

Oh, right. For some stupid reason I was forgetting that the param would 
always be an array and therefore be eligible for the existing array property 
syntax (and that .length always returns a uint). 





More information about the Digitalmars-d mailing list