2020-12-23 18:02:35 +01:00
|
|
|
# ziglings
|
|
|
|
|
2021-02-13 17:23:53 +01:00
|
|
|
Welcome to `ziglings`! This project contains a series of tiny broken programs.
|
|
|
|
By fixing them, you'll learn how to read and write
|
2020-12-23 18:02:35 +01:00
|
|
|
[Zig](https://ziglang.org/)
|
2021-02-13 17:23:53 +01:00
|
|
|
code!
|
2020-12-23 18:02:35 +01:00
|
|
|
|
|
|
|
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.
|
|
|
|
|
2021-02-06 15:29:49 +01:00
|
|
|
## Intended Audience
|
|
|
|
|
2021-02-06 21:54:56 +01:00
|
|
|
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.
|
2021-02-06 15:29:49 +01:00
|
|
|
|
|
|
|
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/
|
|
|
|
|
2020-12-23 18:02:35 +01:00
|
|
|
## Getting Started
|
|
|
|
|
2021-02-13 04:53:07 +01:00
|
|
|
Install a [master build](https://ziglang.org/download/) of the Zig compiler.
|
2020-12-23 18:02:35 +01:00
|
|
|
|
|
|
|
Verify the installation and version of `zig` like so:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
$ zig version
|
2021-02-13 04:53:07 +01:00
|
|
|
0.8.0-dev.1065+<some hexadecimal string>
|
2020-12-23 18:02:35 +01:00
|
|
|
```
|
|
|
|
|
|
|
|
Clone this repository with Git:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
git clone https://github.com/ratfactor/ziglings
|
|
|
|
cd ziglings
|
|
|
|
```
|
|
|
|
|
2021-02-12 05:04:36 +01:00
|
|
|
Then run `zig build` and follow the instructions to begin!
|
2020-12-23 18:02:35 +01:00
|
|
|
|
|
|
|
```bash
|
2021-02-12 05:04:36 +01:00
|
|
|
zig build
|
2020-12-23 18:02:35 +01:00
|
|
|
```
|
|
|
|
|
2021-02-13 04:53:07 +01:00
|
|
|
## A Note About Compiler 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
|
|
|
|
(which is this one: `0.x.x-dev.<build number>`) and exit if your version of
|
|
|
|
Zig is too old. It is likely that you'll download a build which is greater
|
|
|
|
than the number in the example shown above in this README. That's okay!
|
|
|
|
|
|
|
|
Once you have a version of the Zig compiler that works with your copy of
|
|
|
|
Ziglings, they'll continue to work together forever. But if you update one,
|
|
|
|
keep in mind that you may need to also update the other.
|
|
|
|
|
2020-12-23 18:02:35 +01:00
|
|
|
## Manual Usage
|
|
|
|
|
2021-02-12 05:04:36 +01:00
|
|
|
If you want to run a single file for testing, you can do so with this command:
|
2020-12-23 18:02:35 +01:00
|
|
|
|
|
|
|
```bash
|
2021-02-10 00:36:57 +01:00
|
|
|
zig run exercises/01_hello.zig
|
2020-12-23 18:02:35 +01:00
|
|
|
```
|
2021-02-12 05:04:36 +01:00
|
|
|
or, alternatively
|
|
|
|
```bash
|
|
|
|
zig build 01_test
|
|
|
|
```
|
|
|
|
|
|
|
|
To verify a single file, use
|
|
|
|
|
|
|
|
```bash
|
|
|
|
zig build 01_only
|
|
|
|
```
|
|
|
|
|
|
|
|
To prepare an executable for debugging, install it to zig-cache/bin with
|
|
|
|
|
|
|
|
```bash
|
|
|
|
zig build 01_install
|
|
|
|
```
|
2020-12-23 18:02:35 +01:00
|
|
|
|
|
|
|
## 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:
|
|
|
|
|
2021-01-03 18:21:11 +01:00
|
|
|
* [x] Hello world (main needs to be public)
|
|
|
|
* [x] Importing standard library
|
2021-01-04 00:55:45 +01:00
|
|
|
* [x] Assignment
|
2021-01-04 02:34:26 +01:00
|
|
|
* [x] Arrays
|
2021-01-06 01:26:02 +01:00
|
|
|
* [x] Strings
|
2021-01-08 23:53:22 +01:00
|
|
|
* [x] If
|
2021-01-10 17:46:42 +01:00
|
|
|
* [x] While
|
2021-01-19 01:21:18 +01:00
|
|
|
* [x] For
|
2021-01-22 23:42:03 +01:00
|
|
|
* [x] Functions
|
2021-02-04 01:19:31 +01:00
|
|
|
* [x] Errors (error/try/catch/if-else-err)
|
|
|
|
* [x] Defer (and errdefer)
|
2021-01-31 23:48:34 +01:00
|
|
|
* [x] Switch
|
2021-02-04 01:19:31 +01:00
|
|
|
* [x] Unreachable
|
2021-02-06 15:29:49 +01:00
|
|
|
* [x] Enums
|
2021-02-09 02:35:28 +01:00
|
|
|
* [x] Structs
|
|
|
|
* [x] Pointers
|
2020-12-23 18:02:35 +01:00
|
|
|
* [ ] Multi pointers
|
|
|
|
* [ ] Slices
|
2021-02-09 02:35:28 +01:00
|
|
|
* [ ] Unions
|
|
|
|
* [ ] Numeric types (integers, floats)
|
|
|
|
* [ ] Labelled blocks and loops
|
2020-12-23 18:02:35 +01:00
|
|
|
* [ ] Loops as expressions
|
|
|
|
* [ ] Optionals
|
|
|
|
* [ ] Comptime
|
2021-02-09 02:35:28 +01:00
|
|
|
* [ ] Inline loops (how to DEMO this?)
|
2020-12-23 18:02:35 +01:00
|
|
|
* [ ] Anonymous structs
|
|
|
|
* [ ] Sentinel termination
|
|
|
|
* [ ] Vectors
|
|
|
|
* [ ] Imports
|
2021-02-09 02:35:28 +01:00
|
|
|
* [ ] 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
|
2020-12-23 18:02:35 +01:00
|
|
|
|
|
|
|
The initial topics for these exercises were unabashedly cribbed from
|
2021-02-06 15:29:49 +01:00
|
|
|
[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.
|
|
|
|
|