On Tuesday, 27 June 2017 at 23:17:15 UTC, Moritz Maxeiner wrote:
Considering that code is read a lot more than written those two are *critically* important. What more do you expect? It could eventually be optimized to inject the in contract check at the caller's side (before entering the function), but the point of contracts is that they *aren't* violated. If they are, well, your program[1] is broken and needs to die.

[1] abstract: computational task; implementation barring safe thread/fiber killing: process

Sure, but it would be even better if it hadn't compiled in the first place. For instance, the "pure" attribute is a sort of contract, and if a function designated "pure" modifies global state then my code *does not compile*. Furthermore, if a pure function foo() contains a call to a function bar() not designated "pure", then it doesn't compile either, even though bar() may in fact be pure. So the compiler's behavior is "I can't guarentee that this function is pure, therefore I refuse to compile". In other words, I get useful error-checking from the compiler at the cost of having to "help" him a bit from time to time (like designating bar() as pure in this example).

The above behavior is unreasonable for validating a completely general contract - the compiler won't be able to guarentee much without excessive effort on the part of the programmer, supplying it with informative preconditions and postconditions. Nevertheless, as attributes like pure, const, safe and nogc demonstrate, the compiler can be of great help in writing correct code. Detecting violations of these function attributes in run-time is trivial but far less useful.

So basically, I'd like the ability to implement fairly simple contracts (with a similar level of sophistication to the above examples) that the compiler can check for me. I don't know, maybe this is easier to implement using UDAs...

Reply via email to