<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: VanPonasenkov</title>
    <description>The latest articles on DEV Community by VanPonasenkov (@ernestvonmoscow).</description>
    <link>https://dev.to/ernestvonmoscow</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F834478%2F4d18caa4-176c-4c46-b77f-a36aa1176053.png</url>
      <title>DEV Community: VanPonasenkov</title>
      <link>https://dev.to/ernestvonmoscow</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ernestvonmoscow"/>
    <language>en</language>
    <item>
      <title>C - Unsafe!</title>
      <dc:creator>VanPonasenkov</dc:creator>
      <pubDate>Wed, 13 Apr 2022 22:13:52 +0000</pubDate>
      <link>https://dev.to/ernestvonmoscow/c-unsafe-1kh2</link>
      <guid>https://dev.to/ernestvonmoscow/c-unsafe-1kh2</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;You've probably heard many times by now that is C is not a memory safe language, and that is absolutely correct. Buffer overflows all over the place, memory leaks, and SEGFAULT had even become a taboo. In this small article we're gonna show you some unsafe C code, and we're going to rewrite it in Rust.&lt;/p&gt;

&lt;h1&gt;
  
  
  The problem
&lt;/h1&gt;

&lt;p&gt;Consider this code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// lifetimetest.c

#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

char*
longest(char* a, char* b)
{
    if(strlen(a) &amp;gt; strlen(b)){
        return a;
    }
    return b;
}

