Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Zig #98

Closed
wants to merge 6 commits into from
Closed

Zig #98

Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
267 changes: 267 additions & 0 deletions software/32.Zig/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,267 @@
# Workshop 32 - Introduction to Zig

Welcome to this introductory workshop on Zig! Zig is a modern programming language that emphasizes robustness, performance and clarity. Today, you'll learn :
✔️ How to install Zig
✔️ Create your first project
✔️ Discover the language's key concepts by creating a few projects

## Introduction

Zig is a general-purpose programming language focused on robustness, performance, and simplicity. It offers manual memory management, safety features, built-in cross-compilation, and seamless C interoperability, making it ideal for system programming and high-performance applications.

## Step 0 - SETUP

All the required information to install dependencies can be found in [SETUP.md](./SETUP.md).

> 💡 We recommend you to follow the [Getting started](https://ziglang.org/learn/getting-started/) for this workshop.

## Step 1 - Hello World! in Zig

> ❗ We strongly advise you to use the documentation provided for this exercise.

📑 Description:

For the first exercise, we simply ask you to write `Hello world!` in your terminal when you run your program.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

change write by print


📌 Tasks:

Create a file `main.zig` in a folder called `src` with your logic to print the "hello world"

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should say: It should look like this 🔽

src
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Replace:

src
└── main.zig

by

src
└── main.zig

└── main.zig

📚 Documentation:

> 💡 Now, that you have created a file `main.zig`, you can use other zig files. To use them in your `main.zig` you have to integrate the module ([read more](https://stackoverflow.com/questions/71186556/how-do-i-include-one-zig-file-from-another-zig-file))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I already said it, rephrase this part: you can use other zig files. You should say how to include another zig packages or logic code that are in different files..


- [Build System](https://ziglang.org/learn/build-system/)
- [Doc.Zig](https://ziglang.org/documentation/master/)

✔️ Validation:

you should see the following :

```sh
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the example add the execution of the file so the user can just copy paste that.

Hello, World!
```

## Step 2 - Palindrome?

📑 Description:

For the second exercise, you have to create a function that takes as parameter a string `word`.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

change string word. by string named word


📌 Tasks:

Create a file `palindrome.zig` for this new function.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Specify that he should create it in the src folder and don't forget to show this:

src
├── main.zig
└── palindrome.zig


This function must return true if the word given in parameter is a palindrome and false in the opposite case.

📚 Documentation:

-[What is a palindrome ?](https://www.wikiwand.com/en/Palindrome)
-[New function](https://ziglang.org/documentation/master/#Functions)
-[The types in Zig](https://ziglang.org/documentation/master/#Primitive-Types)
-[Control_Structures](https://zig.guide/language-basics/while-loops)

✔️ Validation:

Here's a main example :

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't forget to add the code block zig, so people can get the difference between normal text and code.

pub fn main() void {
    const stdout = std.io.getStdOut().writer();

    const test_word1 = "madam";
    const test_word2 = "hello";

    const result1 = is_palindrome(test_word1);
    const result2 = is_palindrome(test_word2);

    stdout.print("{} is palindrome: {}\n", .{test_word1, result1}) catch {};
    stdout.print("{} is palindrome: {}\n", .{test_word2, result2}) catch {};
}

pub fn main() void {
const stdout = std.io.getStdOut().writer();

const test_word1 = "madam";
const test_word2 = "hello";

const result1 = is_palindrome(test_word1);
const result2 = is_palindrome(test_word2);

stdout.print("{} is palindrome: {}\n", .{test_word1, result1}) catch {};
stdout.print("{} is palindrome: {}\n", .{test_word2, result2}) catch {};
}

When you compile and run palindrome.zig, the output should be:

```sh
madam is palindrome: true
```
or

```sh
hello is palindrome: false
```

## Step 3 - Fibonacci sequence
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I already said guys, change this exercise and find a new one, it's already been done in the rust workshop.


📑 Description:

For the third exercise, you need to create a function that generates and displays the Fibonacci sequence up to a specified number of elements.

📌 Tasks:

- Create a file `fibonacci.zig` for this new function.

For the third exercise, create a function that takes one parameter:

- A number `max` with type `i32` that represent the number of element to compute.

- You must now display the sequence of Fibonacci from the number of starts to the `max` value.

Here is a small example of the beginning of the Fibonacci sequence:

```shell
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
```

📚 Documentation:

-[Fibonacci number](https://www.wikiwand.com/en/Fibonacci_number)
-[Match](https://ziglang.org/documentation/master/#Standard-Library-Math-Functions)
-[Vector](https://ziglang.org/documentation/master/#Vectors)

✔️ Validation:

Given the Fibonacci sequence (see previous example), if max is 5, the function should output:

```sh
0, 1, 1, 2, 3
```

## Step 4 - A simple and useful `Calculator`

📑 Description:

Let's go further now!

The objective of this fifth exercise is to create a simplifying calculator.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okey, I like the exercice, but you should give more details, like a graphical calculator, a interactive calculator in the terminal? You need to be the most precise possible.


📌 Tasks:

- Create a file `calculator.zig` for this new function.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't forget to specify that he should create in a src folder, etc


To do this, you have to make a calculator that can do:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That can do is very vast, you should give more details about the exercise. For example:

For this step you will create a interactive calculator that will take a first number, then the operation and finally the second number and once you have all the information, compute all that and print the result.

This is only an example, be more detailed.


- `Addition`
- `Multiplication`
- `Division`
- `Subtraction`

- between two values that must be retrieved one after the other from the user's input.

> 💡 Pay attention to your error handling !

- Display the result of the calculation in your terminal.

📚 Documentation:
-[Errors](https://ziglang.org/documentation/master/#Errors)
-[Memory](https://zig.guide/standard-library/allocators)
-[ArrayList](https://zig.guide/standard-library/arraylist)

✔️ Validation:

You should get something like this :

```sh
First number: 5
Operation: +
Second number: 3
8
```

Here's a typical error handeling example :

```sh
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe the error message should occur instantly after he enters the information instead of waiting till he finishes.

First number: abc
Operation: +
Second number: 3
Expected Output: Error message indicating invalid input.
```

## Bonuses - TO DO List and C Code translation

### TO DO List

📑 Description:

Now that you're used to the basics, you will do a little project to apply what you've learnt so far.

📌 Tasks:

Create a command-line todo list application where you can:

- Add a new todo
- Delete a todo by ID
- View all todos

Each todo should have at least three fields:

- id (auto-incremented)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should precise the type of each field.

- name
- description

> 💡 To easily test your functions during this workshop remember to check the testing tools mentioned above

📚 Documentation:

- [New function](https://ziglang.org/documentation/master/#Functions)
- [The types in Zig](https://ziglang.org/documentation/master/#Primitive-Types)

✔️ Validation:

```sh
./zig-out/bin/main

Choose an action:
1. Add Todo
2. Delete Todo
3. View Todos
4. Exit
> 1
Enter name: Buy groceries
Enter description: Milk, eggs, and bread
Todo added successfully.
```

```sh
Choose an action:
5. Add Todo
6. Delete Todo
7. View Todos
8. Exit
> 3
ID: 1, Name: Buy groceries, Description: Milk, eggs, and bread
Choose an action:
9. Add Todo
10. Delete Todo
11. View Todos
12. Exit
> 4
```

> 💡 Pay attention to your error handling !

### Use The C Translation tool

📑 Description:

Zig provides the command zig translate-c for automatic translation from C source code. You can try to read the documentation and have fun with the tool.

📚 Documentation:

-[Translate-C](https://zig.guide/working-with-c/translate-c)
-[cImport](https://zig.guide/working-with-c/c-import)
-[LinkLibC](https://zig.guide/working-with-c/linking-libc)

## Conclusion

Well done ! You've accomplished a lot with the Zig Workshop, and there is so much more to discover. Refer to the official documentation to deep-dive into it.

Hope you enjoyed the workshop!

## Authors

- Elie STROUN
- Pierre LISSOPE

> 🚀 Follow us on our different social networks, and put a star 🌟 on `PoC's` repositories.
70 changes: 70 additions & 0 deletions software/32.Zig/SETUP.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# Installing Zig

## For Fedora

Since most students use Fedora, installing Zig is very simple. Just open a terminal and run the following command:

```sh
sudo dnf install zig
```

### For other operating systems

- Visit the official Zig website: ziglang.org.

### to check installation

```sh
zig version
```

## Initializing a Zig Project

### Step 1: Create a new project

To create a new Zig project, open a terminal and navigate to the directory where you wish to create your project. Then run the following command:

```sh
zig init
```

This command will create a basic project structure with the necessary files.

### Step 2: Explore the project structure

Once the project has been created, you'll see the following structure:

```css
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why css, just use sh

.
├── build.zig
├── build.zig.zon
└── src
├── main.zig
└── root.zig
```

- build.zig: This file is a build script for your Zig project.
- src/main.zig: This is the entry point for your Zig program.
- src/root.zig: This is a sub-file of example (don't worry if you don't have it).

### Step 3: Compile and run the project

To compile your project, run the following command in your project directory:

```sh
zig build
```

After compilation, a binary will be generated in the zig-out/bin folder (it may be called something different depending on the name of your folder). To run this binary, use the following command:

```sh
./zig-out/bin/main
```

You should see the messages:
"All your codebase are belong to us.
Run `zig build test` to run the tests." are displayed, indicating that your project has been correctly configured and compiled.

### Next step

Now that your basic project is ready, let's explore the basic concepts of the Zig language and develop a palindrome detection program.
Empty file added software/32.Zig/gitkeep
Empty file.
Loading