anchor.diff:  
   This module replaces the previously external `gcontracts` project which is now archived.
   
  +=== GINQ, a.k.a. Groovy-Integrated Query (incubating)
  +
  +GINQ supports querying collections in a SQL-like style.
  +
  +[source, sql]
  +--------------------------------------
  +from p in persons
  +leftjoin c in cities on p.city.name == c.name
  +where c.name == 'Shanghai'
  +select p.name, c.name as cityName
  +
  +from p in persons
  +groupby p.gender
  +having p.gender == 'Male'
  +select p.gender, max(p.age)
  +
  +from p in persons
  +orderby p.age in desc, p.name
  +select p.name
  +
  +from n in numbers
  +where n > 0 && n <= 3
  +select n * 2
  +
  +from n1 in nums1
  +innerjoin n2 in nums2 on n1 == n2
  +select n1 + 1, n2
  +--------------------------------------
  +
  +More examples could be found at
  +link:https://github.com/apache/groovy/blob/master/subprojects/groovy-ginq/src/spec/test/org/apache/groovy/ginq/GinqTest.groovy[GINQ examples]
  +
  +=== TOML Support (incubating)
  +
  +Support is now available for handling link:https://toml.io/en/[TOML]-based files including building:
  +
  +[source,groovy]
  +--------------------------------------
  +def builder = new TomlBuilder()
  +builder.records {
  +    car {
  +        name 'HSV Maloo'
  +        make 'Holden'
  +        year 2006
  +        country 'Australia'
  +        homepage new URL('http://example.org')
  +        record {
  +            type 'speed'
  +            description 'production pickup truck with speed of 271kph'
  +        }
  +    }
  +}
  +--------------------------------------
  +
  +and parsing:
  +
  +[source,groovy]
  +--------------------------------------
  +def ts = new TomlSlurper()
  +def toml = ts.parseText(builder.toString())
  +
  +assert 'HSV Maloo' == toml.records.car.name
  +assert 'Holden' == toml.records.car.make
  +assert 2006 == toml.records.car.year
  +assert 'Australia' == toml.records.car.country
  +assert 'http://example.org' == toml.records.car.homepage
  +assert 'speed' == toml.records.car.record.type
  +assert 'production pickup truck with speed of 271kph' == toml.records.car.record.description
  +--------------------------------------
  +
   [[Groovy4.0-other]]
   == Other improvements
   
  
positive.code: }
  --------------------------------------
  
  ==== Java-inspired changes (under investigation)
  
  The following are being explored as candidate changes for Groovy 4:
  
  * Switch expressions
  link:https://openjdk.java.net/jeps/354[JEP 354: Switch Expressions (Second Preview)]
  link:https://openjdk.java.net/jeps/361[JEP 361: Switch Expressions]
  
  * Module definitions written in Groovy (i.e. module-info.groovy)
  link:https://issues.apache.org/jira/browse/GROOVY-9273[GROOVY-9273]
  
negative.code: |===
  a| NOTE: _WARNING:_
  Material on this page is still under development! +
  We are currently releasing beta versions of Groovy 4.0 with a goal
  of gathering feedback on the language changes from our community.
  In addition, early versions assist other projects and tool vendors within the
  Groovy ecosystem to begin assessing the impact of moving to/supporting Groovy 4.0.
  Caution should be exercised if using new features as the details may change before final release. +
  Some features described here as "incubating" may become stable before 4.0.0 final is released,
  others are expected to remain incubating for version 4.
  We don't recommend using beta versions or incubating features for production systems.
  |===
  
  
  