Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:82262 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 13601 invoked from network); 9 Feb 2015 10:46:29 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 9 Feb 2015 10:46:29 -0000 Authentication-Results: pb1.pair.com smtp.mail=pthreads@pthreads.org; spf=permerror; sender-id=unknown Authentication-Results: pb1.pair.com header.from=pthreads@pthreads.org; sender-id=unknown Received-SPF: error (pb1.pair.com: domain pthreads.org from 209.85.220.42 cause and error) X-PHP-List-Original-Sender: pthreads@pthreads.org X-Host-Fingerprint: 209.85.220.42 mail-pa0-f42.google.com Received: from [209.85.220.42] ([209.85.220.42:41398] helo=mail-pa0-f42.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 3B/9C-50460-40098D45 for ; Mon, 09 Feb 2015 05:46:29 -0500 Received: by mail-pa0-f42.google.com with SMTP id bj1so33175317pad.1 for ; Mon, 09 Feb 2015 02:46:26 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=x5ka8rKH5KHgrJelk6hExlwqZmtL/HDYMzwM26uyAps=; b=AmYgljOrbRfYPltxcsbckhc4rtpCb1+qYXt/UY9bbMXNtti6ujcoO845nLUQ6kAH+N 360IbMo7GQETeaTRsNkyGvfJW2cUSyWwA9Ej7mq2botwSiB8Q0CuuQoaJUIv2qH2FrVq Pq2rsU8T/FM9hNQFSzQalnmss0IygV4jRRPK651xxQtj3SyxqSqC972VgzADkIA0NvJQ GKKb+qwZkUqCUMOpMHEagQ41EgGGQLwoNYwkWpVqq6w9InRvJ4DjQUMDv+Zpb88QgqMr xXuQjoEX2EBtZWFylt9Uxmtg5uSSuIY3DEJ41B9q0FPS0j14NsL/GRA6zxIAg4Xc+Rgx e8Cw== X-Gm-Message-State: ALoCoQmHtqzPq1MJUMSImWv7oXEqGsF7ws0WbKoT9UM2kJcyPOA5tQbfzeB/rOX0j8mFt0GazL5A MIME-Version: 1.0 X-Received: by 10.70.42.47 with SMTP id k15mr27957115pdl.134.1423478785905; Mon, 09 Feb 2015 02:46:25 -0800 (PST) Received: by 10.70.49.100 with HTTP; Mon, 9 Feb 2015 02:46:25 -0800 (PST) X-Originating-IP: [109.145.22.92] In-Reply-To: References: <54D7ED22.3080001@gmail.com> Date: Mon, 9 Feb 2015 10:46:25 +0000 Message-ID: To: Yasuo Ohgaki Cc: Dmitry Stogov , Stanislav Malyshev , PHP Internals Content-Type: multipart/alternative; boundary=047d7bfe9e40613407050ea57b65 Subject: Re: [PHP-DEV] Design by Contract From: pthreads@pthreads.org (Joe Watkins) --047d7bfe9e40613407050ea57b65 Content-Type: text/plain; charset=UTF-8 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 wrote: > Hi Dmitry and Joe, > > On Mon, Feb 9, 2015 at 6:01 PM, Dmitry Stogov 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 > yohgaki@ohgaki.net > --047d7bfe9e40613407050ea57b65--