Browse Source

add ex080 anonymous structs 1

Dave Gauer 4 years ago
parent
commit
ae0dc2b282
3 changed files with 88 additions and 0 deletions
  1. 4 0
      build.zig
  2. 76 0
      exercises/080_anonymous_structs.zig
  3. 8 0
      patches/patches/080_anonymous_structs.patch

+ 4 - 0
build.zig

@@ -396,6 +396,10 @@ const exercises = [_]Exercise{
         .output = "Sweet freedom: 55, false.",
         .hint = "Help us, Zig Programmer, you're our only hope!",
     },
+    .{
+        .main_file = "080_anonymous_structs.zig",
+        .output = "[Circle(i32): 25,70,15] [Circle(f32): 25.2,71.0,15.7]",
+    },
 };
 
 /// Check the zig version to make sure it can compile the examples properly.

+ 76 - 0
exercises/080_anonymous_structs.zig

@@ -0,0 +1,76 @@
+//
+// Struct types are always "anonymous" until we give them a name:
+//
+//     struct {};
+//
+// So far, we've been giving struct types a name like so:
+//
+//     const Foo = struct {};
+//
+// * The value of @typeName(Foo) is "Foo".
+//
+// A struct is also given a name when you return it from a
+// function:
+//
+//     fn Bar() type {
+//         return struct {};
+//     }
+//
+//     const MyBar = Bar();  // store the struct type
+//     const bar = Bar() {}; // create instance of the struct
+//
+// * The value of @typeName(Bar()) is "Bar()".
+// * The value of @typeName(MyBar) is "Bar()".
+// * The value of @typeName(@TypeOf(bar)) is "Bar()".
+//
+// You can also have completely anonymous structs. The value
+// of @typeName(struct {}) is "struct:<position in source>".
+//
+const print = @import("std").debug.print;
+
+// This function creates a generic data structure by returning an
+// anonymous struct type (which will no longer be anonymous AFTER
+// it's returned from the function).
+fn Circle(comptime T: type) type {
+    return struct {
+        center_x: T,
+        center_y: T,
+        radius: T,
+    };
+}
+
+pub fn main() void {
+    //
+    // See if you can complete these two variable initialization
+    // expressions to create instances of circle struct types
+    // which can hold these values:
+    //
+    // * circle1 should hold i32 integers
+    // * circle2 should hold f32 floats
+    //
+    var circle1 = ??? {
+        .center_x = 25,
+        .center_y = 70,
+        .radius = 15,
+    };
+
+    var circle2 = ??? {
+        .center_x = 25.234,
+        .center_y = 70.999,
+        .radius = 15.714,
+    };
+
+    print("[{s}: {},{},{}] ", .{
+        @typeName(@TypeOf(circle1)),
+        circle1.center_x,
+        circle1.center_y,
+        circle1.radius,
+    });
+
+    print("[{s}: {d:.1},{d:.1},{d:.1}]\n", .{
+        @typeName(@TypeOf(circle2)),
+        circle2.center_x,
+        circle2.center_y,
+        circle2.radius,
+    });
+}

+ 8 - 0
patches/patches/080_anonymous_structs.patch

@@ -0,0 +1,8 @@
+51c51
+<     var circle1 = ??? {
+---
+>     var circle1 = Circle(i32) {
+57c57
+<     var circle2 = ??? {
+---
+>     var circle2 = Circle(f32) {