@@ -12,7 +12,11 @@ pub fn main() void {
//
// We're just missing a couple things here. One thing we're NOT missing is the
-// keyword 'pub', which is not needed here. Can you guess why?
+// keyword "pub", which is not needed here. Can you guess why?
+//
+// Functions need to specify the type of value they return. The main() function
+// above has a special return type "void", which means it returns nothing. This
+// function returns something. What might that be?
??? deepThought() ??? {
return 42; // Number courtesy Douglas Adams
@@ -0,0 +1,28 @@
+// Now let's use a function that takes a parameter.
+const std = @import( "std" );
+
+pub fn main() void {
+ std.debug.print("Powers of two: {} {} {} {}\n", .{
+ twoToThe(1),
+ twoToThe(2),
+ twoToThe(3),
+ twoToThe(4),
+ });
+}
+// Oops! We seem to have forgotten something here. Function
+// parameters look like this:
+// fn myFunction( number: u8, is_lucky: bool ) {
+// ...
+// }
+// As you can see, we declare the type of the parameter, just
+// like we declare the types of variables, with a colon ":".
+fn twoToThe(???) u32 {
+ return std.math.pow(u32, 2, my_number);
@@ -0,0 +1,45 @@
+// Let's see if we can make use of some of things we've learned so far.
+// We'll create two functions: one that contains a "for" loop and one
+// that contains a "while" loop.
+// Both of these are simply labeled "loop" below.
+ const my_numbers = [4]u16{ 5,6,7,8 };
+ printPowersOfTwo(my_numbers);
+ std.debug.print("\n", .{});
+// You won't see this every day: a function that takes an array with
+// exactly four u16 numbers. This is not how you would normally pass
+// an array to a function. We'll learn about slices and pointers in
+// a little while. For now, we're using what we know.
+// This function prints, but does not return anything.
+fn printPowersOfTwo(numbers: [4]u16) ??? {
+ loop (numbers) |n| {
+ std.debug.print("{} ", .{twoToThe(n)});
+ }
+// This function bears a striking resemblance to twoToThe() in the last
+// exercise. But don't be fooled! This one does the math without the aid
+// of the standard library!
+fn twoToThe(number: u16) ??? {
+ var n: u16 = 0;
+ var total: u16 = 1;
+ loop (n < number) : (n += 1) {
+ total *= 2;
+ return ???;
@@ -65,9 +65,9 @@ Planned exercises:
* [x] If
* [x] While
* [x] For
-* [ ] Functions
-* [ ] Defer
+* [x] Functions
* [ ] Errors
+* [ ] Defer
* [ ] Switch
* [ ] Runtime safety
* [ ] Unreachable
@@ -68,7 +68,6 @@ function check_it {
fi
}
-
check_it 01_hello.zig "Hello world" "Note the error: the source file has a hint for fixing 'main'."
check_it 02_std.zig "Standard Library"
check_it 03_assignment.zig "55 314159 -11" "There are three mistakes in this one!"
@@ -87,6 +86,8 @@ check_it 15_for.zig "A Dramatic Story: :-) :-) :-( :-| :-) The End."
check_it 16_for2.zig "13"
check_it 17_quiz2.zig "8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, 16" "This is a famous game!"
check_it 18_functions.zig "Question: 42" "Can you help write the function?"
+check_it 19_functions2.zig "2 4 8 16"
+check_it 20_quiz3.zig "32 64 128 256" "Unexpected pop quiz! Help!"
echo
echo " __ __ _ "