Morning Yasuo,

    Can you explain what invariant is for ?

    I prefer a list of contracts with a single expression, over blocks of
expressions in one contract.
    An IDE can just as easy generate a block of code or set of contracts,
so it's really just a matter of how complex it makes the implementation if
you allow any block of code in the contract. I think it does make it
unnecessarily complicated to implement, I can be wrong.

   If there is going to be two rfc's, I will vote no on the annotations
based one, I'd rather no time was wasted on even writing it; Before you
convince anyone that DBC is a good idea you have to convince them
annotations is a good idea, many have tried and failed.

Cheers
Joe

On Mon, Feb 9, 2015 at 10:34 AM, Yasuo Ohgaki <yohg...@ohgaki.net> wrote:

> Hi Dmitry and Joe,
>
> On Mon, Feb 9, 2015 at 6:01 PM, Dmitry Stogov <dmi...@zend.com> wrote:
>
>> Usage of "return" is a good idea.
>> The more heads the better result :)
>>
>
> Less additional reserved word :)
> So I'll use "require" and "return" for D like RFC.
> We haven't talk much about invariants. I'll write my idea.
>
> Current RFC is large enough already, I'll prepare new one.
> We may decide what to do with 2 RFCs.
>
> We have choices for with block or without block. I prefer with block
> version, since
> assert expression could be messy. With block, IDE may do it's jobs. i.e.
> Hide blocks.
>
> ==============================================
> Function/Method
>
> [With block]
> function foo()
> require {
>   assert(assert-expr, 'msg');
>   assert(assert-expr, 'msg');
>   assert(assert-expr, 'msg');
> }
> return {
>   assert(assert-expr, 'msg');
>   assert(assert-expr, 'msg');
>   assert(assert-expr, 'msg');
> }
> invariant {
>   assert(assert-expr, 'msg');
>   assert(assert-expr, 'msg');
>   assert(assert-expr, 'msg');
> }
> {
>    // body
> }
>
> _OR_
>
> [Without block]
> function foo() {
>   require(assert-expr, 'msg');
>   require(assert-expr, 'msg');
>   require(assert-expr, 'msg');
>   invariant(assert-expr, 'msg');
>   invariant(assert-expr, 'msg');
>   invariant(assert-expr, 'msg');
>   return(assert-expr, 'msg');
>   return(assert-expr, 'msg');
>   return(assert-expr, 'msg');
>
>   // function body
> }
>
>
> Currently, following code wouldn't work (PHP 7.0.0-dev)
> ----------
> assert(function() {return FALSE;}, 'AAAAA');
> ----------
>
> For block version, which do you prefer, allow any PHP syntax or assert
> only?
> People may use anonymous function  to do fancy jobs anyway if it's
> supported.
>
> No block version only accepts EXPR obviously, but anonymous function may
> be used with this as well.
>
>
> ==============================================
> Class invariants
>
> [With block]
> class Foo {
>   __invariants() {
>   assert(assert-expr, 'msg');
>   assert(assert-expr, 'msg');
>   assert(assert-expr, 'msg');
>   }
> }
>
> _OR_
>
> [Without block]
> class Foo {
>   __construct() {
>     invariant(assert-expr, 'msg'); // Only allow in __construct()?
> Allowing invariant.
>     invariant(assert-expr, 'msg');
>     invariant(assert-expr, 'msg');
>   }
> }
>
>
> ==============================================
> Global invariant
>
> I'm not sure if we should have
>
> function __invariants() {
>   assert(assert-expr, 'msg');
>   assert(assert-expr, 'msg');
>   assert(assert-expr, 'msg');
> }
>
> _OR_
>
> invariant {
>   assert(assert-expr, 'msg');
>   assert(assert-expr, 'msg');
>   assert(assert-expr, 'msg');
> }
>
> to assert global vars, whole app state, etc. It may be useful for unit
> tests as well as app development.
>
>
> I'll start working after I get comment from you.
>
> Regards,
>
> --
> Yasuo Ohgaki
> yohg...@ohgaki.net
>

Reply via email to