On Thursday, 6 June 2013 at 07:05:52 UTC, Lars T. Kyllingstad wrote:
Paths are usually obtained in string form, and they are normally passed to other functions and third party libraries in string form. Having to convert them to something else just to do what is, in fact, string manipulations, is just annoying.

Well, when designing Path, I didn't want to add much, if any, programmer overhead. Conversion to a Path is trivial: Change the type to Path, and 90% of the time it'll just work. The only case that comes to mind where a string can't be implicitly assigned/converted to a Path is when passing it to a function, in which case all it needs to be wrapped in is Path(). Or, have an overloaded version that takes a string (which all path using functions do now anyways).

(One of my biggest gripes with boost::filesystem is that conversions between path and string necessitate a copy, which is not a problem with your Path type, so in that respect it is better than Boost's solution.)


[...]

Why I think it should be reconsidered for inclusion in the std (listed in the pull): * Adds a (more) platform independent abstraction for path strings.

How is this more platform independent? It is just a simple wrapper around a string, with methods that forward to already-extant module-level functions.

I should have said "makes it easier to be platform independent". Normalization is done automatically on comparison. There's nothing you can't do with normal std.path functions, but that's not the point. It's to be type safe and add convenience.

* Path provides a type safe way to pass, compare, and manipulate arbitrary path strings.

How is it safer? I would agree with this if it verified that isValidpath(_path) on construction and maintained this as an invariant, but I cannot see that it does.

Type safe. Once you've got a huge program with many concepts floating around, you don't want to have to keep track of which strings are paths and which aren't, and you don't want to do all the specifics like splitting, normalization, and joining with raw string functions. This isn't just conjecture either; there are D programs in the wild that abstract away path strings because it's easier to deal with them that way. I didn't want to force paths passed in to be valid, because the programmer might want an invalid path passed around for whatever reason.

* It wraps over the functions defined in std.path, so behavior of methods on Path are, in most cases, identical to their corresponding module function.

Then what is the added value?

See above. I didn't want to change functionality, just make it easier to use.

As the author of std.path this may come across as hostile or jealous, but I don't see that the proposed change improves anything.

You came off as quite constructive; thank you :-)

Reply via email to