DIP 1009--Improve Contract Usability--Preliminary Review Round 1
via Digitalmars-d
digitalmars-d at puremagic.com
Thu Jun 29 01:22:50 PDT 2017
On Thursday, 29 June 2017 at 01:37:17 UTC, H. S. Teoh wrote:
> On Thu, Jun 29, 2017 at 01:22:31AM +0000, Mark via
> Digitalmars-d wrote: [...]
>> 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...
>
> One idea I have is that the compiler could recognize certain
> straightforward contracts (like int < value) and use VRP (value
> range propagation) to detect cases where it's clear that the
> contract would be violated.
>
> However, this can only be done in a very rudimentary fashion,
> because:
>
> (1) DbC contracts pertain to *runtime* argument values, so while
> checking for simple cases at compile-time is nice, it isn't
> really in
> the charter of (D's implementation of) DbC.
>
> (2) VRP in the compiler currently only works within a very
> limited
> scope, IIRC within a single expression. So while it may detect
> the
> `foo(bar())` case, it probably won't detect the `x=bar();
> foo(x);` case.
> Ostensibly the scope of VRP ought to be expanded, however:
>
> (3) In the past Walter has shown some reluctance in adding
> features that hurt compilation time; if a more sophisticated
> implementation of VRP is required and it's deemed too expensive
> in terms of compilation time, Walter may veto it.
>
> (4) Arbitrarily complex boolean conditions are undecidable in
> general, so unless you have a way to solve the halting problem,
> a general solution is intractible. Of course, the kind of
> conditions you find in contracts generally ought to be nowhere
> near the halting problem in complexity, but it's not clear how
> far one can go without running the risk of (3). My guess is
> that something based on VRP is the most likely to materialize
> in the foreseeable future.
>
>
> T
https://github.com/dlang/dmd/pull/3799
More information about the Digitalmars-d
mailing list