2021-02-27 20:51:15 +01:00
|
|
|
# Ziglings
|
2020-12-23 18:02:35 +01:00
|
|
|
|
2021-02-27 20:51:15 +01:00
|
|
|
Welcome to Ziglings! This project contains a series of tiny broken programs.
|
2021-02-13 17:23:53 +01:00
|
|
|
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-16 02:04:18 +01:00
|
|
|
code.
|
|
|
|
|
2021-02-27 20:51:15 +01:00
|
|
|
![ziglings](https://user-images.githubusercontent.com/1458409/109398392-c1069500-790a-11eb-8ed4-7d7d74d32666.jpg)
|
|
|
|
|
|
|
|
Those tiny broken programs need your help! (You'll also save the planet from
|
|
|
|
evil aliens and help some friendly elephants stick together, which is very
|
|
|
|
sweet of you.)
|
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-03-10 20:47:23 +01:00
|
|
|
Indirect inspiration comes from [Ruby Koans](http://rubykoans.com/)
|
2021-02-13 21:47:00 +01:00
|
|
|
and the Little LISPer/Little Schemer series of books.
|
2020-12-23 18:02:35 +01:00
|
|
|
|
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/
|
|
|
|
|
2021-03-10 20:47:23 +01:00
|
|
|
Also, the [Zig community](https://github.com/ziglang/zig/wiki/Community) is incredibly friendly and helpful!
|
|
|
|
|
2020-12-23 18:02:35 +01:00
|
|
|
## Getting Started
|
|
|
|
|
2021-02-16 02:04:18 +01:00
|
|
|
Install a [development build](https://ziglang.org/download/) of the Zig compiler.
|
|
|
|
(See the "master" section of the downloads page.)
|
2020-12-23 18:02:35 +01:00
|
|
|
|
2021-02-16 02:13:50 +01:00
|
|
|
Verify the installation and build number of `zig` like so:
|
2020-12-23 18:02:35 +01:00
|
|
|
|
|
|
|
```bash
|
|
|
|
$ zig version
|
2023-01-14 13:12:24 +01:00
|
|
|
0.11.0-dev.1302+xxxxxxxxx
|
2020-12-23 18:02:35 +01:00
|
|
|
```
|
|
|
|
|
|
|
|
Clone this repository with Git:
|
|
|
|
|
|
|
|
```bash
|
2021-02-14 22:42:42 +01:00
|
|
|
$ git clone https://github.com/ratfactor/ziglings
|
|
|
|
$ cd ziglings
|
2020-12-23 18:02:35 +01:00
|
|
|
```
|
|
|
|
|
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-14 22:42:42 +01:00
|
|
|
$ zig build
|
2020-12-23 18:02:35 +01:00
|
|
|
```
|
|
|
|
|
2021-02-14 22:42:42 +01:00
|
|
|
## A Note About Versions
|
2021-02-13 04:53:07 +01:00
|
|
|
|
2021-02-16 02:04:18 +01:00
|
|
|
The Zig language is under very active development. In order to be current,
|
2021-02-16 02:13:50 +01:00
|
|
|
Ziglings tracks **development** builds of the Zig compiler rather than
|
2023-01-14 12:56:52 +01:00
|
|
|
versioned **release** builds. The last stable release was `0.10.0`, but Ziglings
|
|
|
|
needs a dev build with pre-release version "0.11.0" and a build number at least
|
2021-02-16 02:13:50 +01:00
|
|
|
as high as that shown in the example version check above.
|
2021-02-15 01:25:35 +01:00
|
|
|
|
|
|
|
It is likely that you'll download a build which is _greater_ than the minimum.
|
2021-02-13 04:53:07 +01:00
|
|
|
|
2021-12-20 20:49:25 +01:00
|
|
|
_(For those who cannot easily update Zig, there are also community-supported
|
|
|
|
branches in this repo. At the moment, there's one for v0.8.1. Older version
|
|
|
|
branches may or may not have all exercises and/or bugfixes.)_
|
|
|
|
|
2021-02-16 02:04:18 +01:00
|
|
|
Once you have a build of the Zig compiler that works with Ziglings, they'll
|
|
|
|
continue to work together. But keep in mind that if you update one, you may
|
2021-02-15 01:25:35 +01:00
|
|
|
need to also update the other.
|
2021-02-13 04:53:07 +01:00
|
|
|
|
2021-06-30 23:30:01 +02:00
|
|
|
Also note that the current "stage 1" Zig compiler is very strict
|
|
|
|
about input:
|
2021-06-30 23:33:38 +02:00
|
|
|
[no tab characters or Windows CR/LF newlines are allowed](https://github.com/ziglang/zig/issues/544).
|
2021-06-30 23:30:01 +02:00
|
|
|
|
2021-04-21 15:47:16 +02:00
|
|
|
### Version Changes
|
2022-03-20 00:42:22 +01:00
|
|
|
|
2023-01-21 17:43:00 +01:00
|
|
|
Version-0.11.0-dev.1302+xxxxxxxxx
|
2023-01-21 14:19:48 +01:00
|
|
|
* *2023-01-14* zig 0.11.0-dev.1302 - changes in `@addWithOverflow` (now returns a tuple) and `@typeInfo`; temporary disabled async functionality
|
2022-09-10 20:41:40 +02:00
|
|
|
* *2022-09-09* zig 0.10.0-dev.3978 - change in `NativeTargetInfo.detect` in build
|
2022-09-06 14:28:31 +02:00
|
|
|
* *2022-09-06* zig 0.10.0-dev.3880 - Ex 074 correctly fails again: comptime array len
|
2022-09-10 20:41:40 +02:00
|
|
|
* *2022-08-29* zig 0.10.0-dev.3685 - `@typeName()` output change, stage1 req. for async
|
|
|
|
* *2022-07-31* zig 0.10.0-dev.3385 - std lib string `fmt()` option changes
|
2022-03-20 00:42:22 +01:00
|
|
|
* *2022-03-19* zig 0.10.0-dev.1427 - method for getting sentinel of type changed
|
|
|
|
* *2021-12-20* zig 0.9.0-dev.2025 - `c_void` is now `anyopaque`
|
|
|
|
* *2021-06-14* zig 0.9.0-dev.137 - std.build.Id `.Custom` is now `.custom`
|
|
|
|
* *2021-04-21* zig 0.8.0-dev.1983 - std.fmt.format() `any` format string required
|
|
|
|
* *2021-02-12* zig 0.8.0-dev.1065 - std.fmt.format() `s` (string) format string required
|
2021-04-21 15:47:16 +02:00
|
|
|
|
2021-02-14 22:42:42 +01:00
|
|
|
## Advanced Usage
|
2020-12-23 18:02:35 +01:00
|
|
|
|
2021-02-14 22:42:42 +01:00
|
|
|
It can be handy to check just a single exercise or _start_ from a single
|
|
|
|
exercise:
|
2020-12-23 18:02:35 +01:00
|
|
|
|
|
|
|
```bash
|
2021-02-14 22:42:42 +01:00
|
|
|
zig build 19
|
|
|
|
zig build 19_start
|
2020-12-23 18:02:35 +01:00
|
|
|
```
|
2021-02-14 22:42:42 +01:00
|
|
|
|
|
|
|
You can also run without checking for correctness:
|
|
|
|
|
2021-02-12 05:04:36 +01:00
|
|
|
```bash
|
2021-03-13 01:09:35 +01:00
|
|
|
zig build 19_test
|
2021-02-12 05:04:36 +01:00
|
|
|
```
|
|
|
|
|
2021-02-14 22:42:42 +01:00
|
|
|
Or skip the build system entirely and interact directly with the compiler
|
|
|
|
if you're into that sort of thing:
|
2021-02-12 05:04:36 +01:00
|
|
|
|
|
|
|
```bash
|
2021-03-13 01:09:35 +01:00
|
|
|
zig run exercises/001_hello.zig
|
2021-02-12 05:04:36 +01:00
|
|
|
```
|
|
|
|
|
2021-02-14 22:42:42 +01:00
|
|
|
Calling all wizards: To prepare an executable for debugging, install it
|
|
|
|
to zig-cache/bin with:
|
2021-02-12 05:04:36 +01:00
|
|
|
|
|
|
|
```bash
|
2021-03-13 01:09:35 +01:00
|
|
|
zig build 19_install
|
2021-02-12 05:04:36 +01:00
|
|
|
```
|
2020-12-23 18:02:35 +01:00
|
|
|
|
2021-11-08 02:52:05 +01:00
|
|
|
## What's Covered
|
2020-12-23 18:02:35 +01:00
|
|
|
|
2021-11-08 02:52:05 +01:00
|
|
|
I've decide to limit Ziglings to the core language and not
|
|
|
|
attempt coverage of the Standard Library. Perhaps you can change
|
|
|
|
my mind?
|
2020-12-23 18:02:35 +01:00
|
|
|
|
2021-05-01 03:35:56 +02:00
|
|
|
Core Language
|
|
|
|
|
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
|
2021-02-17 02:28:34 +01:00
|
|
|
* [x] Optionals
|
2021-02-28 19:23:22 +01:00
|
|
|
* [x] Struct methods
|
2021-03-07 03:31:55 +01:00
|
|
|
* [x] Slices
|
2021-03-13 22:27:14 +01:00
|
|
|
* [x] Many-item pointers
|
2021-03-10 02:04:43 +01:00
|
|
|
* [x] Unions
|
2021-04-10 17:39:11 +02:00
|
|
|
* [x] Numeric types (integers, floats)
|
|
|
|
* [x] Labelled blocks and loops
|
|
|
|
* [x] Loops as expressions
|
2021-04-11 17:22:38 +02:00
|
|
|
* [x] Builtins
|
2021-05-01 03:35:56 +02:00
|
|
|
* [x] Inline loops
|
|
|
|
* [x] Comptime
|
2021-05-07 02:32:36 +02:00
|
|
|
* [x] Sentinel termination
|
2021-05-09 19:10:09 +02:00
|
|
|
* [x] Quoted identifiers @""
|
2021-05-10 01:53:14 +02:00
|
|
|
* [x] Anonymous structs/tuples/lists
|
2021-11-08 02:52:05 +01:00
|
|
|
* [ ] Async <--- IN PROGRESS!
|
2023-01-12 20:10:46 +01:00
|
|
|
* [ ] Interfaces
|
2021-11-08 02:52:05 +01:00
|
|
|
|
|
|
|
## Contributing
|
|
|
|
|
|
|
|
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
|
|
|
|
* Maybe additional exercises?
|
|
|
|
|
|
|
|
Please see CONTRIBUTING.md in this repo for the full details.
|
|
|
|
|
|
|
|
|