www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Deprecating things without a replacement

reply Robert Clipsham <robert octarineparrot.com> writes:
I've just begun updating my code to work with 2.054 and noticed that 
quite a few things have been deprecated - some without a decent 
replacement. Could the phobos team not make a habit of this please?

Example:

Before:
----
foreach (file; listDir(".", "*.d") ~ listDir("./foo/", "*.c"))
{
     // Do something
}
----
After (sorry about the awkward indentation):
----
void doSomething(string file)
{
     // Do something
}
foreach (string file;
              filter!`endsWith(a.name,".d"))`(
                         dirEntries(".",SpanMode.depth))
{
    doSomething(file);
}

foreach (string file;
              filter!`endsWith(a.name,".c")`(
                         dirEntries("./foo/",SpanMode.depth))
{
    doSomething(file);
}
----
Also note that you can't use dirEntries() ~ dirEntries() or 
chain(dirEntries(), dirEntries()) as DirIterator is not a range.

If things in phobos are going to be deprecated, could you make sure that 
a decent replacement for *all* use cases is in place before hand?

It would also be nice to add into the documentation how to use the 
replacement functions to the same effect - it took me forever to figure 
out how to replace listDir with dirEntries.

-- 
Robert
http://octarineparrot.com/
Jul 17 2011
next sibling parent Dmitry Olshansky <dmitry.olsh gmail.com> writes:
On 17.07.2011 19:28, Robert Clipsham wrote:
 I've just begun updating my code to work with 2.054 and noticed that
 quite a few things have been deprecated - some without a decent
 replacement. Could the phobos team not make a habit of this please?

 Example:

 Before:
 ----
 foreach (file; listDir(".", "*.d") ~ listDir("./foo/", "*.c"))
 {
     // Do something
 }
 ----
 After (sorry about the awkward indentation):
 ----
 void doSomething(string file)
 {
     // Do something
 }
 foreach (string file;
              filter!`endsWith(a.name,".d"))`(
                         dirEntries(".",SpanMode.depth))
 {
    doSomething(file);
 }

 foreach (string file;
              filter!`endsWith(a.name,".c")`(
                         dirEntries("./foo/",SpanMode.depth))
 {
    doSomething(file);
 }
 ----
 Also note that you can't use dirEntries() ~ dirEntries() or
 chain(dirEntries(), dirEntries()) as DirIterator is not a range.
DirIterator is a range as of 2.054. And as being responsible for this little upgrade let me show how to fix dirEntries() ~ dirEntries() problem e.g.: auto a = array(map!"a.name"(dirEntriies("."))); // does give you an array of file names And definitely you should be able to chain them :) Combining map and filter to archive your goal seem like a long way to solve a simple problem, but IMO it's not that bad and far more flexible. It might be a good idea to just make listDir to be this one-liner under the hood, I wasn't behind the whole deprecation idea.
 If things in phobos are going to be deprecated, could you make sure
 that a decent replacement for *all* use cases is in place before hand?

 It would also be nice to add into the documentation how to use the
 replacement functions to the same effect - it took me forever to
 figure out how to replace listDir with dirEntries.
-- Dmitry Olshansky
Jul 17 2011
prev sibling parent KennyTM~ <kennytm gmail.com> writes:
On Jul 17, 11 23:28, Robert Clipsham wrote:
 Also note that you can't use dirEntries() ~ dirEntries() or
 chain(dirEntries(), dirEntries()) as DirIterator is not a range.
This compiles and runs for me: ----------------------------------- import std.file, std.range, std.algorithm, std.stdio; void main() { auto dFiles = filter!`endsWith(a.name, ".d")`(dirEntries(".", SpanMode.depth)); auto cFiles = filter!`endsWith(a.name, ".c")`(dirEntries("./foo", SpanMode.depth)); foreach (file; chain(dFiles, cFiles)) { writeln(file.name); } } ----------------------------------- The problem is *not* DirIterator not being a range, but that DirIterator is not a range of *string*. The foreach loop you're using foreach (string file; obj) { ... } requires an *opApply* which outputs strings from 'obj', but the range interface of 'DirIterator' outputs 'DirEntry'.
Jul 17 2011