Another idiom I wish were gone from phobos/druntime

via Digitalmars-d digitalmars-d at puremagic.com
Thu Feb 5 02:00:57 PST 2015


On Thursday, 5 February 2015 at 09:43:53 UTC, Jonathan M Davis 
wrote:
> There is no such difference in the current implementation. 
> assertions inside
> of in and out blocks are no different from assertions inside of 
> the
> functions themselves with regards to when they are compiled in 
> or not.

But that is a compiler issue, and not a general issue with 
interface contracts for components.

What is desirable is to have "asserts with semantics attached to 
them" done in a way that works with how you do formal program 
verification. I also would like to see loop invariants getting a 
special treatment.

> pass. Regardless,
> if you have
>
> auto foo(T t)
> in
> {
>     assert(something about t);
> }
> body
> {
>     ...
> }
>
> it's _identical_ to
>
> auto foo(T t)
> {
>     assert(something about t);
>     ...
> }

Yes and just having an alias "precondition" for "assert" would go 
a long way in that case. And if the compiler recognize it, it 
could also do the magic for inheritance.


> with regards to semantics. Ideally, what's in the in block 
> would be compiled
> in if the caller is compiled with assertions enabled with no 
> regard to
> whether the library with foo in it was compiled with assertions 
> enabled or
> not, but that's not how it works. And because D allows for 
> function
> prototypes where the implementation is hidden, it's not at all 
> obvious how
> it would even be possible for anything in an in our out block 
> could be
> compiled in or not based on the caller rather than the function 
> itself.

I actually think that interface contracts (and ideally unit 
tests) should be part of a specification language that is shared 
across implementation languages. Then the implementation language 
has to provide mechanisms to make it possible to test that the 
transitions between components abide interface contracts.

The ideal build system would allow you to have one specification 
with pre/post conditions between modules and then let the build 
system link together "LLVM IRish object code" with checks between 
modules injected duing whole program optimized "linking".

That way you could build large systems that are more robust using 
code from C, C++, Ada, Fortran, Rust, D... governed by one 
unified specification. And a combination of proof verification 
and an optimizing linker could elide pre/post-condition tests 
that are redundant, either before a formal proof exists that only 
needs to be verified or because the condition is trivially 
satisifie, e.g.:

----

func(int i){
   precondition(i>0);
   ...
}

----
func(3);
-----




More information about the Digitalmars-d mailing list