better-zig/ziglings-solutions
Learn the Zig programming language by fixing tiny broken programs.
Ziglings 解题报告, 已完成.
持续更新
zig 中文教程
better-zig/learn-zig: zig 学习练习代码
Zig 当前版本:
zig dev
版本(不维护稳定版本).dev 版本
, 更快追踪最新特性变更➤ zig version
0.10.0-dev.2617+47c4d4450
解题方式:
# 方式1: 逐一按照顺序解题
zig build
# 方式2: 传入指定题目编号, 可以忽略其他题目
zig build 1
zig build 83
zig build 84
solutions
分支.solutions 分支:
补充说明:
dart Null Safety 语义
.python class + self 语义
, 区分 类函数(静态) vs 类方法.undefined vs null vs errors vs void
语义区别go reflect 反射
等语义comptime
前缀, 强制指定编译期检查. (类似 rust 生命周期标记, 改变变量生命周期)comptime
前缀, 强制指定编译期检查.anytype
类型, 配合 @TypeOf() + @hasDecl()
实现多态(鸭子类型). 类似 go + reflect 反射效果.(用法也类似)inline for
, 类似 C/C++
内联概念.inline while
.comptime
前缀, 强制指定编译期阶段检测(分配).comptime
前缀的场景.sentinel
尾哨兵机制. 兼容 C 字符串
语义, @ptrCast()
强制类型转换.@"x-y-z"
作为命名字段. 比较无聊的语法糖
.匿名结构体 + @typeName(@TypeOf()) + @as() + @field()
,suspend + resume + async + await + nosuspend + panic UB error
.suspend + resume + async
, 简单用法async + suspend + resume + global var
全局变量, 实现协程间同步通信.async + await + return
基于 await 实现协程同步.nosuspend + suspend + panic UB(未定义)错误
suspend + async + resume
, 完整理解每条语句的执行顺序.(控制流切换)准备:
开始:
# 拉取本 repo 代码:
git clone [email protected]:better-zig/ziglings-solutions.git
# 切换分支:
git checkout solutions
验证:
# 切换本项目根目录
cd this-repo-root/
# 编译+运行, 交互式逐个修复有问题的测试题
zig build
# or:
task dev
Welcome to Ziglings! This project contains a series of tiny broken programs. By fixing them, you'll learn how to read and write Zig code.
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.)
This project was directly inspired by the brilliant and fun rustlings project for the Rust language. Indirect inspiration comes from Ruby Koans and the Little LISPer/Little Schemer series of books.
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:
Also, the Zig community is incredibly friendly and helpful!
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.10.0-dev.1427+xxxxxxxxx
Clone this repository with Git:
$ git clone https://github.com/ratfactor/ziglings
$ cd ziglings
Then run zig build
and follow the instructions to begin!
$ zig build
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.9.1
, but Ziglings
needs a dev build with pre-release version "0.10.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.
(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.)
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.
Also note that the current "stage 1" Zig compiler is very strict about input: no tab characters or Windows CR/LF newlines are allowed.
c_void
is now anyopaque
.Custom
is now .custom
any
format string requireds
(string) format string requiredIt can be handy to check just a single exercise or start from a single exercise:
zig build 19
zig build 19_start
You can also run without checking for correctness:
zig build 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 19_install
I've decide to limit Ziglings to the core language and not attempt coverage of the Standard Library. Perhaps you can change my mind?
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 <--- IN PROGRESS!
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:
Please see CONTRIBUTING.md in this repo for the full details.