Re: replaceFirst, findPieces, and takeExactly

2011-01-23 Thread spir

On 01/23/2011 06:21 AM, Andrei Alexandrescu wrote:

On 1/22/11 10:59 PM, Jonathan M Davis wrote:

This will be a _fantastic_ function to have. I think that I probably even have
an enhancement request somewhere that includes such a function. It's far too
common that you have to find something and you want both what is before and
after
the point that you find. Now, that being the case, I'd probably more commonly
find
it useful to get the part before what was found and then the part beginning with
what was found, but this works too.


I suspect there might be a simple and intuitive way to define a family of
functions that give you whatever portions of the find you're interested in
(before, match, after, before and match, match and after). That could be either
a naming convention or a template argument. Any ideas, let me know.

Andrei


Guess (tell me if I'm wrong) english says cut into pieces. Thus, I would 
consider a paradigm starting with either cut- or piece-/pieces-.


Side-note I still find that find- (!) is wrong for funcs like findParts, even 
knowing the current find function actually returns the part match-and-after. 
Actually, it's find trying to do too much imo, should just return the (first) 
match; what anybody else would expect, or what? Thus, the name does not fit, 
the semantics is unexpected, and weird errors are to come.

auto bigNumber = find!(a10)(numbers); // too bad!
// Next applicant, please ;-)
Note I'm not at all against Andrei's generalised algos --on the contrary. But 
having them too smart at the price of beeing counter-intuitive is wrong imo.

/Side-note

Denis
_
vita es estrany
spir.wikidot.com



Re: replaceFirst, findPieces, and takeExactly

2011-01-23 Thread Andrei Alexandrescu

On 1/23/11 1:22 AM, Jim wrote:

Andrei Alexandrescu Wrote:

I suspect there might be a simple and intuitive way to define a family
of functions that give you whatever portions of the find you're
interested in (before, match, after, before and match, match and after).
That could be either a naming convention or a template argument. Any
ideas, let me know.



splitAt
splitBefore
splitAfter

?


That's a good suggestion, thanks. One issue is that if the element type 
of the range is integral, there is confusion (did you mean to split at 
position k?).


I decided to go with these:

http://d-programming-language.org/cutting-edge/phobos/std_algorithm.html#findSplit


Andrei


Re: replaceFirst, findPieces, and takeExactly

2011-01-23 Thread Jonathan M Davis
On Sunday 23 January 2011 07:12:34 Andrei Alexandrescu wrote:
 On 1/23/11 1:22 AM, Jim wrote:
  Andrei Alexandrescu Wrote:
  I suspect there might be a simple and intuitive way to define a family
  of functions that give you whatever portions of the find you're
  interested in (before, match, after, before and match, match and after).
  That could be either a naming convention or a template argument. Any
  ideas, let me know.
  
  splitAt
  splitBefore
  splitAfter
  
  ?
 
 That's a good suggestion, thanks. One issue is that if the element type
 of the range is integral, there is confusion (did you mean to split at
 position k?).
 
 I decided to go with these:
 
 http://d-programming-language.org/cutting-edge/phobos/std_algorithm.html#fi
 ndSplit

That definitely seems like a good solution.

- Jonathan M Davis


Re: replaceFirst, findPieces, and takeExactly

2011-01-22 Thread Nick Sabalausky
Andrei Alexandrescu seewebsiteforem...@erdani.org wrote in message 
news:ihfm34$jvb$1...@digitalmars.com...
 On 1/22/11 4:16 PM, bearophile wrote:
 Andrei:

 Back then people said that STL's find() is better than D's find()
 because the former returns
 an iterator that can be combined with either the first iterator to get
 the portion before the match, or with the last iterator to get the
 portion starting at the match. D's find() only gives you the portion
 after the match.

 There's a HUGE problem here. This equivalence is sometimes true, but 
 surely not always true:
 more powerful != better


 That function allows you to pick a determined number of elements from a
 range, assuming the range is never shorter than that. That sounds a bit
 obscure, but plays a pivotal role in findParts() (which is the name I
 settled on for the equivalent of Python's partition()):

 trisect is way better than findParts :-) And it's a single word with 
 no uppercase letters in the middle.

 There is still time until the next release. Votes for trisect?


vote--

findParts is the sort of thing that once you read what it does just 
*once*, it immediately becomes both obvious and easy to remember. But 
trisect is 1. scary, 2. I'd never remember it, and 3. Whenever I'd come 
across it, I'd never remember what it meant.  Those are paricularly bad 
since I know right now I'm going to find it an incredibly useful function: 
There's already been too many times I've written this mess and felt dirty 
about it:

auto result = find(str, delim);
auto firstPart = str[0..$-result.length];

So I'm thrilled to see this function being added.




Re: replaceFirst, findPieces, and takeExactly

2011-01-22 Thread Andrei Alexandrescu

On 1/22/11 5:14 PM, Nick Sabalausky wrote:

Andrei Alexandrescuseewebsiteforem...@erdani.org  wrote in message
news:ihfm34$jvb$1...@digitalmars.com...

On 1/22/11 4:16 PM, bearophile wrote:

Andrei:


Back then people said that STL's find() is better than D's find()
because the former returns
an iterator that can be combined with either the first iterator to get
the portion before the match, or with the last iterator to get the
portion starting at the match. D's find() only gives you the portion
after the match.


There's a HUGE problem here. This equivalence is sometimes true, but
surely not always true:
more powerful != better



That function allows you to pick a determined number of elements from a
range, assuming the range is never shorter than that. That sounds a bit
obscure, but plays a pivotal role in findParts() (which is the name I
settled on for the equivalent of Python's partition()):


trisect is way better than findParts :-) And it's a single word with
no uppercase letters in the middle.


There is still time until the next release. Votes for trisect?



vote--

findParts is the sort of thing that once you read what it does just
*once*, it immediately becomes both obvious and easy to remember. But
trisect is 1. scary, 2. I'd never remember it, and 3. Whenever I'd come
across it, I'd never remember what it meant.  Those are paricularly bad
since I know right now I'm going to find it an incredibly useful function:
There's already been too many times I've written this mess and felt dirty
about it:

auto result = find(str, delim);
auto firstPart = str[0..$-result.length];

So I'm thrilled to see this function being added.


Yes, I'm absolutely in agreement with the naming (and thrilled too). I 
imagine a putative user looking through std.algorithm (let's see... 
what find functions are out there?). That makes findPieces easy to get 
to, whereas trisect would be oddly situated in the alphabetic list and 
oddly named enough to be virtually undiscoverable.



Andrei


Re: replaceFirst, findPieces, and takeExactly

2011-01-22 Thread Tomek Sowiński
Andrei Alexandrescu napisał:

 On 1/22/11 5:14 PM, Nick Sabalausky wrote:
  Andrei Alexandrescuseewebsiteforem...@erdani.org  wrote in message
  news:ihfm34$jvb$1...@digitalmars.com...
  On 1/22/11 4:16 PM, bearophile wrote:
  Andrei:
 
  Back then people said that STL's find() is better than D's find()
  because the former returns
  an iterator that can be combined with either the first iterator to get
  the portion before the match, or with the last iterator to get the
  portion starting at the match. D's find() only gives you the portion
  after the match.
 
  There's a HUGE problem here. This equivalence is sometimes true, but
  surely not always true:
  more powerful != better
 
 
  That function allows you to pick a determined number of elements from a
  range, assuming the range is never shorter than that. That sounds a bit
  obscure, but plays a pivotal role in findParts() (which is the name I
  settled on for the equivalent of Python's partition()):
 
  trisect is way better than findParts :-) And it's a single word with
  no uppercase letters in the middle.
 
  There is still time until the next release. Votes for trisect?
 
 
  vote--
 
  findParts is the sort of thing that once you read what it does just
  *once*, it immediately becomes both obvious and easy to remember. But
  trisect is 1. scary, 2. I'd never remember it, and 3. Whenever I'd come
  across it, I'd never remember what it meant.  Those are paricularly bad
  since I know right now I'm going to find it an incredibly useful function:
  There's already been too many times I've written this mess and felt dirty
  about it:
 
  auto result = find(str, delim);
  auto firstPart = str[0..$-result.length];
 
  So I'm thrilled to see this function being added.
 
 Yes, I'm absolutely in agreement with the naming (and thrilled too). I 
 imagine a putative user looking through std.algorithm (let's see... 
 what find functions are out there?). That makes findPieces easy to get 
 to, whereas trisect would be oddly situated in the alphabetic list and 
 oddly named enough to be virtually undiscoverable.

Me a tad less, but not because of the name. I'd still rather see a lazy range 
of pre-hit-post tuples. Am I the only one to see findParts as a no-patterns 
variation of RegexMatch accepting all element types, not just char? Then even 
the name comes naturally -- match.

-- 
Tomek



Re: replaceFirst, findPieces, and takeExactly

2011-01-22 Thread so
Yes, I'm absolutely in agreement with the naming (and thrilled too). I  
imagine a putative user looking through std.algorithm (let's see...  
what find functions are out there?). That makes findPieces easy to get  
to, whereas trisect would be oddly situated in the alphabetic list and  
oddly named enough to be virtually undiscoverable.


If this is the reasoning. This is a split function, not a find.
There will be a few more of these split functions i suppose and this is  
the reason of my proposal splitAt.

It is in the definition of the function you quoted.

(Split) the string (at) the first occurrence of (sep)

splitAt(string, sep)

We can also overload it.

split(string, sep) // splits in two
split(string, sep, count)


Re: replaceFirst, findPieces, and takeExactly

2011-01-22 Thread Andrei Alexandrescu

On 1/22/11 5:41 PM, Tomek Sowiński wrote:

Andrei Alexandrescu napisał:


On 1/22/11 5:14 PM, Nick Sabalausky wrote:

Andrei Alexandrescuseewebsiteforem...@erdani.org   wrote in message
news:ihfm34$jvb$1...@digitalmars.com...

On 1/22/11 4:16 PM, bearophile wrote:

Andrei:


Back then people said that STL's find() is better than D's find()
because the former returns
an iterator that can be combined with either the first iterator to get
the portion before the match, or with the last iterator to get the
portion starting at the match. D's find() only gives you the portion
after the match.


There's a HUGE problem here. This equivalence is sometimes true, but
surely not always true:
more powerful != better



That function allows you to pick a determined number of elements from a
range, assuming the range is never shorter than that. That sounds a bit
obscure, but plays a pivotal role in findParts() (which is the name I
settled on for the equivalent of Python's partition()):


trisect is way better than findParts :-) And it's a single word with
no uppercase letters in the middle.


There is still time until the next release. Votes for trisect?



vote--

findParts is the sort of thing that once you read what it does just
*once*, it immediately becomes both obvious and easy to remember. But
trisect is 1. scary, 2. I'd never remember it, and 3. Whenever I'd come
across it, I'd never remember what it meant.  Those are paricularly bad
since I know right now I'm going to find it an incredibly useful function:
There's already been too many times I've written this mess and felt dirty
about it:

auto result = find(str, delim);
auto firstPart = str[0..$-result.length];

So I'm thrilled to see this function being added.


Yes, I'm absolutely in agreement with the naming (and thrilled too). I
imagine a putative user looking through std.algorithm (let's see...
what find functions are out there?). That makes findPieces easy to get
to, whereas trisect would be oddly situated in the alphabetic list and
oddly named enough to be virtually undiscoverable.


Me a tad less, but not because of the name. I'd still rather see a lazy range 
of pre-hit-post tuples. Am I the only one to see findParts as a no-patterns 
variation of RegexMatch accepting all element types, not just char? Then even 
the name comes naturally -- match.


Lazy in this case is not very helpful because you don't have the 
lengths. Turns out it's important to have the length. If not, you can 
always use until().


Andrei


Re: replaceFirst, findPieces, and takeExactly

2011-01-22 Thread spir

On 01/22/2011 11:16 PM, bearophile wrote:

That function allows you to pick a determined number of elements from a
  range, assuming the range is never shorter than that. That sounds a bit
  obscure, but plays a pivotal role in findParts() (which is the name I
  settled on for the equivalent of Python's partition()):

trisect is way better than findParts :-) And it's a single word with no 
uppercase letters in the middle.


Same for tripartite. Even better because it holds part and  is 
defined as:

   1. In three parts.
(http://en.wiktionary.org/wiki/tripartite)

My 2 cents.

(I find findParts uninformative and misleading. Kind of synonym of split.)

Denis
_
vita es estrany
spir.wikidot.com



Re: replaceFirst, findPieces, and takeExactly

2011-01-22 Thread spir

On 01/23/2011 12:40 AM, so wrote:

Yes, I'm absolutely in agreement with the naming (and thrilled too). I
imagine a putative user looking through std.algorithm (let's see...
what find functions are out there?). That makes findPieces easy to
get to, whereas trisect would be oddly situated in the alphabetic
list and oddly named enough to be virtually undiscoverable.


If this is the reasoning. This is a split function, not a find.
There will be a few more of these split functions i suppose and this is
the reason of my proposal splitAt.
It is in the definition of the function you quoted.

(Split) the string (at) the first occurrence of (sep)



splitAt(string, sep)


+++

splitAt is simply a Good Name! (even better than tripartite ;-)
Also for finding it in list of funcs.

Denis
_
vita es estrany
spir.wikidot.com



Re: replaceFirst, findPieces, and takeExactly

2011-01-22 Thread spir

On 01/23/2011 12:40 AM, so wrote:

Yes, I'm absolutely in agreement with the naming (and thrilled too). I
imagine a putative user looking through std.algorithm (let's see...
what find functions are out there?). That makes findPieces easy to
get to, whereas trisect would be oddly situated in the alphabetic
list and oddly named enough to be virtually undiscoverable.


If this is the reasoning. This is a split function, not a find.


Agreed, the function does not belong to the sub-list of find*, instead 
to split*. So's proposal splitAt not only respects that, but tells 
more accurate information. findPieces does not tell anything, thus 
anyone would expect it to cut the string into an arbitrary number of pieces.


Denis
_
vita es estrany
spir.wikidot.com



Re: replaceFirst, findPieces, and takeExactly

2011-01-22 Thread Daniel Gibson

Am 23.01.2011 04:42, schrieb spir:

On 01/23/2011 12:40 AM, so wrote:

Yes, I'm absolutely in agreement with the naming (and thrilled too). I
imagine a putative user looking through std.algorithm (let's see...
what find functions are out there?). That makes findPieces easy to
get to, whereas trisect would be oddly situated in the alphabetic
list and oddly named enough to be virtually undiscoverable.


If this is the reasoning. This is a split function, not a find.
There will be a few more of these split functions i suppose and this is
the reason of my proposal splitAt.
It is in the definition of the function you quoted.

(Split) the string (at) the first occurrence of (sep)

 

splitAt(string, sep)


+++

splitAt is simply a Good Name! (even better than tripartite ;-)
Also for finding it in list of funcs.

Denis
_
vita es estrany
spir.wikidot.com



To be honest, tripartite sounds kind of strange.
I don't know why, but I think of spiders when I read it ;)


Re: replaceFirst, findPieces, and takeExactly

2011-01-22 Thread spir

On 01/22/2011 10:27 PM, Andrei Alexandrescu wrote:

The first abstraction is the takeExactly() function:

http://d-programming-language.org/cutting-edge/phobos/std_range.html#takeExactly


That function allows you to pick a determined number of elements from a
range, assuming the range is never shorter than that. That sounds a bit
obscure, but plays a pivotal role in findParts() (which is the name I
settled on for the equivalent of Python's partition()):


What is reasoning behind having length set on takeExactly's result 
(while if succeeds, you know it, or don't you?), and not on take's 
result (which can return a smaller number of elements)? I would expect 
the opposite, or both, but maybe it's only me?


Denis
_
vita es estrany
spir.wikidot.com



Re: replaceFirst, findPieces, and takeExactly

2011-01-22 Thread spir

On 01/23/2011 04:49 AM, Daniel Gibson wrote:

splitAt is simply a Good Name! (even better than tripartite ;-)
Also for finding it in list of funcs.

Denis
_
vita es estrany
spir.wikidot.com



To be honest, tripartite sounds kind of strange.
I don't know why, but I think of spiders when I read it ;)


Don't know why, neither, really poetic association ;-)

Denis
_
vita es estrany
spir.wikidot.com



Re: replaceFirst, findPieces, and takeExactly

2011-01-22 Thread Andrei Alexandrescu

On 01/22/2011 10:16 PM, spir wrote:

On 01/22/2011 10:27 PM, Andrei Alexandrescu wrote:

The first abstraction is the takeExactly() function:

http://d-programming-language.org/cutting-edge/phobos/std_range.html#takeExactly



That function allows you to pick a determined number of elements from a
range, assuming the range is never shorter than that. That sounds a bit
obscure, but plays a pivotal role in findParts() (which is the name I
settled on for the equivalent of Python's partition()):


What is reasoning behind having length set on takeExactly's result
(while if succeeds, you know it, or don't you?), and not on take's
result (which can return a smaller number of elements)? I would expect
the opposite, or both, but maybe it's only me?

Denis


If the ranges involved are forward ranges, not passing around length 
information essentially throws away information painstakingly acquired 
(by means of O(n)).


Andrei


Re: replaceFirst, findPieces, and takeExactly

2011-01-22 Thread spir

On 01/23/2011 05:30 AM, Andrei Alexandrescu wrote:

On 01/22/2011 10:16 PM, spir wrote:

On 01/22/2011 10:27 PM, Andrei Alexandrescu wrote:

The first abstraction is the takeExactly() function:

http://d-programming-language.org/cutting-edge/phobos/std_range.html#takeExactly




That function allows you to pick a determined number of elements from a
range, assuming the range is never shorter than that. That sounds a bit
obscure, but plays a pivotal role in findParts() (which is the name I
settled on for the equivalent of Python's partition()):


What is reasoning behind having length set on takeExactly's result
(while if succeeds, you know it, or don't you?), and not on take's
result (which can return a smaller number of elements)? I would expect
the opposite, or both, but maybe it's only me?

Denis


If the ranges involved are forward ranges, not passing around length
information essentially throws away information painstakingly acquired (by
means of O(n)).


Agreed. But why not on take? (Did not check the code, but) the doc says for it:
If the range offers random access and length, Take offers them as well.
Length information is much more valuable info for take, as it may return less 
elements than specified. Or what do I miss? Why not (mixed with takeExactly's doc):
The result of take(range, n) always defines the length property (and 
initializea it to actual number of elements) even when range itself does not 
define length. If the range offers random access, Take offers them as well.

?

Denis
_
vita es estrany
spir.wikidot.com



Re: replaceFirst, findPieces, and takeExactly

2011-01-22 Thread Jonathan M Davis
On Saturday 22 January 2011 15:19:39 Andrei Alexandrescu wrote:
 On 1/22/11 5:14 PM, Nick Sabalausky wrote:
  Andrei Alexandrescuseewebsiteforem...@erdani.org  wrote in message
  news:ihfm34$jvb$1...@digitalmars.com...
  
  On 1/22/11 4:16 PM, bearophile wrote:
  Andrei:
  Back then people said that STL's find() is better than D's find()
  because the former returns
  an iterator that can be combined with either the first iterator to get
  the portion before the match, or with the last iterator to get the
  portion starting at the match. D's find() only gives you the portion
  after the match.
  
  There's a HUGE problem here. This equivalence is sometimes true, but
  surely not always true:
  more powerful != better
  
  That function allows you to pick a determined number of elements from
  a range, assuming the range is never shorter than that. That sounds a
  bit obscure, but plays a pivotal role in findParts() (which is the
  name I
  
  settled on for the equivalent of Python's partition()):
  trisect is way better than findParts :-) And it's a single word
  with no uppercase letters in the middle.
  
  There is still time until the next release. Votes for trisect?
  
  vote--
  
  findParts is the sort of thing that once you read what it does just
  *once*, it immediately becomes both obvious and easy to remember. But
  trisect is 1. scary, 2. I'd never remember it, and 3. Whenever I'd come
  across it, I'd never remember what it meant.  Those are paricularly bad
  since I know right now I'm going to find it an incredibly useful
  function: There's already been too many times I've written this mess and
  felt dirty about it:
  
  auto result = find(str, delim);
  auto firstPart = str[0..$-result.length];
  
  So I'm thrilled to see this function being added.
 
 Yes, I'm absolutely in agreement with the naming (and thrilled too). I
 imagine a putative user looking through std.algorithm (let's see...
 what find functions are out there?). That makes findPieces easy to get
 to, whereas trisect would be oddly situated in the alphabetic list and
 oddly named enough to be virtually undiscoverable.

vote

This will be a _fantastic_ function to have. I think that I probably even have 
an enhancement request somewhere that includes such a function. It's far too 
common that you have to find something and you want both what is before and 
after 
the point that you find. Now, that being the case, I'd probably more commonly 
find 
it useful to get the part before what was found and then the part beginning 
with 
what was found, but this works too.

It is essentially doing what find does, only giving you more stuff in the 
result, 
so I do think that it fits well with find, and having its name starting with 
find 
means that it will be near find in the documentation, which will make it much 
easier to find (no pun intended - though I do like puns). The term findParts 
doesn't really say what the function does (which parts are you looking for, 
after all?), but it _is_ a name which will be memorable, and once you've read 
the docs, it will be plenty clear what it does. I certainly can't think of a 
better name, and I definitely prefer it over the other names that I'm seeing 
suggested in this thread.

- Jonathan M Davis


Re: replaceFirst, findPieces, and takeExactly

2011-01-22 Thread Andrei Alexandrescu

On 1/22/11 10:57 PM, spir wrote:

On 01/23/2011 05:30 AM, Andrei Alexandrescu wrote:

On 01/22/2011 10:16 PM, spir wrote:

On 01/22/2011 10:27 PM, Andrei Alexandrescu wrote:

The first abstraction is the takeExactly() function:

http://d-programming-language.org/cutting-edge/phobos/std_range.html#takeExactly





That function allows you to pick a determined number of elements from a
range, assuming the range is never shorter than that. That sounds a bit
obscure, but plays a pivotal role in findParts() (which is the name I
settled on for the equivalent of Python's partition()):


What is reasoning behind having length set on takeExactly's result
(while if succeeds, you know it, or don't you?), and not on take's
result (which can return a smaller number of elements)? I would expect
the opposite, or both, but maybe it's only me?

Denis


If the ranges involved are forward ranges, not passing around length
information essentially throws away information painstakingly acquired
(by
means of O(n)).


Agreed. But why not on take? (Did not check the code, but) the doc says
for it:
If the range offers random access and length, Take offers them as well.
Length information is much more valuable info for take, as it may return
less elements than specified. Or what do I miss? Why not (mixed with
takeExactly's doc):
The result of take(range, n) always defines the length property (and
initializea it to actual number of elements) even when range itself does
not define length. If the range offers random access, Take offers them
as well.
?


take(r, n) takes at most n elements from r. It is unable to offer length 
because for an input or forward range that would cost O(n). (For an 
input range, that would also ruin the range.)


takeExactly(r, n) assumes that the range has at least n elements. As 
such, it is able to offer constant-time length.


These are quite different abstractions with different capabilities and 
power. I have been missing for years a complete solution to findPieces() 
because I've always wanted to express its results in terms of take() 
instead of takeExactly(). Only today I figured the puzzle out.



Andrei


Re: replaceFirst, findPieces, and takeExactly

2011-01-22 Thread Andrei Alexandrescu

On 1/22/11 10:59 PM, Jonathan M Davis wrote:

This will be a _fantastic_ function to have. I think that I probably even have
an enhancement request somewhere that includes such a function. It's far too
common that you have to find something and you want both what is before and 
after
the point that you find. Now, that being the case, I'd probably more commonly 
find
it useful to get the part before what was found and then the part beginning with
what was found, but this works too.


I suspect there might be a simple and intuitive way to define a family 
of functions that give you whatever portions of the find you're 
interested in (before, match, after, before and match, match and after). 
That could be either a naming convention or a template argument. Any 
ideas, let me know.


Andrei


Re: replaceFirst, findPieces, and takeExactly

2011-01-22 Thread Jim
Andrei Alexandrescu Wrote:
 I suspect there might be a simple and intuitive way to define a family 
 of functions that give you whatever portions of the find you're 
 interested in (before, match, after, before and match, match and after). 
 That could be either a naming convention or a template argument. Any 
 ideas, let me know.


splitAt
splitBefore
splitAfter

?