main(void)
{
    char a[] = "Hello";
    char b[] = "KosherFoods";
    char* res;

    res = longest(a, b);
    printf("%s", res);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we define the function &lt;code&gt;longest&lt;/code&gt; which takes two character pointers (Essentially strings) and it returns the longer string.&lt;/p&gt;

&lt;p&gt;if you compile and run this program:&lt;br&gt;
&lt;code&gt;$ gcc lifetimetest.c -o lft.out &amp;amp;&amp;amp; ./lft.out&lt;/code&gt; &lt;br&gt;
you should get this output:&lt;br&gt;
&lt;code&gt;KosherFoods&lt;/code&gt;&lt;br&gt;
Which is what we expected&lt;/p&gt;

&lt;p&gt;now let's rewrite this program slightly&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

char*
longest(char* a, char* b)
{
    if(strlen(a) &amp;gt; strlen(b)){
        return a;
    }
    return b;
}

main(void)
{
    char a[] = "Hello";
    char* res;
    {
        char b[] = "KosherFoods";
        res = longest(a, b);
    }

    printf("%s", res);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we moved &lt;code&gt;b&lt;/code&gt; into a different scope&lt;br&gt;
if you compile and run this program:&lt;br&gt;
&lt;code&gt;$ gcc lifetimetest.c -o lft.out &amp;amp;&amp;amp; ./lft.out&lt;/code&gt; &lt;br&gt;
you should get this output:&lt;br&gt;
&lt;code&gt;KosherFoods&lt;/code&gt;&lt;br&gt;
Nothing peculiar so far.&lt;/p&gt;

&lt;p&gt;Let's rewrite the program once again!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

char*
longest(char* a, char* b)
{
    if(strlen(a) &amp;gt; strlen(b)){
        return a;
    }
    return b;
}

main(void)
{
    char a[] = "Hello";
    char* res;
    {
        char b[] = "KosherFoods";
        res = longest(a, b);
    }
    char ohnoo[] = "Plan 9 from User Space";
    printf("%s", res);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we declared a new string variable after the second scope&lt;br&gt;
if you compile and run this program:&lt;br&gt;
&lt;code&gt;$ gcc lifetimetest.c -o lft.out &amp;amp;&amp;amp; ./lft.out&lt;/code&gt; &lt;br&gt;
you should get this output:&lt;br&gt;
&lt;code&gt;Plan 9 from User Space&lt;/code&gt;&lt;br&gt;
But.... How could this Happen?&lt;/p&gt;
&lt;h1&gt;
  
  
  Explanation
&lt;/h1&gt;

&lt;p&gt;In C, strings are essentially character arrays, and the variables that "store" those strings are just pointers to the start of the array.&lt;/p&gt;

&lt;p&gt;So &lt;code&gt;longest&lt;/code&gt; doesn't return the copy of the string, but rather, the pointer to the start of the string in memory. With this in mind let's continue. When we declare the variable &lt;code&gt;b&lt;/code&gt; in the inner scope it gets put in the memory of that scope, but once the scope closes it gets freed, this means that any other variable can be put in the memory where &lt;code&gt;b&lt;/code&gt; once was. so &lt;code&gt;res&lt;/code&gt; still points to let's say &lt;code&gt;0x000004&lt;/code&gt; (Where &lt;code&gt;b&lt;/code&gt; once was), but now &lt;code&gt;0x000004&lt;/code&gt; is the start of the &lt;code&gt;ohnoo&lt;/code&gt; string.&lt;/p&gt;
&lt;h1&gt;
  
  
  Rewrite in Rust
&lt;/h1&gt;

&lt;p&gt;Let's discuss a couple of things before moving on to the implementation. In Rust there is a term "Lifetime", it's means, well.. the lifetime of a reference and it prevents dangling references. with that in mind let's continue.&lt;/p&gt;

&lt;p&gt;First let's implement the longest function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fn longest&amp;lt;'a&amp;gt;(a: &amp;amp;'a str, b: &amp;amp;'a str) -&amp;gt; &amp;amp;'a str {
    if a.len() &amp;gt; b.len() {
        a
    } else {
        b
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here &lt;code&gt;'a&lt;/code&gt; is the lifetime specifier, which means that both of these parameters must live at least as long as &lt;code&gt;'a&lt;/code&gt;, with this in mind let's continue.&lt;/p&gt;

&lt;p&gt;Consider this code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fn main() {
    let a = String::from("APCHIHBALONGERSTRING");
    let result: &amp;amp;str;
    {
        let b = String::from("Banana");
        result = longest(a.as_str(), b.as_str());
        println!("Longest: {}", result);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we type:&lt;br&gt;
&lt;code&gt;$ cargo run&lt;/code&gt;&lt;br&gt;
we should get the following output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/lifetime_test`
Longest: APCHIHBALONGERSTRING
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;as you can the rust compiler didn't complain.&lt;br&gt;
Now let's try using the lower lifetime borrow in the higher lifetime:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fn main() {
    let a = String::from("APCHIHBALONGERSTRING");
    let result: &amp;amp;str;
    {
        let b = String::from("Banana");
        result = longest(a.as_str(), b.as_str());
    }
    println!("Longest: {}", result);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we type:&lt;br&gt;
&lt;code&gt;cargo run&lt;/code&gt;&lt;br&gt;
We should get the following output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Compiling lifetime_test v0.1.0 (/home/ernest/projects/lifetime_test)
error[E0597]: `b` does not live long enough
  --&amp;gt; src/main.rs:14:38
   |
14 |         result = longest(a.as_str(), b.as_str());
   |                                      ^^^^^^^^^^ borrowed value does not live long enough
15 |     }
   |     - `b` dropped here while still borrowed
16 |     println!("Longest: {}", result);
   |                             ------ borrow later used here

For more information about this error, try `rustc --explain E0597`.
error: could not compile `lifetime_test` due to previous error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This happens because we borrow the reference to &lt;code&gt;b&lt;/code&gt;, but later we drop it (By exiting the scope) thus making the use of &lt;code&gt;result&lt;/code&gt; in the outer scope (Higher lifetime) invalid.&lt;br&gt;
As a result, we can't get the same undefined behaviour as we did in C, unless you're explicitly using the &lt;code&gt;unsafe&lt;/code&gt; keyword.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;In this article we provided an example of why C is dangerous and tricky to use. We've provided an example of the same Rust code and showed how Rust deals with such problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Note
&lt;/h3&gt;

&lt;p&gt;Whilst i like Rust and i think it is great for low level things like: Audio libraries, video game engines, web servers, etc., i still don't think it's a good idea to rewrite even parts of the operating systems in Rust&lt;/p&gt;

&lt;h1&gt;
  
  
  Further Reading
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html"&gt;https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html"&gt;https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rust-lang.org/"&gt;https://www.rust-lang.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>rust</category>
      <category>c</category>
      <category>security</category>
      <category>cpp</category>
    </item>
    <item>
      <title>Suck Less - Minimalism and Simplicity</title>
      <dc:creator>VanPonasenkov</dc:creator>
      <pubDate>Sun, 03 Apr 2022 21:00:38 +0000</pubDate>
      <link>https://dev.to/ernestvonmoscow/suck-less-what-software-should-do-58pa</link>
      <guid>https://dev.to/ernestvonmoscow/suck-less-what-software-should-do-58pa</guid>
      <description>&lt;h2&gt;
  
  
  Introduction:
&lt;/h2&gt;

&lt;p&gt;Have you ever heard about &lt;a href="https://suckless.org"&gt;suckless&lt;/a&gt; and their philosophy? If no, then this article is just for you!&lt;/p&gt;

&lt;h2&gt;
  
  
  Brief Talk:
&lt;/h2&gt;

&lt;p&gt;Suckless is a famous community in the GNU/Linux world, primarily because of their philosophy and software.&lt;/p&gt;

&lt;p&gt;The name is essentially a call-out to software developers that their software, well.. Should &lt;strong&gt;Suck Less&lt;/strong&gt;. But what does it mean to suck less? Let's find out.&lt;/p&gt;

&lt;h2&gt;
  
  
  History:
&lt;/h2&gt;

&lt;p&gt;Suckless started out as a local community of developers in 2002, which eventually grew and became more wide-known in 2006-2012. Nowadays it's a relatively large community among GNU/Linux folks and is admired by many.&lt;/p&gt;

&lt;h2&gt;
  
  
  Achievements:
&lt;/h2&gt;

&lt;p&gt;Their main achievements are programs such as: DWM (Dynamic Window Manager), ST (Simple Terminal), II (Irc It), etc.&lt;/p&gt;

&lt;p&gt;What makes them so good is that they provide the bare minimum for a functioning app, and let the user easily extend/configure the functionality by directly changing the source code.&lt;/p&gt;

&lt;p&gt;A great example of this would be the previously mentioned DWM. It contains only 2000 Significant Lines of Code (I.E meaningful lines of code. So things like curly braces, empty new lines, don't count as such) which makes it very easy to change the code without breaking stuff. Its existing functionality is configured via the "config.h" file, and extended via &lt;a href="https://dwm.suckless.org/customisation/patches_in_git/"&gt;patching&lt;/a&gt; (or diffing) the "dwm.c" file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Philosophy:
&lt;/h2&gt;

&lt;p&gt;They adhere to the &lt;a href="https://en.wikipedia.org/wiki/Unix_philosophy"&gt;Unix Philosophy&lt;/a&gt; of doing one thing, and doing it well.&lt;/p&gt;

&lt;p&gt;They focus on simplicity, clarity and keeping things minimal.&lt;/p&gt;

&lt;p&gt;They believe that most coders these days think that writing more lines of code results in bigger progress, bigger progress means bigger skill, suckless states that it's simply a delusion. What they say instead is that minimalism sets attainable goals and as such, makes development and extending easier.&lt;/p&gt;

&lt;p&gt;A Quote from their own website:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ingenious ideas are simple. Ingenious software is simple. Simplicity is the heart of the Unix philosophy. The more code lines you have removed, the more progress you have made. As the number of lines of code in your software shrinks, the more skilled you have become and the less your software sucks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Miscellaneous:
&lt;/h2&gt;

&lt;p&gt;They host a list of software that &lt;a href="https://suckless.org/sucks/"&gt;sucks&lt;/a&gt; (Which is bad, duh), and a list of software that &lt;a href="https://suckless.org/rocks/"&gt;rocks&lt;/a&gt; (Which is good, duh).&lt;br&gt;
Suckless also gives &lt;a href="https://suckless.org/coding_style/"&gt;coding style guidelines&lt;/a&gt; which are supposed to make your code more readable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;To wrap things up, let's recap on things that make your software &lt;em&gt;suck less&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simplicity, Clarity and Minimalism&lt;/li&gt;
&lt;li&gt;Extensibility&lt;/li&gt;
&lt;li&gt;Doing one thing, and doing it well&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for Reading!&lt;/p&gt;

&lt;h2&gt;
  
  
  Links and Further Reading:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://suckless.org"&gt;https://suckless.org&lt;/a&gt;&lt;br&gt;
&lt;a href="https://suckless.org/coding_style"&gt;https://suckless.org/coding_style&lt;/a&gt;&lt;br&gt;
&lt;a href="https://suckless.org/philosophy/"&gt;https://suckless.org/philosophy/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://suckless.org/rocks/"&gt;https://suckless.org/rocks/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://suckless.org/sucks/"&gt;https://suckless.org/sucks/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>linux</category>
      <category>minimalism</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Exceptions - A Bad Turn of Fate</title>
      <dc:creator>VanPonasenkov</dc:creator>
      <pubDate>Wed, 23 Mar 2022 18:22:02 +0000</pubDate>
      <link>https://dev.to/ernestvonmoscow/exceptions-a-bad-turn-of-fate-k8b</link>
      <guid>https://dev.to/ernestvonmoscow/exceptions-a-bad-turn-of-fate-k8b</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;You've all heard about exceptions. They are the basis of error handling in most modern OOP languages, examples being Java, JS, C++ . But  are they as friendly as they are presented to us? let's find out in this article.&lt;/p&gt;

&lt;h1&gt;
  
  
  Origins of Exceptions
&lt;/h1&gt;

&lt;p&gt;The Idea of exceptions originated back in the 1960/70's in early implementations of lisp, most notably in Lisp 1.5, where the ERRSET function was used for controlled execution of  fallible code. Later lisp versions built on top of this idea, adding the TRY and CATCH primitives. But at that point it had already caught on and other programming languages were starting to implement it as well.&lt;/p&gt;

&lt;h1&gt;
  
  
  Exceptions in Modern Programming Languages
&lt;/h1&gt;

&lt;p&gt;Exceptions in Java, C++, C#, etc., are represented using default or custom exception classes, which can be created and thrown by the programmer. This allows for a very easy and cheap (In terms of productivity) error handling pattern, but is it as good as people say it is?&lt;/p&gt;

&lt;h1&gt;
  
  
  Criticism of Exceptions
&lt;/h1&gt;

&lt;p&gt;There are lots of criticism for this error handling pattern, but let's point out a few most significant ones.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NO-OP exception handlers. What i mean by this are exception     handlers which are made solely for the purpose of mandatory exception checking. An Example of this behaviour would be:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;try {
  code_that_might_fail();
}
catch(Exception e) { // no code here }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Whilst they aren't too bad if you use them a couple of times here and there, once the codebase becomes bigger they make the program harder to read. It becomes more apparent after writing Java for some time, Because Java forces you to handle every possible exception point and it becomes a liability.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Developing from the previous point, it's hard to catch all exceptions without an IDE. If you aren't using a full-fledged IDE, or if you're using something simple like VIM or Emacs, your development time will increase as a result of compile or runtime crashes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Binary size bloating. A very simple point with little-to-no need in explanation. Modern exception handling isn't native to our architectures, So as a result it causes binaries to become bloated. it is not a problem when for example, you're writing a web-server, but can become a real issue when writing something as low-level as an operating system, or a driver.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  But... Is there a better way to do Errors?
&lt;/h1&gt;

&lt;p&gt;The answer is... Most likely! One of the alternatives to exceptions are error values. They're implemented in a very crude way in C, usually by returning NULL from a function. Some modern programming languages expand on this idea. 2 Most prominent examples would be Go and Zig.&lt;/p&gt;

&lt;h2&gt;
  
  
  Go
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://go.dev/"&gt;Go&lt;/a&gt; is a statically typed, compiled programming language designed at Google. Among other design decisions, The Go team decided to use error values, instead of exceptions. Prior to this, Google banned the use of exceptions in their C++ Code. The way you check for errors in Go is something like the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;val, err := function_that_might_fail()
if err != nil {
  print("Unfortunately our production servers are burning")
} // the error handling part, nil being the null value in Go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see error handling in Go is really straightforward, it fixes all of the above problems of exception handling. It is easy to represent error values internally (Fixes problem 3). It is easy to omit handling the error (Fixes problem 1, 2). A good example of this would be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;val, _ = function_that_might_fail_but_itsfine()
// no error check, Go compiler and the Runtime does not complain
// even if the function returns an error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Go also introduces the defer keyword, which puts the execution of a statement at the end of a scope. It means if you open any resource and then you check for an error, you don't need to close the resource in both branches, thus, making the code clearer. example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;file, err := open_file_posix_is_cool(999)
if err != nil {
   print("Logging to our super secret database")
   return err
}
defer close_file_posix_is_cool(file)

file2, err := open_file_posix_is_cool(998)
if err != nil {
   print("Logging to our super secret database")
   return err
}
defer close_file_posix_is_cool(file2)

file3, err := open_file_posix_is_cool(2048)
if err != nil {
   print("Logging to our super secret database")
   return err
}
defer close_file_posix_is_cool(file3)

// resources are going to be properly cleaned up even if an error in one of the branches would occur
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Zig
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ziglang.org/"&gt;Zig&lt;/a&gt; is an imperative, general-purpose, statically typed, compiled system programming language designed by Andrew Kelley. Zig error values are very similar to that of Go, But they differ in some slight ways. Zig also introduces exhaustive switch statement for error sets, and keywords like try and catch (Not to be confused with try/catch in C++, Java). the try keyword checks if the given expression evaluates to an error, and if it does, returns the error from the function. catch keyword is used for giving the code to be executed in case an error was evaluated from the given expression.&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;To wrap things up, let's answer the question given in the introduction - are exceptions as friendly as they are presented to us? from this article we've learnt that the answer is no, and there are good reasons for that. But we've also found an alternative error handling method and showed how it solves shortcomings of exceptions.&lt;/p&gt;

&lt;h1&gt;
  
  
  Links, References, and further Reading
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://go.dev/"&gt;https://go.dev/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ziglang.org/"&gt;https://ziglang.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.softwarepreservation.org/projects/LISP/MIT/White-NIL_A_Perspective-1979.pdf"&gt;http://www.softwarepreservation.org/projects/LISP/MIT/White-NIL_A_Perspective-1979.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Exception_handling"&gt;https://en.wikipedia.org/wiki/Exception_handling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pixabay.com/vectors/error-warning-computer-crash-6641731/"&gt;https://pixabay.com/vectors/error-warning-computer-crash-6641731/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
