Merge branch 'main' into emphasize-for-loop-range

This commit is contained in:
Chris Boesch 2026-02-27 19:43:31 +01:00
commit 88510735e1
9 changed files with 23 additions and 17 deletions

View File

@ -278,7 +278,8 @@ pub fn build(b: *Build) !void {
return error.UnexpectedEOF; return error.UnexpectedEOF;
} }
starting_exercise = try std.fmt.parseInt(u32, contents, 10); const trimmed_contents = std.mem.trim(u8, contents, "\r\n");
starting_exercise = try std.fmt.parseInt(u32, trimmed_contents, 10);
} else |err| { } else |err| {
switch (err) { switch (err) {
std.Io.File.OpenError.FileNotFound => { std.Io.File.OpenError.FileNotFound => {

View File

@ -11,8 +11,8 @@
// //
// } // }
// //
// The "continue expression" executes every time the loop restarts // The "continue expression" executes every single time the loop restarts,
// whether the "continue" statement happens or not. // even when a `continue` statement skips the rest of the loop body.
// //
const std = @import("std"); const std = @import("std");

View File

@ -4,7 +4,7 @@
// var foo: u8 = 5; // foo is 5 // var foo: u8 = 5; // foo is 5
// var bar: *u8 = &foo; // bar is a pointer // var bar: *u8 = &foo; // bar is a pointer
// //
// What is a pointer? It's a reference to a value. In this example // What is a pointer? It's a reference to a value. In this example,
// bar is a reference to the memory space that currently contains the // bar is a reference to the memory space that currently contains the
// value 5. // value 5.
// //

View File

@ -137,19 +137,20 @@ pub fn main() void {
} }
// NOTE: This exercise did not originally include the function below. // NOTE: This exercise did not originally include the function below.
// But a change after Zig 0.10.0 added the source file name to the // After Zig 0.10.0, `@typeName` began prefixing the returned type name
// type. "Narcissus" became "065_builtins2.Narcissus". // with the source file name. For example, "Narcissus" became
// "065_builtins2.Narcissus".
// //
// To fix this, we've added this function to strip the filename from // To fix this, we've added this function to strip the filename from
// the front of the type name. (It returns a slice of the type name // the front of the type name. (It returns a slice of the type name
// starting at the index + 1 of character ".") // starting just after the ".")
// //
// We'll be seeing @typeName again in Exercise 070. For now, you can // We'll be seeing @typeName again in Exercise 070. For now, you can
// see that it takes a Type and returns a u8 "string". // see that it takes a Type and returns a u8 "string".
fn maximumNarcissism(myType: type) []const u8 { fn maximumNarcissism(myType: type) []const u8 {
const indexOf = @import("std").mem.indexOf; const find = @import("std").mem.find;
// Turn "065_builtins2.Narcissus" into "Narcissus" // Turn "065_builtins2.Narcissus" into "Narcissus"
const name = @typeName(myType); const name = @typeName(myType);
return name[indexOf(u8, name, ".").? + 1 ..]; return name[find(u8, name, ".").? + 1 ..];
} }

View File

@ -11,7 +11,7 @@
// format string can be checked for errors at compile time rather // format string can be checked for errors at compile time rather
// than crashing at runtime. // than crashing at runtime.
// //
// (The actual formatting is done by std.fmt.format() and it // (The actual formatting is done by std.Io.Writer.print() and it
// contains a complete format string parser that runs entirely at // contains a complete format string parser that runs entirely at
// compile time!) // compile time!)
// //

View File

@ -118,6 +118,10 @@ fn printTuple(tuple: anytype) void {
// @field(foo, "x"); // returns the value at foo.x // @field(foo, "x"); // returns the value at foo.x
// //
// The first field should print as: "0"(bool):true // The first field should print as: "0"(bool):true
//
// Hint: Be careful! If your 'lhs' is a type, @field() looks
// for declarations. If it's a value, it looks for data.
//
print("\"{s}\"({any}):{any} ", .{ print("\"{s}\"({any}):{any} ", .{
field.???, field.???,
field.???, field.???,

View File

@ -2,7 +2,7 @@
// The functionality of the standard library is becoming increasingly // The functionality of the standard library is becoming increasingly
// important in Zig. First of all, it is helpful to take a look at how // important in Zig. First of all, it is helpful to take a look at how
// the individual functions are implemented. Because this is wonderfully // the individual functions are implemented. Because this is wonderfully
// suitable as a template for your own functions. In addition these // suitable as a template for your own functions. In addition, these
// standard functions are part of the basic configuration of Zig. // standard functions are part of the basic configuration of Zig.
// //
// This means that they are always available on every system. // This means that they are always available on every system.

View File

@ -1,5 +1,5 @@
--- exercises/065_builtins2.zig 2025-06-17 13:58:07.857258167 +0200 --- exercises/065_builtins2.zig 2026-02-27 13:10:36
+++ answers/065_builtins2.zig 2025-06-17 13:56:36.630415938 +0200 +++ answers/065_builtins2.zig 2026-02-27 13:10:52
@@ -58,7 +58,7 @@ @@ -58,7 +58,7 @@
// Oops! We cannot leave the 'me' and 'myself' fields // Oops! We cannot leave the 'me' and 'myself' fields
// undefined. Please set them here: // undefined. Please set them here:

View File

@ -1,5 +1,5 @@
--- exercises/082_anonymous_structs3.zig 2025-03-14 16:41:17.892873287 +0200 --- exercises/082_anonymous_structs3.zig 2026-02-27 13:05:46
+++ answers/082_anonymous_structs3.zig 2025-03-14 16:40:56.043829543 +0200 +++ answers/082_anonymous_structs3.zig 2026-02-27 13:07:22
@@ -82,14 +82,14 @@ @@ -82,14 +82,14 @@
// @typeInfo(Circle).@"struct".fields // @typeInfo(Circle).@"struct".fields
// //
@ -17,9 +17,9 @@
// 3. Print the field's name, type, and value. // 3. Print the field's name, type, and value.
// //
// Each 'field' in this loop is one of these: // Each 'field' in this loop is one of these:
@@ -119,9 +119,9 @@ @@ -123,9 +123,9 @@
// for declarations. If it's a value, it looks for data.
// //
// The first field should print as: "0"(bool):true
print("\"{s}\"({any}):{any} ", .{ print("\"{s}\"({any}):{any} ", .{
- field.???, - field.???,
- field.???, - field.???,