September 02, 2012 handful and interval | ||||
---|---|---|---|---|
| ||||
I'd like to add a simple function to std called "handful". It would return a small, read-only set of which main facility is membership test: string a = "class"; if (a in handful("struct", "class", "union")) { ... } Would it be generally useful, and if so what module does it belong to? Same question about "interval", which is a fair amount more interesting if done right. An interval is a pair of values from a type that supports inequality comparison. It would have a variety of interval-specific operations, of which this would probably be quite popular: int x; ... if (x in interval(1, 2)) { ... } Destroy, Andrei |
September 02, 2012 Re: handful and interval | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrei Alexandrescu | On 02-09-2012 16:22, Andrei Alexandrescu wrote: > I'd like to add a simple function to std called "handful". It would > return a small, read-only set of which main facility is membership test: > > string a = "class"; > if (a in handful("struct", "class", "union")) > { > ... > } > > Would it be generally useful, and if so what module does it belong to? Yes! I have wanted this so many times in my code. I think std.algorithm is a reasonable place. Though, maybe just call the function set(). It won't collide with anything else anyway (like a Set in std.container or whatever). Also, please avoid backing it with an AA (I don't know if you wanted to do that, but just saying). While it would make the code significantly simpler, it means involving the GC, which is undesirable for such a simple utility function. (I still think allowing 'in' on arrays would be a better approach, but this is better than nothing!) > > Same question about "interval", which is a fair amount more interesting > if done right. An interval is a pair of values from a type that supports > inequality comparison. It would have a variety of interval-specific > operations, of which this would probably be quite popular: > > int x; > ... > if (x in interval(1, 2)) > { > ... > } I don't deal much in this sort of code, but I can see it being useful (it's certainly prettier than writing the checks out manually). I don't really know what else I would expect from such a type, though. > > > Destroy, > > Andrei -- Alex Rønne Petersen alex@lycus.org http://lycus.org |
September 02, 2012 Re: handful and interval | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrei Alexandrescu | On 9/2/12 4:22 PM, Andrei Alexandrescu wrote: [snip] The alternative would be to simply define these as functions: if (a.among("struct", "class", "union")) { ... } if (b.between(1, 100)) { ... } Andrei |
September 02, 2012 Re: handful and interval | ||||
---|---|---|---|---|
| ||||
Posted in reply to Alex Rønne Petersen | On Sunday, 2 September 2012 at 14:42:43 UTC, Alex Rønne Petersen wrote:
> On 02-09-2012 16:22, Andrei Alexandrescu wrote:
>> int x;
>> ...
>> if (x in interval(1, 2))
>> {
>> ...
>> }
>
> I don't deal much in this sort of code, but I can see it being useful (it's certainly prettier than writing the checks out manually). I don't really know what else I would expect from such a type, though.
Hm, maybe assert(interval(1, 3) & interval(2, 4) == interval(2, 3)) and similar operations?
David
|
September 02, 2012 Re: handful and interval | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrei Alexandrescu | On 2012-09-02 16:22, Andrei Alexandrescu wrote: > I'd like to add a simple function to std called "handful". It would > return a small, read-only set of which main facility is membership test: > > string a = "class"; > if (a in handful("struct", "class", "union")) > { > ... > } > > Would it be generally useful, and if so what module does it belong to? I really don't like the name "handful". What would be the difference compared to a regular set container? To me it sounds like we should have a standard set container in Phobos, std.container.set. -- /Jacob Carlborg |
September 02, 2012 Re: handful and interval | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrei Alexandrescu | On 2012-09-02 16:22, Andrei Alexandrescu wrote: > Same question about "interval", which is a fair amount more interesting > if done right. An interval is a pair of values from a type that supports > inequality comparison. It would have a variety of interval-specific > operations, of which this would probably be quite popular: > > int x; > ... > if (x in interval(1, 2)) > { > ... > } Isn't this a bit like std.range.iota? Perhaps extending that returned value with opIn and other functionality. -- /Jacob Carlborg |
September 02, 2012 Re: handful and interval | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrei Alexandrescu | On 9/2/12 11:45 PM, Andrei Alexandrescu wrote:
> On 9/2/12 4:22 PM, Andrei Alexandrescu wrote:
> [snip]
>
> The alternative would be to simply define these as functions:
>
> if (a.among("struct", "class", "union")) { ... }
> if (b.between(1, 100)) { ... }
>
>
> Andrei
if (a in ["struct", "class", "union"]) { ... }
if (a in someArrayVar) { ... }
works wonders for me. Why not? Somehow I cannot see the disadvantages. Please educate.
Andrew
|
September 02, 2012 Re: handful and interval | ||||
---|---|---|---|---|
| ||||
Posted in reply to David Nadlinger | On 9/2/12 4:50 PM, David Nadlinger wrote: > On Sunday, 2 September 2012 at 14:42:43 UTC, Alex Rønne Petersen wrote: >> On 02-09-2012 16:22, Andrei Alexandrescu wrote: >>> int x; >>> ... >>> if (x in interval(1, 2)) >>> { >>> ... >>> } >> >> I don't deal much in this sort of code, but I can see it being useful >> (it's certainly prettier than writing the checks out manually). I >> don't really know what else I would expect from such a type, though. > > Hm, maybe assert(interval(1, 3) & interval(2, 4) == interval(2, 3)) and > similar operations? Thought about sugar for set operations using arithmetic operators, but decided against, because that would create a lot of confusion with http://en.wikipedia.org/wiki/Interval_arithmetic. Andrei |
September 02, 2012 Re: handful and interval | ||||
---|---|---|---|---|
| ||||
Posted in reply to Tyro[17] | On 02-09-2012 17:05, Tyro[17] wrote: > On 9/2/12 11:45 PM, Andrei Alexandrescu wrote: >> On 9/2/12 4:22 PM, Andrei Alexandrescu wrote: >> [snip] >> >> The alternative would be to simply define these as functions: >> >> if (a.among("struct", "class", "union")) { ... } >> if (b.between(1, 100)) { ... } >> >> >> Andrei > > if (a in ["struct", "class", "union"]) { ... } > if (a in someArrayVar) { ... } > > works wonders for me. Why not? Somehow I cannot see the disadvantages. > Please educate. > > Andrew The argument seems to be that since an array search is O(n) and an AA lookup is O(1), this example would be "misleading". Not that I think this matters at all in practice. -- Alex Rønne Petersen alex@lycus.org http://lycus.org |
September 02, 2012 Re: handful and interval | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jacob Carlborg | Le 02/09/2012 16:51, Jacob Carlborg a écrit :
> On 2012-09-02 16:22, Andrei Alexandrescu wrote:
>> I'd like to add a simple function to std called "handful". It would
>> return a small, read-only set of which main facility is membership test:
>>
>> string a = "class";
>> if (a in handful("struct", "class", "union"))
>> {
>> ...
>> }
>>
>> Would it be generally useful, and if so what module does it belong to?
>
> I really don't like the name "handful". What would be the difference
> compared to a regular set container? To me it sounds like we should have
> a standard set container in Phobos, std.container.set.
>
+1, and we are back to the allocator design.
|
Copyright © 1999-2021 by the D Language Foundation