Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id C78CC200C08 for ; Thu, 26 Jan 2017 11:24:44 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id C6083160B4C; Thu, 26 Jan 2017 10:24:44 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 70207160B40 for ; Thu, 26 Jan 2017 11:24:43 +0100 (CET) Received: (qmail 12498 invoked by uid 500); 26 Jan 2017 10:24:42 -0000 Mailing-List: contact dev-help@groovy.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@groovy.apache.org Delivered-To: mailing list dev@groovy.apache.org Received: (qmail 12488 invoked by uid 99); 26 Jan 2017 10:24:42 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 26 Jan 2017 10:24:42 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id CF6C5C17E0 for ; Thu, 26 Jan 2017 10:24:41 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 3.794 X-Spam-Level: *** X-Spam-Status: No, score=3.794 tagged_above=-999 required=6.31 tests=[DKIM_SIGNED=0.1, DKIM_VALID=-0.1, HTML_MESSAGE=2, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_SORBS_SPAM=0.5, URIBL_BLOCKED=0.001, URI_HEX=1.313] autolearn=disabled Authentication-Results: spamd1-us-west.apache.org (amavisd-new); dkim=pass (2048-bit key) header.d=simplicityitself-com.20150623.gappssmtp.com Received: from mx1-lw-us.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id XRhbGDJYmW_l for ; Thu, 26 Jan 2017 10:24:36 +0000 (UTC) Received: from mail-ot0-f178.google.com (mail-ot0-f178.google.com [74.125.82.178]) by mx1-lw-us.apache.org (ASF Mail Server at mx1-lw-us.apache.org) with ESMTPS id BFC4C5F5C7 for ; Thu, 26 Jan 2017 10:24:35 +0000 (UTC) Received: by mail-ot0-f178.google.com with SMTP id 73so172031179otj.0 for ; Thu, 26 Jan 2017 02:24:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=simplicityitself-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to; bh=U55AIzDD2aQ0wNe3wB8h7nt06bWBrnr+ri3ivKWPeqU=; b=Yi5Rzz8R5W5IG5+magD3FLEyuS6H/ad5pbFwJ3wERMR4+bQlG7xOwFTRqTJcS62cB9 /yXfHJT2SaBToL+ePN4EH1kItuxHqkwuEnqjQznLGBRT0BGRhnf9vyB/d318E6eHK05s G398dVQVD1pgH08wzN/HTP7+GVK/6aygDbldkLfy59IYWK7AUYWQHFKyz7P/wG3sRlVn ntGLboKZzAMLTYQ3oMRu1sMS+t33GzxVg3/qiU9DkuBv5SCnbCa65krgrJkSBzqWPlwx K1UvLeXT+TL+em8AF+fyDHpoM26RTXo8T1xgQRiDHF1erSOPYPbglVLWUJlASLvj05RB yslA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to; bh=U55AIzDD2aQ0wNe3wB8h7nt06bWBrnr+ri3ivKWPeqU=; b=F4AGk4VPm8cT8n+wZCz3Ce7DRqCmHJOU8+YFWAMzQdyeDIQfV5A5ZRh09+DKtCbMvM NP2DWp/Retqkd6w4KZO+6ZJEYJIwRYu6o6LYljVtYZnyDFTd6oFUO2ypwgz0bafV6dXa ErUzDYa4HxTfivswAcp+Yo8xdbUx/mGuJBjoGPZ7tZatKaUcjt//M5830TU0BsxF3jAJ mn+V3wU9tEAKZP+aluXgW9bgQsAkJrB5RM+ogyY88rWlCr6Z5VJjHUGgzbzpfg4lCvx3 a82JPbjdoq8OWiKdt+Ch79KzpsyHQsWa3gHwKPc43VLgqEQ4aTM5ov9WSaHz/xPbRRA0 Ma9g== X-Gm-Message-State: AIkVDXI/IN9GYLU6WkvRlMQATLBNwNGn9zuqLJRgklEq/WE6qiIaR21vMXKopzQ80+Kgy09LPyANMuF8st1mKg== X-Received: by 10.157.60.238 with SMTP id t43mr1116009otf.178.1485426274603; Thu, 26 Jan 2017 02:24:34 -0800 (PST) MIME-Version: 1.0 Received: by 10.157.26.10 with HTTP; Thu, 26 Jan 2017 02:24:04 -0800 (PST) In-Reply-To: References: <1485363042746-5738035.post@n5.nabble.com> <5888FA6E.30204@gmx.org> <1426822655.1501632.1485425144062.JavaMail.zimbra@u-pem.fr> From: David Dawson Date: Thu, 26 Jan 2017 10:24:04 +0000 Message-ID: Subject: =?UTF-8?B?UmU6IOetlOWkjTogQWJvdXQgdGhlICJpbXBsaWVzIiBvcGVyYXRvcihHUk9PVlktMjU3Ng==?= =?UTF-8?B?KQ==?= To: dev@groovy.apache.org Content-Type: multipart/alternative; boundary=94eb2c1900367029f30546fcc1b6 archived-at: Thu, 26 Jan 2017 10:24:45 -0000 --94eb2c1900367029f30546fcc1b6 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable For me, what is lovely about Groovy is not how much is has "in the box", it's the flexibility and extensibility of the language. I don't think I would use this operator, its confusing for me (even the unpacked version I would probably rewrite), and so would be confusing for junior devs, which I see as dangerous. Having the option of changing some base syntax though would be a huge boon for dsl writers, one of the big niches that Groovy dominates in the jvm world. I would certainly appreciate and use that. Groovy 3 couldn't come fast enough for me if it had that in. David. On 26 January 2017 at 10:13, Andres Almiray wrote: > Here's another idea: > > What if this new operator and other syntax changes were to be introduced > as parser/compiler plugins? > > This way the core syntax stays the same yet it may open the possibility > for certain groups to enhance the Groovy syntax according to their needs > without affecting everyone else. > > Don't how how feasible this is given that it requires changes to both > parser and compiler APIs. > > Cheers, > Andres > > ------------------------------------------- > Java Champion; Groovy Enthusiast > http://jroller.com/aalmiray > http://www.linkedin.com/in/aalmiray > -- > What goes up, must come down. Ask any system administrator. > There are 10 types of people in the world: Those who understand binary, > and those who don't. > To understand recursion, we must first understand recursion. > > On Thu, Jan 26, 2017 at 11:05 AM, Remi Forax wrote: > >> The other problem i see is that the fat arrow =3D> is used by several >> mainstream languages ; C#, Scala, JavaScript at least ; for declaring a >> lambda. >> This will confuse people in my opinion. >> >> Moreover as Jochen said , implies is a lazy operator, like && and ||, so >> the operator should be more =3D>=3D> than =3D> (i.e !a || b vs !a | b). >> Also if there is a method 'implies' as there is a method 'plus', implies >> should take a closure and not the result of an expression. >> At that point, the question is whenever or not to also implement && and >> || as method and has a general 'lift' syntax when declaring a method, it >> will make simple macro far easier to write at the expense of more magic. >> >> R=C3=A9mi >> >> ------------------------------ >> >> *De: *"Guillaume Laforge" >> *=C3=80: *dev@groovy.apache.org >> *Cc: *"Groovy_Developers" >> *Envoy=C3=A9: *Jeudi 26 Janvier 2017 10:33:21 >> *Objet: *Re: =E7=AD=94=E5=A4=8D: About the "implies" operator(GROOVY-257= 6) >> >> I'm not super convinced either, and I'm wondering when I'd really use >> such an operator. >> I'm kinda +0 as C=C3=A9dric here. >> >> Not that we should copy or not other languages, but are there others tha= t >> have such an operator, and if this is the case, do we know how (much) it= 's >> used? >> >> On Thu, Jan 26, 2017 at 10:22 AM, C=C3=A9dric Champeau < >> cedric.champeau@gmail.com> wrote: >> >>> I know it's well known in mathematical logic, but I don't want Groovy t= o >>> become Scalaz either. The route is dangerous. >>> >>> 2017-01-26 10:18 GMT+01:00 Daniel Sun : >>> >>>> Hi C=C3=A9dric, >>>> >>>> >>>> >>>> Here is the background of the =E2=80=9Cimplies=E2=80=9D operator,= which is well >>>> known in the mathematical logic =F0=9F=98=89 >>>> >>>> http://mathworld.wolfram.com/Implies.html >>>> >>>> >>>> >>>> >>>> >>>> *=E5=8F=91=E4=BB=B6=E4=BA=BA: *[hidden email] >>>> >>>> *=E5=8F=91=E9=80=81=E6=97=B6=E9=97=B4: *2017=E5=B9=B41=E6=9C=8826=E6= =97=A5 17:12 >>>> *=E6=94=B6=E4=BB=B6=E4=BA=BA: *[hidden email] >>>> >>>> *=E4=B8=BB=E9=A2=98: *Re: About the "implies" operator(GROOVY-2576) >>>> >>>> >>>> I'm not convinced we should add more operators. Honestly, I had to rea= d >>>> the description of the "implies" operator to understand what it does. = This >>>> is clearly not the case for || or &&, which are "well known" operators= . >>>> >>>> I am also worried about code becoming ascii art: >>>> >>>> { a -> a =3D> a <=3D c =3D> d } >>>> >>>> So I'm just +0, I don't see that I would use it often enough to >>>> mitigate the drawbacks. >>>> >>>> 2017-01-26 1:47 GMT+01:00 Daniel Sun <[hidden email] >>>> >: >>>> Hi Jochen, >>>> >>>> Thanks for your analysis in detail :) >>>> >>>> =3D> is a very expressive operator. if we could implement it as >>>> +(corresponding to plus method) does and apply different business logi= c >>>> when necessary, it would be much more useful. And the default >>>> implementation of "implies" method can be "!a||b". >>>> >>>> As to the association of the operator, I prefer the left >>>> association, i.e. a =3D> b =3D> c is equivalent to (a =3D> b) =3D> c. >>>> >>>> The above is the initial plan to implement the "implies" >>>> operator. >>>> >>>> Cheers, >>>> Daniel.Sun >>>> >>>> >>>> =E5=9C=A8 2017=E5=B9=B41=E6=9C=8826=E6=97=A5 =E4=B8=8A=E5=8D=883:20=EF= =BC=8C"Jochen Theodorou [via Groovy]" >>>> >>> On 25.01.2017 17:50, Daniel Sun wrote: >>>> >>>> > Hi all, >>>> > >>>> > The "implies" operator "=3D>" was suggested many years ago, h= ere >>>> is the >>>> > replated JIRA issue( GROOVY-2576 >>>> > ) . >>>> > >>>> > Do you want it for Groovy 3? (+1: yes; -1: no; 0: not bad) >>>> > >>>> > BTW, recently I have been going through the issues related to >>>> the old >>>> > parser, many issues existing for many years do not exist in the new >>>> parser >>>> > Parrot :) >>>> >>>> If we do this (and I say +1) we should clear some things: >>>> 1) what does a=3D>b=3D>c mean, since (a=3D>b)=3D>c is not the same as = a=3D>(b=3D>c) >>>> 2) use groovy truth and when to apply it? If we map a=3D>b to !a||b, t= hen >>>> it will use Groovy truth on a and b, but if we map to an implies metho= d >>>> it will get a and b, use groovy truth on them or not and we then maybe >>>> use groovy truth on the result. I personally would be for not using >>>> groovy truth here, thus make it more in line with | and &. >>>> 3) if a=3D>b is mapped to !a||b we will evaluate a, negate it, and >>>> depending on the result maybe never evaluate b. As long as a and b are >>>> free of side effects, that does not play an extremely important role, >>>> but if we map it to a method a and b will be evaluated always. If we >>>> would say it is more like !a|b, which would also require both being >>>> evaluated, then there is still the fact that !a ensures we call here >>>> always the boolean or function, never one defined by an arbitrary a >>>> 4) instead of using !a, which converts a to a boolean and negates it, >>>> we >>>> can also use ~a, which is a binary negate also working on booleans, bu= t >>>> not converting a to a boolean if it is no boolean. Here we have to >>>> especially think about ~a|b calling "or" on a Pattern if a is a String= . >>>> Also not many things besides boolean and numbers really support >>>> something useful of the binary negate. >>>> >>>> I mention those points so we can make a proper specification for the >>>> behaviour of this operator ;) >>>> >>>> bye Jochen >>>> >>>> >>>> ------------------------------ >>>> If you reply to this email, your message will be added to the >>>> discussion below: >>>> http://groovy.329449.n5.nabble.com/About-the-implies-operato >>>> r-GROOVY-2576-tp5738035p5738042.html >>>> To unsubscribe from About the "implies" operator(GROOVY-2576), click >>>> here. >>>> NAML >>>> >>>> >>>> ------------------------------ >>>> View this message in context: Re: About the "implies" >>>> operator(GROOVY-2576) >>>> >>>> >>>> Sent from the Groovy Dev mailing list archive >>>> at >>>> Nabble.com. >>>> >>>> >>>> >>>> ------------------------------ >>>> If you reply to this email, your message will be added to the >>>> discussion below: >>>> http://groovy.329449.n5.nabble.com/About-the-implies-operato >>>> r-GROOVY-2576-tp5738035p5738104.html >>>> To unsubscribe from About the "implies" operator(GROOVY-2576), click >>>> here. >>>> NAML >>>> >>>> >>>> ------------------------------ >>>> View this message in context: =E7=AD=94=E5=A4=8D: About the "implies" >>>> operator(GROOVY-2576) >>>> >>>> >>>> Sent from the Groovy Dev mailing list archive >>>> at >>>> Nabble.com. >>>> >>> >>> >> >> >> -- >> Guillaume Laforge >> Apache Groovy committer & PMC Vice-President >> Developer Advocate @ Google Cloud Platform >> >> Blog: http://glaforge.appspot.com/ >> Social: @glaforge / Google+ >> >> >> > --=20 David Dawson | CEO | Simplicity Itself Tel +44 7866 011 256 Skype: davidadawson david.dawson@simplicityitself.com http://www.simplicityitself.com --94eb2c1900367029f30546fcc1b6 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
For me, what is lovely about Groovy is not how much is has= "in the box", it's the flexibility and extensibility of the = language.

