Browse Source

Added Ex. 2, polished script, added LICENSE

Dave Gauer 4 years ago
parent
commit
d618414c9c
5 changed files with 99 additions and 91 deletions
  1. 9 40
      01_hello.zig
  2. 21 0
      02_std.zig
  3. 21 0
      LICENSE
  4. 3 11
      README.md
  5. 45 40
      ziglings

+ 9 - 40
01_hello.zig

@@ -1,47 +1,16 @@
-// Oh no! This program is supposed to print "Hello world!" but it has some
-// mistakes. Let's fix it.
 //
 //
-// We're trying to import the Standard Library into the top level of our
-// application. The standard library is not named "foo", it is named "std".
+// Oh no! This program is supposed to print "Hello world!" but it needs
+// your help!
 //
 //
-// Please correct the name in both places in the import here:
-const foo = @import("foo");
-
-// Zig applications start by calling a function named 'main'. It needs to be
-// public so that it is accessible outside our file!
-//
-// Public functions are declared with the 'pub' keyword like so:
+// Hint: Zig functions are private by default.
+//       The main() function should be public.
+//       Declare a public function with "pub fn ..."
 //
 //
-//     pub fn my_function() void { ... }
+// Try to fix the program and run `ziglings` to see if it passes.
 //
 //
-// Please make the main() function public:
-fn main() void {
-
-    // The easiest way to display our "Hello world" message in the
-    // terminal is to use the std.debug.print() function.
-    
-    // Please fix this silly "foo" mistake here:
-    foo.debug.print("Hello world!\n", .{});
+const std = @import("std");
 
 
-    // The print function above takes two values:
-    //
-    //   1. A string of characters: "Hello world!\n". "\n" prints a new line.
-    //
-    //   2. A struct containing data to be displayed. .{} is an empty, nameless
-    //      struct fulfilling the requirement. More about structs later.
-    //
-    //
-    // Now we're ready to...What's this!? Oh, we wanted to print a Goodbye
-    // message as well!
-    //
-    // Please fix this to use the same print function as above:
-    "Goodbye!\n"
+fn main() void {
+    std.debug.print("Hello world!\n", .{});
 }
 }
 
 
-// Once you're done with the changes above, run `ziglings` to see if it passes.
-//
-// Finally, all files will contain the following comment:
-//
-// I AM NOT DONE
-//
-// Delete it when you're ready to continue to the next exercise!

+ 21 - 0
02_std.zig

@@ -0,0 +1,21 @@
+//
+// Oops! This program is supposed to print a line like our Hello World
+// example. But we forgot how to import the Zig Standard Library.
+//
+// Hint 1: The @import() built-in function returns a value representing
+//         imported code. We need to give that value a name to use it.
+// Hint 2: We use the name "std" in the main function (see below).
+// Hint 3: Imports need to be named by declaring them as "const" values.
+// Hint 4: Take a look at how the previous exercise did this!
+//
+@import("std");
+
+pub fn main() void {
+    std.debug.print("Standard Library.\n", .{});
+}
+
+// Going deeper: imports must be declared as "constants" (with the 'const'
+// keyword rather than "variables" (with the 'var' keyword) is that they
+// can only be used at "compile time" rather than "run time". Zig evaluates
+// const values at compile time. Don't worry if none of this makes sense
+// yet! See also this answer: https://stackoverflow.com/a/62567550/695615

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 Dave Gauer
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 3 - 11
README.md

@@ -39,20 +39,12 @@ Then run the `ziglings` script and follow the instructions to begin!
 ## Manual Usage
 ## Manual Usage
 
 
 If you can't (or don't want to) use the script, you can manually verify each
 If you can't (or don't want to) use the script, you can manually verify each
-exercise with the Zig compiler.
-
-Some exercises need to be "run" (compiled and executed):
+exercise with the Zig compiler:
 
 
 ```bash
 ```bash
 zig run exercises/01_hello.zig
 zig run exercises/01_hello.zig
 ```
 ```
 
 
-Some exercises need to be tested:
-
-```bash
-zig test exercises/02_hello_test.zig
-```
-
 ## TODO
 ## TODO
 
 
 Contributions are very welcome! I'm writing this to teach myself and to create
 Contributions are very welcome! I'm writing this to teach myself and to create
