albrow / fo

An experimental language which adds functional programming features to Go.
Other
1.24k stars 34 forks source link

Using maps with uncomparable keys #24

Open go-li opened 6 years ago

go-li commented 6 years ago

Hello, the following does not run https://play.folang.org/p/XhaheZsrxBT

package main

func instantiate[T](p *T) {
    var foo = make(map[T]int)
    foo[*p] = 9
}

func main() {
    instantiate[[0]byte]((*[0]byte)(nil))
}

The expected result that creation of a map with uncomparable keys is either caught at compile time, or it blows up gracefully during map creation time. Currently it does:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0xffffffff addr=0x0 pc=0x841cb]

goroutine 1 [running]:
main.instantiate___0_byte(...)
    /tmp/sandbox652760664/main.go:5
main.main()
    /tmp/sandbox652760664/main.go:9 +0x6b

An engineering decision how to handle incomparable map keys is needed.

go-li commented 6 years ago

On a second consideration it works as expected

https://play.folang.org/p/-iokGIXkfJ9

albrow commented 6 years ago

It might not be obvious, but the second playground link you shared shows an error coming from the Go compiler. Re-opening this because I would like the Fo compiler to catch this type of issue instead of generating invalid code and relying on the Go compiler to catch it.

(The Fo compiler works by transforming the AST into pure Go code and then calling the Go compiler).