I don't think I would use this operator, i= ts confusing for me (even the unpacked version I would probably rewrite), a= nd so would be confusing for junior devs, which I see as dangerous.

Having the option of changing some base syntax though wou= ld be a huge boon for dsl writers, one of the big niches that Groovy domina= tes in the jvm world.

I would certainly appreciate= and use that.=C2=A0 Groovy 3 couldn't come fast enough for me if it ha= d that in.

David.


On 26 January 2017 at 1= 0:13, Andres Almiray <aalmiray@gmail.com> wrote:
Here'= s another idea:

What if this new operator and other syntax cha= nges were to be introduced as parser/compiler plugins?

This wa= y the core syntax stays the same yet it may open the possibility for certai= n groups to enhance the Groovy syntax according to their needs without affe= cting everyone else.

Don't how how feasible this is given = that it requires changes to both parser and compiler APIs.

Che= ers,
Andres
<= br clear=3D"all">
-----------------------------------= --------
Java Champion; Groovy Enthusiast
http://jroller.com/aalmiray
http://www.linke= din.com/in/aalmiray
--
What goes up, must come down. Ask any= system administrator.
There are 10 types of people in the world: Those = who understand binary, and those who don't.
To understand recursion,= we must first understand recursion.

On Thu, Jan 26= , 2017 at 11:05 AM, Remi Forax <forax@univ-mlv.fr> wrote:
The other problem i see i= s that the fat arrow =3D> is used by several mainstream languages ; C#, = Scala, JavaScript at least ; for declaring a lambda.
This wil= l confuse people in my opinion.