@@ -65,8 +57,8 @@ the learning resource I wished for. There will be tons of room for improvement:
 
 
 Planned exercises:
 Planned exercises:
 
 
-* [x] Hello world
-* [ ] Hello tests
+* [x] Hello world (main needs to be public)
+* [x] Importing standard library
 * [ ] Assignment
 * [ ] Assignment
 * [ ] Arrays
 * [ ] Arrays
 * [ ] If
 * [ ] If

+ 45 - 40
ziglings

@@ -1,7 +1,5 @@
 #!/bin/bash
 #!/bin/bash
 
 
-# Minimum viable working example!
-
 echo
 echo
 echo "         _       _ _ "
 echo "         _       _ _ "
 echo "     ___(_) __ _| (_)_ __   __ _ ___ "
 echo "     ___(_) __ _| (_)_ __   __ _ ___ "
@@ -16,48 +14,55 @@ fmt_err=$( tput setaf 1 ) # red foreground
 fmt_yay=$( tput setaf 2 ) # green foreground
 fmt_yay=$( tput setaf 2 ) # green foreground
 fmt_off=$( tput sgr0 )    # reset colors/effects
 fmt_off=$( tput sgr0 )    # reset colors/effects
 
 
+function check_it {
+    source_file=$1
+    correct_output=$2
+    hint=$3
 
 
+    # Compile/run the source and capture the result and exit value
+    cmd="zig run $source_file"
+    echo "$ $cmd"
+    result=$($cmd 2>&1)
+    result_status=$?
 
 
-# TODO: most of this belongs in a generalized function
-if grep -q "I AM NOT DONE" 01_hello.zig
-then
+    # Echo the result to the screen so user can see what their program does
+    echo "$result"
+    if [[ $result_status -ne 0 ]]
+    then
+        echo
+        printf "${fmt_err}Uh oh! Looks like there was an error.${fmt_off}\n"
+        if [[ ! -z "$hint" ]]
+        then
+            echo "$hint"
+        fi
+        echo
+        echo "Edit '$source_file' and run me again."
+        echo
+        exit 1
+    fi
 
 
-echo
-echo "* Exercise: Hello world *"
-
-result=$(zig run 01_hello.zig 2>&1)
-result_status=$?
-echo =========================================================================
-echo "$result"
-echo =========================================================================
-if [[ $result_status -eq 0 ]]
-then
-    printf "${fmt_yay}Zig was able to compile your submission.${fmt_off}\n"
-else
-    printf "${fmt_err}Uh oh! Looks like there was an error.${fmt_off}\n"
-    exit
-fi
-
-if [[ $result == *Hello*Goodbye* ]]
-then
-    printf "${fmt_yay}Excellent! I see that you're printing both Hello and Goodbye!${fmt_off}\n"
-else
-    printf "${fmt_err}It seems to compile, but...${fmt_off}\n"
-    exit
-fi
-
-echo "Now you're ready to move on!"
-echo "Delete the line I AM NOT DONE from the source file when you're ready"
-echo "to continue."
-
-exit
-
-else # end of exercise one - I AM NOT DONE is removed!
-    printf "${fmt_yay}DONE - Hello world${fmt_off}\n"
-fi
+    # Wildcards to be lenient with anything AROUND the correct output
+    if [[ "$result" == *$correct_output* ]]
+    then
+        printf "${fmt_yay}** PASSED **${fmt_off}\n"
+    else
+        printf "${fmt_err}It seems to compile, but I wanted to see '$correct_output'.${fmt_off}\n"
+        echo
+        exit 1
+    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"
+
+echo
+echo "    __   __          _ "
+echo "    \ \ / __ _ _   _| | "
+echo "     \ V / _' | | | | | "
+echo "      | | (_| | |_| |_| "
+echo "      |_|\__,_|\__, (_) "
+echo "               |___/ "
 echo
 echo
-echo "* Exercise: Hello test *"
+echo "You've completed all of the Ziglings exercises!"
 echo
 echo
-echo "TODO: this and other exercises :-)"