diff options
author | Christian Cleberg <hello@cleberg.net> | 2024-03-29 01:30:23 -0500 |
---|---|---|
committer | Christian Cleberg <hello@cleberg.net> | 2024-03-29 01:30:23 -0500 |
commit | 41bd0ad58e44244fe67cb36e066d4bb68738516f (patch) | |
tree | 205e844650144648e58700df2b632c89298904d4 /content/blog/2023-02-02-exploring-hare.org | |
parent | 797a1404213173791a5f4126a77ad383ceb00064 (diff) | |
download | cleberg.net-41bd0ad58e44244fe67cb36e066d4bb68738516f.tar.gz cleberg.net-41bd0ad58e44244fe67cb36e066d4bb68738516f.tar.bz2 cleberg.net-41bd0ad58e44244fe67cb36e066d4bb68738516f.zip |
massive re-write from org-publish to weblorg
Diffstat (limited to 'content/blog/2023-02-02-exploring-hare.org')
-rw-r--r-- | content/blog/2023-02-02-exploring-hare.org | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/content/blog/2023-02-02-exploring-hare.org b/content/blog/2023-02-02-exploring-hare.org new file mode 100644 index 0000000..749e46f --- /dev/null +++ b/content/blog/2023-02-02-exploring-hare.org @@ -0,0 +1,169 @@ +#+title: Exploring the Hare Programming Language +#+date: 2023-02-02 +#+description: A retrospective on my first time using the Hare Programming Language. +#+filetags: :dev: + +* 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 [[https://harelang.org][Hare]] 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: + +#+begin_quote +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. + +#+end_quote + +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. + +#+begin_src sh +doas apk add hare hare-doc +#+end_src + +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 [[https://harelang.org/installation/][Hare Installation]] page. + +** Creating a Test Project +In order to play with the language, I created +[[https://git.sr.ht/~cmc/hare-projects][hare-test]] and will be putting +any of my Hare-related adventures in here. + +#+begin_quote +*Update:** I also created a simple Hare program for creating a file from +user input: +[[https://git.sr.ht/~cmc/hare-projects/tree/main/item/files/files.ha][files.ha]] + +#+end_quote + +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. + +#+begin_src sh +nano rgb.ha +#+end_src + +Within this file, I was able to easily import a few of the +[[https://harelang.org/tutorials/stdlib/][standard library modules]]: +=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. + +#+begin_quote +*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. + +#+end_quote + +#+begin_src 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; +}; +#+end_src + +** Running a Program +Once you have a Hare file written and ready to run, you simply need to +run it: + +#+begin_src sh +hare run file.ha +#+end_src + +You can also compile the program into an executable: + +#+begin_src sh +hare build -o example file.ha +./example +#+end_src + +** 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 + [[https://git.sr.ht/~sircmpwn/hare/tree/master/item/math/random/random.ha][Hare + source code]] 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. |