[ 
https://issues.apache.org/jira/browse/GROOVY-11525?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17903854#comment-17903854
 ] 

Daniel Sun commented on GROOVY-11525:
-------------------------------------

[~blackdrag] Supporting multiple expressions would be better ;-)

{code}
def <T> swapHeadAndTail(List<T> list) {
  return {T h = list[0]; List<T> t=list[1..-1]; [*t, h]}()
}
{code}
The closure is inefficient but it could be nice reference implementation as 
switch-expression does.

[~emilles]
Pattern match could be based on the expression scope variable.

{code}
def foo(bar) {
  return bar instanceof Number baz ? baz : bar.hashCode() // not the best 
example; "bar" could be an arbitrary expression
}

// could be transformed to

def foo(bar) {
  // `(baz = (Number) bar)` is redundant for condition and just for assignment
  return (Number baz; bar instanceof Number && (baz = (Number) bar) ? baz : 
bar.hashCode())
}
{code}



> Support expression scope variable
> ---------------------------------
>
>                 Key: GROOVY-11525
>                 URL: https://issues.apache.org/jira/browse/GROOVY-11525
>             Project: Groovy
>          Issue Type: New Feature
>            Reporter: Daniel Sun
>            Priority: Major
>
> Let's take a look at the following code first:
> {code}
> int hash(Object key) {
>    int h;
>    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
> }
> {code}
> variable {{h}} is actually an expression scope variable, but current syntax 
> doesn't support.
> I propose an expression scope variable syntax, e.g. 
> Proposed syntax 1:
> {code}
> // Just support declaring variables of same type
> (int h, x, y; ...)
> {code}
> {code}
> int hash(Object key) {
>    // h is only visible in the expression
>    return (int h; (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16))
> }
> {code}
> We can reduce the scope of {{h}} further:
> {code}
> int hash(Object key) {
>    // h is only visible in the expression
>    return (key == null) ? 0 : (int h; (h = key.hashCode()) ^ (h >>> 16))
> }
> {code}
> Proposed syntax 2(I prefer the syntax):
> {code}
> // Support declaring variables of different types
> (int h, X x, Y y -> ...)
> {code}
> {code}
> int hash(Object key) {
>    // h is only visible in the expression
>    return (int h -> (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16))
> }
> {code}
> {code}
> int hash(Object key) {
>    // h is only visible in the expression
>    return (key == null) ? 0 : (int h -> (h = key.hashCode()) ^ (h >>> 16))
> }
> {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to