# ziglings Welcome to `ziglings`! This project contains a series of tiny broken programs. By fixing them, you'll learn how to read and write [Zig](https://ziglang.org/) code! This project was directly inspired by the brilliant and fun [rustlings](https://github.com/rust-lang/rustlings) project for the [Rust](https://www.rust-lang.org/) language. Indirect inspiration comes from [Ruby Koans]( http://rubykoans.com/) and the Little LISPer/Little Schemer series of books. ## Intended Audience This will probably be difficult if you've _never_ programmed before. But no specific programming experience is required. And in particular, you are _not_ expected to have any prior experience with "systems programming" or a "systems" level language such as C. Each exercise is self-contained and self-explained. However, you're encouraged to also check out these Zig language resources for more detail: * https://ziglearn.org/ * https://ziglang.org/documentation/master/ ## Getting Started Install a [master build](https://ziglang.org/download/) of the Zig compiler. Verify the installation and version of `zig` like so: ```bash $ zig version 0.8.0-dev.1065+xxxxxxxxx ``` Clone this repository with Git: ```bash $ git clone https://github.com/ratfactor/ziglings $ cd ziglings ``` Then run `zig build` and follow the instructions to begin! ```bash $ zig build ``` ## A Note About Versions The Zig language is under very active development. Ziglings will attempt to be current, but not bleeding-edge. However, sometimes fundamental changes will happen. Ziglings will check for a minimum version and build number. (See Getting Started above for the current minimum.) It is likely that you'll download a build which is _greater_ than the minimum. Once you have a version of the Zig compiler that works with your copy of Ziglings, they'll continue to work together. But if you update one, you may need to also update the other. ## Advanced Usage It can be handy to check just a single exercise or _start_ from a single exercise: ```bash zig build 19 zig build 19_start ``` You can also run without checking for correctness: ```bash zig build 01_test ``` Or skip the build system entirely and interact directly with the compiler if you're into that sort of thing: ```bash zig run exercises/01_hello.zig ``` Calling all wizards: To prepare an executable for debugging, install it to zig-cache/bin with: ```bash zig build 01_install ``` ## TODO Contributions are very welcome! I'm writing this to teach myself and to create the learning resource I wished for. There will be tons of room for improvement: * Wording of explanations * Idiomatic usage of Zig * Additional exercises Planned exercises: * [x] Hello world (main needs to be public) * [x] Importing standard library * [x] Assignment * [x] Arrays * [x] Strings * [x] If * [x] While * [x] For * [x] Functions * [x] Errors (error/try/catch/if-else-err) * [x] Defer (and errdefer) * [x] Switch * [x] Unreachable * [x] Enums * [x] Structs * [x] Pointers * [ ] Optionals * [ ] Slices * [ ] Multi pointers * [ ] Unions * [ ] Numeric types (integers, floats) * [ ] Labelled blocks and loops * [ ] Loops as expressions * [ ] Comptime * [ ] Inline loops (how to DEMO this?) * [ ] Anonymous structs * [ ] Sentinel termination * [ ] Vectors * [ ] Imports * [ ] Allocators * [ ] Arraylist * [ ] Filesystem * [ ] Readers and Writers * [ ] Formatting * [ ] JSON * [ ] Random Numbers * [ ] Crypto * [ ] Threads * [ ] Hash Maps * [ ] Stacks * [ ] Sorting * [ ] Iterators * [ ] Formatting specifiers * [ ] Advanced Formatting * [ ] Suspend / Resume * [ ] Async / Await * [ ] Nosuspend * [ ] Async Frames, Suspend Blocks The initial topics for these exercises were unabashedly cribbed from [ziglearn.org](https://ziglearn.org/). I've since moved things around in an order that I think best lets each topic build upon each other.