Moreover as Jo= chen said , implies is a lazy operator, like && and ||, so the oper= ator should be more =3D>=3D> than =3D> (i.e !a || b vs !a | b).
Also if there is a method 'implies' as there is a metho= d 'plus', implies should take a closure and not the result of an ex= pression.
At that point, the question is whenever or not to = also implement && and || as method and has a general 'lift'= syntax when declaring a method, it will make simple macro far easier to wr= ite at the expense of more magic.

R=C3=A9mi


De= : "Guillaume Laforge" <glaforge@gmail.com>
=C3=80: dev@groovy.apache.org
Cc: "Groovy_Developers" <
dev@groovy.incubator.apache.o<= wbr>rg>
Envoy=C3=A9: Jeudi 26 Janvier 2017 10:33:21
= Objet: Re: =E7=AD=94=E5=A4=8D: About the "implies" operator(G= ROOVY-2576)
I'm not super convinced either, and I'm wondering when I&#= 39;d really use such an operator.
I'm kinda +0 as C=C3=A9dric here.=

Not that we should copy or not other languages, but are ther= e others that have such an operator, and if this is the case, do we know ho= w (much) it's used?

On Thu, Jan 26, 2017 at 10:22 AM, C=C3=A9dric Champeau <cedric.champeau@gmail.com> wrote:
I know it's well known in mathematical = logic, but I don't want Groovy to become Scalaz either. The route is da= ngerous.

