Flagging special conditions on return from a function call

Simen Kjærås simen.kjaras at gmail.com
Tue Jun 23 06:52:29 UTC 2020


On Tuesday, 23 June 2020 at 04:01:45 UTC, Denis wrote:
> (1) Assign an unused value for the flag (e.g. -1 when the 
> function returns an int), and return the combined value/flag.

This happens in some Phobos algorithms, and might be the most 
common on this list.


> (2) Return a tuple with the value and the flag
> (3) Return a struct or tuple with named value and flag members

Would certainly work, but I don't think it's common in D.


> (4) Set the function return value normally, and put the flag in 
> an "out" variable passed as an argument to the function
> (5) Return the flag, and put the value in an "out" variable 
> passed to the function (i.e. the reverse of #4)

Both of these happen. I don't know which is more common. In C# 
these are probably the most common way (except for exceptions) to 
signal these cases.


> (6) Use two separate functions, one that returns the value, and 
> another that can be called afterwards to check the flag (like 
> eof(), for example)


> (7) Use a side effect and set a designated global variable

Global variables are frowned upon, so probably not this. :p


One thing I feel is missing here (perhaps because 
std.variant.Algebraic is egregious):

(8) Return a Maybe!T or Algebraic!(T, ErrorCode)

It's what I personally would prefer, but I have only rarely seen 
it in D code. Given a properly written Maybe, this could enforce 
proper handling of the error case, either by throwing on trying 
to get at Maybe!T.getValue when it's holding None, or by 
presenting an interface that only compiles when both cases are 
covered, like fun().match((T t) => t, () => Error()).

--
   Simen


More information about the Digitalmars-d-learn mailing list