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.