2017-01-26 10:18 GMT+01:00 = Daniel Sun <realbluesun@hotmail.com>:

Hi C=C3=A9dric,

=C2=A0

=C2=A0=C2=A0=C2=A0=C2=A0 Here i= s the background of the =E2=80=9Cimplies=E2=80=9D operator, which is well known in the mathemat= ical logic =F0=9F=98=89

http://mathworld.= wolfram.com/Implies.html

=C2=A0

=C2=A0

=E5=8F=91=E4=BB= =B6=E4=BA=BA: [hidden em= ail]
=E5=8F=91=E9=80=81=E6=97=B6=E9=97=B4: 2017=E5=B9=B41= =E6=9C=8826=E6=97=A5 17:12=
=E6=94=B6=E4=BB=B6=E4=BA=BA: [hidden email]=
=E4=B8=BB=E9=A2=98: Re: About the "implies" operator(GROOVY-2576)

=C2=A0

I'm not convinced we should add more operators. Honest= ly, I had to read the description of the "implies" operator to un= derstand what it does. This is clearly not the case for || or &&, w= hich are "well known" operators.

I am also worried about code becoming ascii art:

{ a -> a =3D> a <=3D c =3D> d }

So I'm just +0, I don't see that I would use it often enough t= o mitigate the drawbacks.

