I was curious how defer is implemented. `defer` in Go is famously function-scoped, not lexically-scoped. This means that the number of actively-deferred statements is unbounded, which implies heap allocation.
The answer is that Solod breaks with Go semantics here: it just makes defer block-scoped (and unavailable in for/if blocks, which I don't quite get).
What's the point if it's incompatible? You cant compile existing code anymore. And using go's testing toolchain like the README suggests is also unreliable if the compiled code has different behavior than the tested code...
Would have been a lot more useful if it tried to match the Go behavior and threw a compiler error if it couldn't, e.g. when you defer in a loop.
Is this just for people who prefer Go syntax over C syntax?
I don't really "get" the sweet-spot being targeted here. You don't get channels, goroutines, or gc, so aside from syntax and spatial memory safety you're not really inheriting much from Go. There is also no pathway to integrate with existing Go libraries.
Spatial memory safety is nice but it's the temporal safety that worries me most, in nontrivial C codebases.
I was curious how defer is implemented. `defer` in Go is famously function-scoped, not lexically-scoped. This means that the number of actively-deferred statements is unbounded, which implies heap allocation.
The answer is that Solod breaks with Go semantics here: it just makes defer block-scoped (and unavailable in for/if blocks, which I don't quite get).
https://github.com/solod-dev/solod/blob/main/doc/spec.md#def...
What's the point if it's incompatible? You cant compile existing code anymore. And using go's testing toolchain like the README suggests is also unreliable if the compiled code has different behavior than the tested code...
Would have been a lot more useful if it tried to match the Go behavior and threw a compiler error if it couldn't, e.g. when you defer in a loop.
Is this just for people who prefer Go syntax over C syntax?
I don't really "get" the sweet-spot being targeted here. You don't get channels, goroutines, or gc, so aside from syntax and spatial memory safety you're not really inheriting much from Go. There is also no pathway to integrate with existing Go libraries.
Spatial memory safety is nice but it's the temporal safety that worries me most, in nontrivial C codebases.
Looks to me like having the ability to write Go syntax and interop directly with C is the plus.
I do like Go's syntax but I can't help thinking the best language for C interop is C.
> I do like Go's syntax but I can't help thinking the best language for C interop is C.
SWIG[0] is a viable option for incorporating C code as well.
0 - https://swig.org/Doc4.4/Go.html#Go
I love how SWIG is still around! I first used it about 30 years ago to integrate with Perl, then later with Java.
"To keep things simple, there are no channels, goroutines, closures, or generics."
I wonder if it could be integrated with https://github.com/tidwall/neco, which has Go-like coroutines, channels, and synchronization methods.
Anton also wrote the fantastic codapi [1] for embedding executable code snippets with wasm
[1]: https://codapi.org/
Related and currently on the front page: https://news.ycombinator.com/item?id=47627595
Does it work with the preprocessor?
This is a bit too barebones. At least bring goroutines dude