What's the deal with __buck?

Bill Baxter wbaxter at gmail.com
Wed Jan 28 20:53:04 PST 2009


On Thu, Jan 29, 2009 at 1:48 PM, Bill Baxter <wbaxter at gmail.com> wrote:
> On Thu, Jan 29, 2009 at 1:37 PM, Andrei Alexandrescu
> <SeeWebsiteForEmail at erdani.org> wrote:
>> I stumbled upon a very interesting problem. Consider an infinite range that
>> generates the numbers 1, 2, 3, ...
>>
>> That range doesn't have a "length" member. However, it is a random access
>> range, which makes things rather interesting. Now consider I want to advance
>> 10 steps in that range. Being an obedient D programmer I'd write:
>>
>> auto r = iota(1);
>> // skip 10 steps
>> r = r[10 .. $];
>>
>> Now this is very cool. If a range is infinite, I can use the $ symbol in the
>> right position, but nothing else. So I tried to effect that and got the
>> following to compile:
>>
>> struct DollarType {}
>> enum DollarType __dollar = DollarType();
>>
>> struct S
>> {
>>    void opSlice(uint, DollarType)
>>    {
>>    }
>> }
>>
>> void main()
>> {
>>    S s;
>>    s[0 .. $];
>> }
>>
>> This is cool because it allows detection of passing $. Now the problem is, I
>> can't seem to get rid of the __dollar definition! Has anyone found a
>> general-enough trick? I'd want a[...$...] to morph the $ into a.length *iff*
>> a defines length, and go with the __dollar otherwise.
>
> You need to give your DollarType an int and some arithmetic operators
> and have it represent an /offset/ from the end rather than signifying
> the end itself.
> Otherwise  a[$-1] can't work.
>
> Once you do that, then you can do things like
> struct S
> {
>   T opSlice(uint a,  DollarType b) {
>      return opSlice(a, length+b.offset);
>   }
>   T opSlice(uint a, uint b) {
>           ....
>   }
>   ...
> }

Nevermind, it just sunk in what you meant.
I think it's only a problem when you want to have some things in a
module with special __dollar and some with not?

Or I suppose you're probably trying to make template things which may
or may not be infinite?

I guess what's required is the ability to define the __dollar in the
scope of a class/struct/template.

--bb



More information about the Digitalmars-d mailing list