2017-01-26 1:47 GMT+01:00 Daniel Sun <[hidden email]>= :
Hi Jochen,

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Thanks for your analysis in= detail :)

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =3D> is a very exp= ressive operator. if we could implement it as +(corresponding to plus metho= d) does and apply different business logic when necessary, it would be much= more useful. And the default implementation of "implies" method = can be "!a||b".

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 As to the assoc= iation of the operator, I prefer the left association, i.e. a =3D> b =3D= > c is equivalent to (a =3D> b) =3D> c.

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 The above is the init= ial plan to implement the=C2=A0 "implies" operator.

Cheers,
Daniel.Sun


=E5=9C=A8 2017= =E5=B9=B41=E6=9C=8826=E6=97=A5 =E4=B8=8A=E5=8D=883:20=EF=BC=8C"Jochen = Theodorou [via Groovy]" <ml-node+s329449n5738042h6
On 25.01.2017 17:50, Daniel Sun wrote:

> Hi all,
>
> =C2=A0 =C2=A0 =C2=A0 =C2=A0The "implies" operator "=3D&= gt;" was suggested many years ago, here is the
> replated JIRA issue( GROOVY-2576
> <https://issues.apache.org/jira/browse/= GROOVY-2576> =C2=A0) .
>
> =C2=A0 =C2=A0 =C2=A0 =C2=A0Do you want it for Groovy 3? (+1: yes; -1: = no; 0: not bad)
>
> =C2=A0 =C2=A0 =C2=A0 =C2=A0BTW, recently I have been going through the= issues related to the old
> parser, many issues existing for many years do not exist in the new pa= rser
> Parrot :)

If we do this (and I say +1) we should clear some things:
1) what does a=3D>b=3D>c mean, since (a=3D>b)=3D>c is not the s= ame as a=3D>(b=3D>c)
2) use groovy truth and when to apply it? If we map a=3D>b to !a||b, the= n
it will use Groovy truth on a and b, but if we map to an implies method it will get a and b, use groovy truth on them or not and we then maybe
use groovy truth on the result. I personally would be for not using
groovy truth here, thus make it more in line with | and &.
3) if a=3D>b is mapped to !a||b we will evaluate a, negate it, and
depending on the result maybe never evaluate b. As long as a and b are
free of side effects, that does not play an extremely important role,
but if we map it to a method a and b will be evaluated always. If we
would say it is more like !a|b, which would also require both being
evaluated, then there is still the fact that !a ensures we call here
always the boolean or function, never one defined by an arbitrary a
4) instead of using !a, which converts a to a boolean and negates it, we can also use ~a, which is a binary negate also working on booleans, but not converting a to a boolean if it is no boolean. Here we have to
especially think about ~a|b calling "or" on a Pattern if a is a S= tring.
Also not many things besides boolean and numbers really support
something useful of the binary negate.

I mention those points so we can make a proper specification for the
behaviour of this operator ;)

bye Jochen



If you reply to this email, your message wi= ll be added to the discussion below:
http:/= /groovy.329449.n5.nabble.com/About-the-implies-operator-GROOVY-25= 76-tp5738035p5738042.html
To unsubscribe from About the "implies" operator(GROOVY-2576), click here.
NAML


View this message in context: Re: About the "implies" operator(GROOVY-2576)

Sent from the Groovy Dev mailing list archive at Nabble.com.




If you reply to this email, your message wi= ll be added to the discussion below:
http://groovy.329449.n5.nabble.com/About-the-implies-operator-GROOVY-2576-tp5738035p5738104.html
To unsubscribe from About the "implies" operator(GROOVY-2576), click here.
NAML
=09 =09 =09

View this message in context: =E7=AD=94=E5=A4=8D: About the "implies" operator(GROOVY-25= 76)

Sent from the Groovy Dev mailing list archive at Nabble.c= om.




--
Guillaume Laforge
Apache Groovy committer= & PMC Vice-President
Developer Advocate @ Google= Cloud Platform

Blog:=C2=A0http://glaforge.appspot.com/
Socia= l: @glaforge= =C2=A0/ Google+




--


David Dawson |=C2=A0C= EO |=C2=A0Simplicity Itself

Tel += 44 7866 011 256
Skype: davidadawson
david.dawson@simplicityitself.com=
http://www.simplicityitself.com
--94eb2c1900367029f30546fcc1b6--