Re: Enforcing checks for return code

2016-02-21 Thread Chris Katko via Digitalmars-d-learn

On Thursday, 18 February 2016 at 10:46:03 UTC, Marc Schütz wrote:
On Thursday, 18 February 2016 at 07:21:05 UTC, Chris Katko 
wrote:

[...]


As Jonathan said, there's no such built-in feature, and 
exception are preferred over return codes. However, you can 
implement such a check at run time:


[...]


Thank you all for your insight. I think I have all the 
information I need.


Re: Enforcing checks for return code

2016-02-18 Thread Marc Schütz via Digitalmars-d-learn

On Thursday, 18 February 2016 at 07:21:05 UTC, Chris Katko wrote:
Hello. I'm almost brand-new to the D language and still 
absorbing things.


I'm wondering if it's possible to fire off a compile-time (or 
worst case, a run-time) warning or error if a function is 
called, but the return value is not checked.


I'm not trying to enforce whether someone actually deciphers 
the value's meaning correctly. I just want to enforce that 
somewhere, a variable or expression is receiving the return 
value of a particular function.


Any ideas?



As Jonathan said, there's no such built-in feature, and exception 
are preferred over return codes. However, you can implement such 
a check at run time:


struct ForceCheck(T) {
private T payload;
private bool checked = false;
@disable this();
@disable this(this);
this()(auto ref T payload) { this.payload = payload; }
ref T get() {
this.checked = true;
return payload;
}
alias get this;
void ignore() {
this.checked = true;
}
~this() {
assert(this.checked, "you forgot to check the return 
value");

}
}

auto forceCheck(T)(auto ref T value) {
return ForceCheck!T(value);
}

auto foo() {
return forceCheck(42);
}

void main() {
{
auto a = foo();
if(a != 42) { } // stored values
}
{
if(foo() != 42) { } // direct access
}
{
foo().ignore(); // explicitly ignore return value
}
{
auto b = foo(); // this one asserts
foo();  // as does this one
}
}

I guess it's reasonably performant; it could be optimized further 
by only adding the `checked` member if assertions are enabled 
(using `version(assert)`).


Re: Enforcing checks for return code

2016-02-18 Thread tsbockman via Digitalmars-d-learn

On Thursday, 18 February 2016 at 07:21:05 UTC, Chris Katko wrote:
Hello. I'm almost brand-new to the D language and still 
absorbing things.


I'm wondering if it's possible to fire off a compile-time (or 
worst case, a run-time) warning or error if a function is 
called, but the return value is not checked.


I'm not trying to enforce whether someone actually deciphers 
the value's meaning correctly. I just want to enforce that 
somewhere, a variable or expression is receiving the return 
value of a particular function.


Any ideas?

I imagine I could use a compiler flag to warn, but that's a 
global setting. I'm looking more for a specified subset of 
functions.


Off hand, I see two reasonable ways to do this:

1) Instead of actually returning the value, require the caller to 
pass the destination variable as a `ref` or `out` parameter.


Disadvantages: This could be a bit slower than using actual 
return values, and it would change the syntax.


2) Wrap the return value in a struct like this:

struct MustUse(T) {
pure: nothrow:

private:
T payload;
bool used;

public:
@property ref T use() @nogc {
used = true;
return payload;
}
alias use this;

this(T payload) @nogc {
this.payload = payload;
this.used = false;
}   
~this() {
if(!used)
throw new Error(T.stringof ~ " return value was not 
used.");

}

}

// For convenience, use this function to infer T from the type of 
paylaod.

MustUse!T mustUse(T)(T payload) {
return MustUse!T(payload); }

Example on DPaste: http://dpaste.dzfl.pl/8ba6ebf05f32

With inlining and optimizations, even the above generic 
implementation might be faster than passing by ref/out. A 
specialization for non-null pointer values could almost certainly 
be faster.


Disadvantages: On the other hand, it might be slower. The only 
way to know for sure, is to write some non-trivial examples and 
benchmark. Regardless, the fact that it signals the error at 
runtime instead of compile time could be annoying.


Re: Enforcing checks for return code

2016-02-18 Thread Jonathan M Davis via Digitalmars-d-learn
On Thursday, February 18, 2016 07:21:05 Chris Katko via Digitalmars-d-learn 
wrote:
> Hello. I'm almost brand-new to the D language and still absorbing
> things.
>
> I'm wondering if it's possible to fire off a compile-time (or
> worst case, a run-time) warning or error if a function is called,
> but the return value is not checked.
>
> I'm not trying to enforce whether someone actually deciphers the
> value's meaning correctly. I just want to enforce that somewhere,
> a variable or expression is receiving the return value of a
> particular function.
>
> Any ideas?
>
> I imagine I could use a compiler flag to warn, but that's a
> global setting. I'm looking more for a specified subset of
> functions.

D has no such feature, and very little D code is going to use return codes.
D has exceptions, and throwing an exception is the normal way to indicate
that there was a problem. You certainly _can_ choose to use error codes if
you'd like, but it's not normal practice, and the language does nothing
extra to support it.

- Jonathan M Davis



Enforcing checks for return code

2016-02-17 Thread Chris Katko via Digitalmars-d-learn
Hello. I'm almost brand-new to the D language and still absorbing 
things.


I'm wondering if it's possible to fire off a compile-time (or 
worst case, a run-time) warning or error if a function is called, 
but the return value is not checked.


I'm not trying to enforce whether someone actually deciphers the 
value's meaning correctly. I just want to enforce that somewhere, 
a variable or expression is receiving the return value of a 
particular function.


Any ideas?

I imagine I could use a compiler flag to warn, but that's a 
global setting. I'm looking more for a specified subset of 
functions.