[ 
https://issues.apache.org/jira/browse/GROOVY-11914?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Paul King updated GROOVY-11914:
-------------------------------
    Description: 
I asked AI what features could be added to Groovy to give it vastly improved 
reasoning capabilities of Groovy code. First up it suggested @Modifies 
(GROOVY-11909) and the ModifiesChecker (GROOVY-11910). It said a close second 
would be a PurityChecker type checking extension. This issue looks at that.

The key thing to note here is that this is an opt-in extension.
If you use it, along with the existing @Pure annotation, it allows humans and 
AI to make assumptions about class or method behavior without reading the 
respective body.

The checker doesn't provide fool-proof purity checking. It just covers the 
common cases.
You may need to not enable the extension on code which falls outside those 
common cases.
It just means that the human and/or AI will need to look inside the method body 
to reason about its purity.


*Strict:*

{code:groovy}
@TypeChecked(extensions = 'groovy.typecheckers.PurityChecker')
class MathUtils {
    @Pure
    int square(int x) { x * x }                             // OK

    @Pure
    long timestamp() { System.nanoTime() }                   // ERROR: 
non-deterministic

    @Pure
    int logged(int x) { println("x=$x"); x * 2 }            // ERROR: logging
}
{code}

----

*Allowing logging:*

{code:groovy}
@TypeChecked(extensions = 'groovy.typecheckers.PurityChecker(allows: 
"LOGGING")')
class Service {
    @Pure
    int compute(int x) {
        println("computing $x")          // OK: logging allowed
        return x * x
    }

    @Pure
    long getTime() { System.nanoTime() } // ERROR: non-deterministic (not 
allowed)
}
{code}

----

*Allowing logging and non-determinism:*

{code:groovy}
@TypeChecked(extensions = 'groovy.typecheckers.PurityChecker(allows: 
"LOGGING|NONDETERMINISM")')
class Diagnostics {
    @Pure
    String snapshot(Map state) {
        println("snapshot at ${System.nanoTime()}")   // OK: both allowed
        return state.toString()
    }
}
{code}


  was:
I asked AI what features could be added to Groovy to give it vastly improved 
reasoning capabilities of Groovy code. First up it suggested @Modifies 
(GROOVY-11909) and the ModifiesChecker (GROOVY-11910). It said a close second 
would be a PurityChecker type checking extension. This issue looks at that.

The key thing to note here is that this is an opt-in extension.
If you use it, along with the existing @Pure annotation, it allows humans and 
AI to make assumptions about class or method behavior without reading the 
respective body.

*Strict:*
{code:groovy}
@TypeChecked(extensions = 'groovy.typecheckers.PurityChecker')
class MathUtils {
    @Pure
    int square(int x) { x * x }                             // OK

    @Pure
    long timestamp() { System.nanoTime() }                   // ERROR: 
non-deterministic

    @Pure
    int logged(int x) { println("x=$x"); x * 2 }            // ERROR: logging
}
{code}

The checker doesn't provide fool-proof purity checking. It just covers the 
common cases.
You may need to not enable the extension on code which falls outside those 
common cases.
It just means that the human and/or AI will need to look inside the method body 
to reason about its purity.

----

*Allowing logging:*

{code:groovy}
@TypeChecked(extensions = 'groovy.typecheckers.PurityChecker(allows: 
"LOGGING")')
class Service {
    @Pure
    int compute(int x) {
        println("computing $x")          // OK: logging allowed
        return x * x
    }

    @Pure
    long getTime() { System.nanoTime() } // ERROR: non-deterministic (not 
allowed)
}
{code}

----

*Allowing logging and non-determinism:*

{code:groovy}
@TypeChecked(extensions = 'groovy.typecheckers.PurityChecker(allows: 
"LOGGING|NONDETERMINISM")')
class Diagnostics {
    @Pure
    String snapshot(Map state) {
        println("snapshot at ${System.nanoTime()}")   // OK: both allowed
        return state.toString()
    }
}
{code}



> Add PurityChecker type checking extension
> -----------------------------------------
>
>                 Key: GROOVY-11914
>                 URL: https://issues.apache.org/jira/browse/GROOVY-11914
>             Project: Groovy
>          Issue Type: New Feature
>            Reporter: Paul King
>            Assignee: Paul King
>            Priority: Major
>
> I asked AI what features could be added to Groovy to give it vastly improved 
> reasoning capabilities of Groovy code. First up it suggested @Modifies 
> (GROOVY-11909) and the ModifiesChecker (GROOVY-11910). It said a close second 
> would be a PurityChecker type checking extension. This issue looks at that.
> The key thing to note here is that this is an opt-in extension.
> If you use it, along with the existing @Pure annotation, it allows humans and 
> AI to make assumptions about class or method behavior without reading the 
> respective body.
> The checker doesn't provide fool-proof purity checking. It just covers the 
> common cases.
> You may need to not enable the extension on code which falls outside those 
> common cases.
> It just means that the human and/or AI will need to look inside the method 
> body to reason about its purity.
> *Strict:*
> {code:groovy}
> @TypeChecked(extensions = 'groovy.typecheckers.PurityChecker')
> class MathUtils {
>     @Pure
>     int square(int x) { x * x }                             // OK
>     @Pure
>     long timestamp() { System.nanoTime() }                   // ERROR: 
> non-deterministic
>     @Pure
>     int logged(int x) { println("x=$x"); x * 2 }            // ERROR: logging
> }
> {code}
> ----
> *Allowing logging:*
> {code:groovy}
> @TypeChecked(extensions = 'groovy.typecheckers.PurityChecker(allows: 
> "LOGGING")')
> class Service {
>     @Pure
>     int compute(int x) {
>         println("computing $x")          // OK: logging allowed
>         return x * x
>     }
>     @Pure
>     long getTime() { System.nanoTime() } // ERROR: non-deterministic (not 
> allowed)
> }
> {code}
> ----
> *Allowing logging and non-determinism:*
> {code:groovy}
> @TypeChecked(extensions = 'groovy.typecheckers.PurityChecker(allows: 
> "LOGGING|NONDETERMINISM")')
> class Diagnostics {
>     @Pure
>     String snapshot(Map state) {
>         println("snapshot at ${System.nanoTime()}")   // OK: both allowed
>         return state.toString()
>     }
> }
> {code}



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

Reply via email to