but that would enable or disable _all_ precondition checks.

What I am looking for is soth. smart enough that deduces that the 
precondition checks in `mul` and `add` can be removed because of the 
precondition check in `Muladd`.

On Thursday, March 31, 2022 at 5:26:44 AM UTC+2 Henry wrote:

> You will need a build tag for that.
>
> For example: 
>
> In a separate file, define the build tag
> ```
> // +build debug
>
> package mypkg
>
> func init() {
>    Debug = true
> }
> ```
> Then, in other files, use the tag
> ```
> package mypkg
>
> var Debug bool
>
> func DoWork() {
>    if Debug {
>       // perform validation
>    }
> }
> ```
> When building with validation, call "go build -tags debug"
> On Thursday, March 31, 2022 at 1:40:07 AM UTC+7 toon....@gmail.com wrote:
>
>> I like to check the preconditions of a function explicitly by means of 
>> code (instead of only documenting them). Of course this incurs a 
>> time-penalty. 
>>
>> When being extremely cautious every function in a call-chain will always 
>> check its preconditions. But for a function down in the call-chain, the 
>> precondition checks of all its callers might already guarantee that its own 
>> pre-condition checks will never be violated. And thus these checks down the 
>> chain are unnecessary cpu cycles. 
>>
>> Do there exist tools/methods to detect this and auto-remove these 
>> precondition checks? 
>>
>> For example: 
>> the function Muladd below verifies that all arrays have the same length. 
>> Muladd relies on two functions to perform the `mul` and the `add` and each 
>> of these will also verify their respective preconditions explicitly. Given 
>> these functions are not exported and given these functions are only called 
>> by `muladd`, the compiler might be able to determine that the precondition 
>> checks are guaranteed to be valid and can thus be removed. 
>>
>> https://go.dev/play/p/92isKKx-vYx
>>
>> package main
>>
>> import "fmt"
>>
>> func main() {
>>     x := []float64{1.0, 2.0, 3.0}
>>     y := []float64{1.0, 2.0, 3.0}
>>     z := []float64{1.0, 2.0, 3.0}
>>     Muladd(x, y, z)
>>     fmt.Printf("%+v", x)
>> }
>>
>> func Muladd(x []float64, y []float64, z []float64) error {
>>     // check precondition (but unnecessary if only called by Muladd)
>>     if len(x) != len(y) || len(x) != len(z) {
>>         return fmt.Errorf("slices have different lengths %d vs %d vs %d", 
>> len(x), len(y), len(z))
>>     }
>>     mul(x, y)
>>     add(x, z)
>>     return nil
>> }
>>
>> func mul(x []float64, y []float64) error {
>>     // check precondition
>>     if len(x) != len(y) {
>>         return fmt.Errorf("slices have different lengths %d vs %d", 
>> len(x), len(y))
>>     }
>>     
>>     for i := range x {
>>         x[i] *= y[i]
>>     }
>>     return nil
>> }
>>
>> func add(x []float64, y []float64) error {
>>     // check precondition
>>     if len(x) != len(y) {
>>         return fmt.Errorf("slices have different lengths %d vs %d", 
>> len(x), len(y))
>>     }
>>     
>>     for i := range x {
>>         x[i] += y[i]
>>     }
>>     return nil
>> }
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/23966f0a-4ee9-4733-a4c0-ba1a4964d5f8n%40googlegroups.com.

Reply via email to