aboutsummaryrefslogtreecommitdiff
path: root/content/blog/2023-02-02-exploring-hare.md
diff options
context:
space:
mode:
authorChristian Cleberg <hello@cleberg.net>2024-01-08 20:11:17 -0600
committerChristian Cleberg <hello@cleberg.net>2024-01-08 20:11:17 -0600
commit25945b8fead989cca09a23983623b63ce36dcc0c (patch)
tree0dfc869ce8b028e04ce9da196af08779780915ce /content/blog/2023-02-02-exploring-hare.md
parent22b526be60bf4257c2a1d58a5fad59cf6b044375 (diff)
downloadcleberg.net-25945b8fead989cca09a23983623b63ce36dcc0c.tar.gz
cleberg.net-25945b8fead989cca09a23983623b63ce36dcc0c.tar.bz2
cleberg.net-25945b8fead989cca09a23983623b63ce36dcc0c.zip
feat: total re-write from Emacs org-mode to Zola markdown
Diffstat (limited to 'content/blog/2023-02-02-exploring-hare.md')
-rw-r--r--content/blog/2023-02-02-exploring-hare.md171
1 files changed, 171 insertions, 0 deletions
diff --git a/content/blog/2023-02-02-exploring-hare.md b/content/blog/2023-02-02-exploring-hare.md
new file mode 100644
index 0000000..42d90aa
--- /dev/null
+++ b/content/blog/2023-02-02-exploring-hare.md
@@ -0,0 +1,171 @@
++++
+date = 2023-02-02
+title = "Exploring the Hare Programming Language"
+description = "A retrospective on my first time using the Hare Programming Language."
++++
+
+## A Quick Note
+
+By no means am I a professional developer, so this post will be rather
+short. I won't be going into depth on the specification or anything
+that technical.
+
+Instead, I will simply be talking about how I (a relatively basic
+hobbyist programmer) have been playing with Hare and what intrigues me
+about the language.
+
+## Hare
+
+The [Hare](https://harelang.org) programming language is a
+straightforward language that should look familiar if you've ever
+programmed with C, Rust, or other languages that aim to build software
+at the system-level.
+
+The Hare homepage states the following:
+
+> Hare is a systems programming language designed to be simple, stable,
+> and robust. Hare uses a static type system, manual memory management,
+> and minimal runtime. It is well-suited to writing operating systems,
+> system tools, compilers, networking software, and other low-level,
+> high performance tasks.
+
+I have found this all to be true while playing with it for the first
+time today. In the next few sections, I'm going to walk through my
+installation and first program.
+
+### Installation
+
+I'm currently running Alpine Linux on my Thinkpad, so the installation
+was quite easy as there is a package for Hare in the `apk`
+repositories.
+
+```sh
+doas apk add hare hare-doc
+```
+
+However, I was able to install Hare from scratch on Fedora Linux a short
+while ago, which was also very easy to do. If you need further
+instructions and Hare doesn't have a package on your system, take a
+look at the [Hare Installation](https://harelang.org/installation/)
+page.
+
+### Creating a Test Project
+
+In order to play with the language, I created
+[hare-test](https://git.sr.ht/~cmc/hare-projects) and will be putting
+any of my Hare-related adventures in here.
+
+> **Update:** I also created a simple Hare program for creating a file
+> from user input:
+> [files.ha](https://git.sr.ht/~cmc/hare-projects/tree/main/item/files/files.ha)
+
+Luckily, Hare doesn't require any complex set-up tools or build
+environment. Once you have Hare installed, you simply need to create a
+file ending with `.ha` and you can run a Hare program.
+
+I created a file called `rgb.ha` in order to test out the
+random number generation and passing parameters between functions.
+
+```sh
+nano rgb.ha
+```
+
+Within this file, I was able to easily import a few of the [standard
+library modules](https://harelang.org/tutorials/stdlib/):
+`fmt`, `math::random`, and `datetime`.
+
+With these modules, I created two functions:
+
+1. `main`: This function calls the `generate_rgb`
+ function and then prints out the returned values.
+2. `generate_rgb`: This function uses the current Unix epoch
+ time to generate a pseudo-random value and uses this value to create
+ three more random values between 0 and 255. These three numbers
+ represent a color in RGB format.
+
+> **Note**: Some syntax coloring may look odd, as Zola currently
+> doesn't have a syntax highlighting theme for Hare. Instead, I'm
+> using the C theme, which may not be exactly accurate when coloring the
+> code below.
+
+```c
+use datetime;
+use fmt;
+use math::random;
+
+export fn main() void = {
+ const rgb = generate_rgb();
+ fmt::printfln("RGB: ({}, {}, {})", rgb[0], rgb[1], rgb[2])!;
+};
+
+fn generate_rgb() []u64 = {
+ // Use the current Unix epoch time as the seed value
+ let datetime = datetime::epochunix(&datetime::now());
+
+ // Generate initial pseudo-random value
+ // You must cast the datetime from int to u64
+ let x = random::init(datetime: u64);
+
+ // Generate RGB values between (0, 255) using pseudo-random init value
+ let r = random::u64n(&x, 255);
+ let g = random::u64n(&x, 255);
+ let b = random::u64n(&x, 255);
+
+ // Structure data as array and return
+ let rgb_array: [3]u64 = [r, g, b];
+ return rgb_array;
+};
+```
+
+### Running a Program
+
+Once you have a Hare file written and ready to run, you simply need to
+run it:
+
+```sh
+hare run file.ha
+```
+
+You can also compile the program into an executable:
+
+```sh
+hare build -o example file.ha
+./example
+```
+
+### Initial Thoughts
+
+1. Documentation Improvements Would Help
+
+ While I was able to piece everything together eventually, the
+ biggest downfall right now in Hare's documentation. For such a new
+ project, the documentation is in a great spot. However, bare
+ specifications don't help as much as a brief examples section
+ would.
+
+ For example, it took me a while to figure out what the
+ `u64n` function was looking for. I could tell that it
+ took two parameters and the second was my max value (255), but
+ couldn't figure out what the first value should be. Eventually, I
+ inspected the `random.ha` file in the [Hare source
+ code](https://git.sr.ht/~sircmpwn/hare/tree/master/item/math/random/random.ha)
+ and found the test suite that helped me discover that it needed an
+ `init()` value in the form of `&var`.
+
+2. More Basic Modules
+
+ This is another point that comes from Hare being new and awaiting
+ more contributions, but there are some basic functions that I would
+ personally enjoy seeing in Hare, such as one to convert decimal
+ (base 10) values to hexadecimal (base 16).
+
+ If I'm feeling comfortable with my math, I may work on the list of
+ functions I want and see if any can make it into the Hare source
+ code.
+
+3. Overall Thoughts
+
+ Overall, I actually really enjoy Hare. It's not as tedious to get a
+ project up and running as Rust, but it's also simpler and more
+ user-friendly than learning C. I am going to continue playing with
+ it and see if I can make anything of particular value.