Option types and pattern matching.
TheFlyingFiddle via Digitalmars-d
digitalmars-d at puremagic.com
Tue Oct 27 14:11:53 PDT 2015
On Tuesday, 27 October 2015 at 17:48:04 UTC, Meta wrote:
> On Tuesday, 27 October 2015 at 15:06:07 UTC, TheFlyingFiddle
> wrote:
> This can arguably already be done cleaner in D.
>
> if (auto worldFile = getAFile("world.json"))
> {
> auto world = parseJSON(worldFile);
> if (auto mapFile = getAFile(world["map"))
> {
> //...
> }
> else enforce(false, "Failed to load: " ~ world["map"]);
> }
> else enforce(false, "Failed to load: world.json");
>
> Or even:
>
> auto worldFile = enforce(getAFile("world.json"), "Failed to
> load: world.json");
> auto world = parseJSON(worldFile);
> auto mapFile = enforce(getAFile(world["map"]), "Failed to load:
> " ~ world["map"]);
> //...
>
> From what I've seen in the Rust community, they try to avoid
> using match as it's very syntactically heavy. They have all
> kinds of idioms to avoid doing matches on Option, such as the
> try! macro, unwrap_or, unwrap_or_else, etc.
>
> That being said, pattern matching has been one of my
> most-wanted D features for years.
Yes this is much cleaner. But it does not really force a user to
consider the empty case.
I mean this would still compile.
auto worldFile = getAFile("world.json");
auto world = parseJSON(worldFile);
auto mapFile = getAFile(world["map"]);
auto map = parseJSON(mapFile);
What I was after was a way to at compile time ensure that all
accesses to the value in the optional type are considered. From
my uses of Maybe in haskell i know this get's annoying quick so I
dunno if it's a good thing. But atleast you would know that in
all places that optionals are accessed a handler for the empty
case would be present.
More information about the Digitalmars-d
mailing list