Show HN: Zig-DbC – A design by contract library for Zig
Hi everyone,
I've made an open-source library for using design by contract (DbC) principles in the Zig programming language.
It's called Zig-DbC, and it currently provides the following features:
- A simple API to define preconditions, postconditions, and invariants.
- Contracts are active in `Debug`, `ReleaseSafe`, and `ReleaseSmall` modes to catch bugs early.
- All checks are removed at compile time in `ReleaseFast` mode for zero performance cost.
- An optional mode to handle partial state changes in functions that return errors.
- Transparent error handling that propagates errors from your code to the caller.
Project's GitHub repo: https://github.com/habedi/zig-dbc
Nice! Always thought DbC was underused outside of languages like Eiffel. Cool to see it brought to Zig with zero-cost checks in ReleaseFast — that’s a solid balance between safety and performance.
This is pretty cool, I like to see this kind of project coming to Zig. Zig's compile-time language features make DbC a natural fit.
I am not yet proficient enough in Zig to be able to evaluate how well the syntax fits into idiomatic Zig.
Good work.
Thanks.
I'm new to Zig myself and created this library because I had trouble verifying the correctness of the code I wrote for a set of complex data structures in another larger Zig project (this one: https://github.com/habedi/ordered). I'm currently experimenting with how to use DbC in Zig, which led to the creation of this library.
Why are the checks included in ReleaseSmall?
I created this library to help me verify the correctness of my Zig code in another project. However, I wanted the option to strip the checks when the code becomes more mature, for efficiency. For efficiency, I mainly care about speed, which is why checks are only compiled out in `ReleaseFast`.
Another project burdened by Andrew Kelley's weird hate-boner for function literals.
How ridiculous that this is required to do something so simple.Related RFC for context: https://github.com/ziglang/zig/issues/20242
I think they want to add lambdas to Zig at some point. The number of changes is high between releases.
Unless something has changed from this (https://github.com/ziglang/zig/issues/1717#issuecomment-1627...), that is unlikely. The irony is that Zig's new async/await strategy is to use event loops with passed-in functions (https://www.youtube.com/watch?v=x3hOiOcbgeA&t=3643s).
That's kinda weird and sad. Lambdas are very useful TBH.
Wouldn't surprise me whatsoever if someone creates zigplus, which is just some TypeScript-style superset that adds lambdas and interfaces to Zig as syntax sugar.