in

Ziglings: Learn Zig by fixing broken programs

Ziglings: Learn Zig by fixing broken programs

Ziglings
Welcome to Ziglings! This project contains a series of tiny
broken programs (and one nasty surprise). By fixing them, you’ll
learn how to read and write Zig code.

Those 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.)

This project was initiated by Dave Gauer and is directly inspired
by the brilliant and fun rustlings project.
Indirect inspiration comes from Ruby Koans 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:

Learn

This section lists resources useful to go from knowing nothing about Zig up to understanding its philosophy. This section is eventually going to be bundled with Zig’s standard library documentation, but in the meantime you can browse it from here. These are all introductions to Zig aimed at programmers with different backgrounds.

Welcome | zig.guide

Get started with the Zig programming language. Zig is a general-purpose programming language and toolchain for maintaining robust, optimal, and reusable software.


https://ziglang.org/documentation/master/
Zig in Depth! (video series)

Also, the Zig community
is incredibly friendly and helpful!

Getting Started
Install a development build of
the Zig compiler. (See the “master” section of the downloads
page.)

Verify the installation and build number of zig like so:

$ zig version
0.15.0-dev.xxxx+xxxxxxxxx
Clone this repository with Git:

git clone https://codeberg.org/ziglings/exercises.git ziglings
cd ziglings
Then run zig build and follow the instructions to begin!

zig build
Note: The output of Ziglings is the unaltered output from the Zig
compiler. Part of the purpose of Ziglings is to acclimate you to
reading these.

A Note About Versions
Hint: To check out Ziglings for a stable release of Zig, you can use
the appropriate tag.

The Zig language is under very active development. In order to be
current, Ziglings tracks development builds of the Zig
compiler rather than versioned release builds. The last
stable release was 0.14.1, but Ziglings needs a dev build with
pre-release version “0.15.0” and a build number at least as high
as that shown in the example version check above.

It is likely that you’ll download a build which is greater than
the minimum.

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 need to also update the other.

Version Changes
Version-0.14.0-dev.1573

2024-09-16 zig 0.14.0-dev.1573 – introduction of labeled switch, see #21257
2024-09-02 zig 0.14.0-dev.1409 – several changes in std.builtin, see #21225
2024-08-04 zig 0.14.0-dev.1224 – several changes in build system, see #21115
2024-08-04 zig 0.14.0-dev.839 – several changes in build system, see #20580, #20600
2024-06-17 zig 0.14.0-dev.42 – changes in std.mem.split and tokenize – see #15579
2024-05-29 zig 0.13.0-dev.339 – rework std.Progress – see #20059
2024-03-21 zig 0.12.0-dev.3518 – change to @fieldParentPtr – see #19470
2024-03-21 zig 0.12.0-dev.3397 – rename std.os to std.posix – see #5019
2024-03-14 zig 0.12.0-dev.3302 – changes in std.fmt – floating-point formatting implementation – see #19229
2024-02-05 zig 0.12.0-dev.2618 – changes in build system – from Step.zig_exe to Step.graph.zig_exe – see #18778
2024-01-05 zig 0.12.0-dev.2043 – rename of std.Build.FileSource to std.Build.LazyPath – see #16353
2023-10-24 zig 0.12.0-dev.1243 – changes in std.ChildProcess: renamed exec to run – see #5853
2023-06-26 zig 0.11.0-dev.4246 – changes in compile step (now it can be null)
2023-06-26 zig 0.11.0-dev.3853 – removal of destination type from all cast builtins
2023-06-20 zig 0.11.0-dev.3747 – @enumToInt is now @intFromEnum and @intToFloat is now @floatFromInt
2023-05-25 zig 0.11.0-dev.3295 – std.debug.TTY is now std.io.tty
2023-04-30 zig 0.11.0-dev.2704 – use of the new std.Build.ExecutableOptions.link_libc field
2023-04-12 zig 0.11.0-dev.2560 – changes in std.Build – remove run() and install()
2023-04-07 zig 0.11.0-dev.2401 – fixes of the new build system – see #212
2023-02-21 zig 0.11.0-dev.2157 – changes in build system – new: parallel processing of the build steps
2023-02-21 zig 0.11.0-dev.1711 – changes in for loops – new: Multi-Object For-Loops + Struct-of-Arrays
2023-02-12 zig 0.11.0-dev.1638 – changes in std.Build cache_root now returns a directory struct
2023-02-04 zig 0.11.0-dev.1568 – changes in std.Build (combine std.build and std.build.Builder into std.Build)
2023-01-14 zig 0.11.0-dev.1302 – changes in @addWithOverflow (now returns a tuple) and @typeInfo; temporary disabled async functionality
2022-09-09 zig 0.10.0-dev.3978 – change in NativeTargetInfo.detect in build
2022-09-06 zig 0.10.0-dev.3880 – Ex 074 correctly fails again: comptime array len
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-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

Advanced Usage
It can be handy to check just a single exercise:

zig build -Dn=19
Or run all exercises, starting from a specific one:

zig build -Ds=27
Or let Ziglings pick an exercise for you:

zig build -Drandom
You can also run without checking for correctness:

zig build -Dn=19 test
Or skip the build system entirely and interact directly with the
compiler if you’re into that sort of thing:

zig run exercises/001_hello.zig
Calling all wizards: To prepare an executable for debugging,
install it to zig-cache/bin with:

zig build -Dn=19 install
To get a list of all possible options, run:

zig build -Dn=19 -l

install Install 019_functions2.zig to prefix path
uninstall Uninstall 019_functions2.zig from prefix path
test Run 019_functions2.zig without checking output

To reset the progress (have it run all the exercises that have already been completed):

zig build -Dreset
What’s Covered
The primary goal for Ziglings is to cover the core Zig language.

It would be nice to cover the Standard Library as well, but this
is currently challenging because the stdlib is evolving even
faster than the core language (and that’s saying something!).
Not only would stdlib coverage change very rapidly, some
exercises might even cease to be relevant entirely.

Having said that, there are some stdlib features that are
probably here to stay or are so important to understand that they
are worth the extra effort to keep current.

Conspicuously absent from Ziglings are a lot of string
manipulation exercises. This is because Zig itself largely avoids
dealing with strings. Hopefully there will be an obvious way to
address this in the future. The Ziglings crew loves strings!

Zig Core Language

Hello world (main needs to be public)
Importing standard library
Assignment
Arrays
Strings
If
While
For
Functions
Errors (error/try/catch/if-else-err)
Defer (and errdefer)
Switch
Unreachable
Enums
Structs
Pointers
Optionals
Struct methods
Slices
Many-item pointers
Unions
Numeric types (integers, floats)
Labelled blocks and loops
Loops as expressions
Builtins
Inline loops
Comptime
Sentinel termination
Quoted identifiers @””
Anonymous structs/tuples/lists
Async

Report

What do you think?

Newbie

Written by Mr Viral

Leave a Reply

Your email address will not be published. Required fields are marked *

GIPHY App Key not set. Please check settings

High Performance Image Sensor Processing Using FPGAs [pdf]

A hidden time bomb in the tax code fueled mass tech layoffs. Here’s how it works

A hidden time bomb in the tax code fueled mass tech layoffs. Here’s how it works