<?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>Forem: Electrux</title>
    <description>The latest articles on Forem by Electrux (@electrux).</description>
    <link>https://forem.com/electrux</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%2F238269%2F729d844d-a32a-42ae-9103-298b764ff5d0.png</url>
      <title>Forem: Electrux</title>
      <link>https://forem.com/electrux</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/electrux"/>
    <language>en</language>
    <item>
      <title>The Feral Programming Language</title>
      <dc:creator>Electrux</dc:creator>
      <pubDate>Mon, 06 Apr 2020 21:14:53 +0000</pubDate>
      <link>https://forem.com/electrux/the-feral-programming-language-44pc</link>
      <guid>https://forem.com/electrux/the-feral-programming-language-44pc</guid>
      <description>&lt;p&gt;Hey everyone! I'd like to introduce and share a programming language I have been working on - &lt;a href="https://github.com/Feral-Lang/Feral"&gt;Feral&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Boring Bookish Description
&lt;/h1&gt;

&lt;p&gt;In essence, Feral is an interpreted, procedural, dynamically typed programming language which is meant primarily for scripting, and is minimalistic such that one can learn the entire language in a single day.&lt;/p&gt;

&lt;p&gt;Yep. That was quite boring. Let's make it interesting.&lt;/p&gt;

&lt;h1&gt;
  
  
  Some Background
&lt;/h1&gt;

&lt;p&gt;Recently, about a couple months ago, while I was writing some scripts at work in Python, I realized that I absolutely dislike its syntax (no hate to my fellow python developers ❤️). So, I started thinking about the language that I'd enjoy using &lt;em&gt;myself&lt;/em&gt;. I started scribbling the syntax and eventually settled on something I actually liked.&lt;/p&gt;

&lt;p&gt;I also thought of some ideas that would perhaps be fascinating to implement. And that was it! I also came up with the name Feral for 2 simple reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It's such a beautiful word&lt;/li&gt;
&lt;li&gt;It's &lt;strong&gt;wild&lt;/strong&gt; - powerful and fast!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Armed with the ideas and motivation (&lt;em&gt;and a borderline obsession&lt;/em&gt;) for creating the language, I started working on Feral - the minimalistic, interpreted programming language.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Language
&lt;/h1&gt;

&lt;p&gt;Hmm... Remember I said Feral is minimalistic? Well, I most certainly &lt;strong&gt;meant&lt;/strong&gt; it! Feral does not contain any special syntax for structures, enumerations, maps/dictionaries, or even vectors/lists. Heck, there is no special syntax for even importing other source files.&lt;/p&gt;

&lt;p&gt;Do note that I said it didn’t &lt;em&gt;contain special syntax&lt;/em&gt; for those things. I did not say that it doesn’t &lt;em&gt;support&lt;/em&gt; them. Feral does support all of those concepts. However, instead of relying on special syntax on the language side, it provides functions with which the same functionality is created while having far less core compiler codebase.&lt;/p&gt;

&lt;p&gt;Feral contains an &lt;code&gt;import()&lt;/code&gt; function which allows the user to import other Feral sources, instead of relying on an &lt;code&gt;import&lt;/code&gt; keyword that most other languages have. Similarly, structures are created using a &lt;code&gt;lang.struct()&lt;/code&gt; function and enumerations are created using &lt;code&gt;lang.enum()&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;Feral also has first-class support for modules and functions! And not just that, even structures are first-class citizens in Feral (in a way, we’ll see how, below).&lt;/p&gt;

&lt;p&gt;In Feral, the modules (cool way of saying “other feral sources”) are loaded as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"std/io"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basically, &lt;strong&gt;io&lt;/strong&gt; is now a variable which can be passed to functions, returned from functions, reassigned to another value, and so on. Basically, it has all the functionality of any other variable!&lt;/p&gt;

&lt;p&gt;Similarly, to create a structure (&lt;strong&gt;not&lt;/strong&gt; an instance/object of structure), the &lt;code&gt;lang.struct()&lt;/code&gt; function is used as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;lang&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"std/lang"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;my_struct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="nf"&gt;.struct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, just call &lt;code&gt;my_struct&lt;/code&gt; as a function to create an instance of that struct. Cool, right?!&lt;/p&gt;

&lt;p&gt;Even functions themselves are Feral &lt;em&gt;values&lt;/em&gt; which can be assigned to variables and passed around to other functions (callbacks). So, say you want to make a &lt;code&gt;sort&lt;/code&gt; function and pass the sorting comparison mechanism separately, as a function itself? Check! (Although, for the love of everything holy, please don’t overuse callbacks... ever!)&lt;/p&gt;

&lt;p&gt;In Feral, as with many other interpreted languages, one can write functions and types in C++ (host language) as C++ runtime loaded modules, or as Feral functions themselves. The simple thought for deciding which one to use is to only go the C++ route if the function requires high performance, otherwise Feral functions will satisfy most of the cases.&lt;/p&gt;

&lt;p&gt;By the way, the operators are functions too! So, something like this definitely possible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"std/io"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="s"&gt;"**"&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;str_t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="nf"&gt;.println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"5"&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, the &lt;code&gt;**&lt;/code&gt; (power operator in Feral) is made to work as a repetition operator for strings! &lt;code&gt;str_t&lt;/code&gt; is the (special) type variable for strings.&lt;/p&gt;

&lt;p&gt;Feral's documentation is a work in progress, and can be read here: &lt;a href="https://feral-lang.github.io/Book/"&gt;Feral-Lang/Book&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Syntax Highlighting
&lt;/h1&gt;

&lt;p&gt;I don’t know about you, but I most certainly can’t live without it. I need my language syntax to be highlighted by colors after all, otherwise it would look too dull and boring!!&lt;/p&gt;

&lt;p&gt;Keeping that in mind, I have also created simple syntax highlighting extensions for &lt;strong&gt;Visual Studio Code&lt;/strong&gt; and &lt;strong&gt;(Neo)vim&lt;/strong&gt; (links at the bottom).&lt;/p&gt;

&lt;h1&gt;
  
  
  Some Technical Details
&lt;/h1&gt;

&lt;p&gt;This is a post of a programming language, on a website for developers. What fun would it be if there were no technical details!&lt;/p&gt;

&lt;p&gt;Since Feral is an interpreted language, it required a host language which would be, ideally, natively compiled. For me, C++(&lt;strong&gt;11&lt;/strong&gt;) was a no brainer here since it is natively compiled, outrageously fast, and I love to use it (I dare you to sway me to another language!).&lt;/p&gt;

&lt;p&gt;As a matter of fact, the only issue I have with writing C++ code, is regarding the build system — I spent a lot of time trying to understand how to get my work done with CMakeLists. I don’t hate CMake, but it can get annoying to get its configuration right. Alas, it does work pretty well and is ubiquitously available, so CMake it was!&lt;/p&gt;

&lt;p&gt;For the language implementation itself, the Lexer was nothing special, the parser on the other hand, I am quite happy to have made a Recursive-Descent Parser, and the code looks so beautiful and clean (come on, let me brag a bit! 😉). I definitely recommend it if it works for your language syntax.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;
&lt;span class="c1"&gt;// Left Associative&lt;/span&gt;
&lt;span class="c1"&gt;// / * % **&lt;/span&gt;
&lt;span class="n"&gt;Errors&lt;/span&gt; &lt;span class="nf"&gt;parse_expr_04&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;phelper_t&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;ph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stmt_base_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;loc&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;stmt_base_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;lhs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;lex&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;tok_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;oper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;peak&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;parse_expr_03&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;ph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lhs&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;E_OK&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;goto&lt;/span&gt; &lt;span class="n"&gt;fail&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;ph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;TOK_DIV&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TOK_MUL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TOK_MOD&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
           &lt;span class="n"&gt;ph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;TOK_POW&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;peak&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;oper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;peak&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;ph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;parse_expr_03&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;ph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;E_OK&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;goto&lt;/span&gt; &lt;span class="n"&gt;fail&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;lhs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;stmt_expr_t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;oper&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;rhs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;loc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;E_OK&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nl"&gt;fail:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;lhs&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;E_PARSE_FAIL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's a small part of Feral's Recursive-Descent expression parsing.&lt;/p&gt;

&lt;p&gt;No, I don’t use tools like yacc, or bison — I like being in total control of the codebase, plus for me, yacc/bison would have taken a lot more time to understand and then put into use.&lt;/p&gt;

&lt;p&gt;But my oh my, the real fun was in writing the Virtual Machine. Since there was always the goal in mind of the language being minimalistic, the number of VM instructions would have to be low too. As of now, Feral contains a total of &lt;strong&gt;22&lt;/strong&gt; VM instructions through which any Feral program is executed. I think that’s sufficiently low.&lt;/p&gt;

&lt;p&gt;The VM itself is stack-based, therefore each instruction is quite simple — an operation, and an operand (which is optional). And it uses &lt;code&gt;libgmp&lt;/code&gt; and &lt;code&gt;libmpfr&lt;/code&gt; libraries for working with arbitrary sized arithmetic. This totally eliminates the need to package a separate library for working with big numbers. Aside from system libraries, these are the only external libraries required for installing and using the Feral programming language.&lt;/p&gt;

&lt;p&gt;Currently, VM consists of the following instructions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;OP_CREATE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// create a new variable - bool operand - if true, it contains 'in' part (x in y = z)&lt;/span&gt;
&lt;span class="n"&gt;OP_STORE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// store in a name: value from stack&lt;/span&gt;
&lt;span class="n"&gt;OP_LOAD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// load from operand, onto stack&lt;/span&gt;
&lt;span class="n"&gt;OP_ULOAD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// unload (pop) from stack&lt;/span&gt;

&lt;span class="n"&gt;OP_JMP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// unconditional jump to index&lt;/span&gt;
&lt;span class="n"&gt;OP_JMPT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// jump to index if top element on stack is true - will not unload if true&lt;/span&gt;
&lt;span class="n"&gt;OP_JMPF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// jump to index if top element on stack is false - will not unload if false&lt;/span&gt;
&lt;span class="n"&gt;OP_JMPTPOP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// jump to index if top element on stack is true - will pop unconditionally&lt;/span&gt;
&lt;span class="n"&gt;OP_JMPFPOP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// jump to index if top element on stack is false - will pop unconditionally&lt;/span&gt;
&lt;span class="n"&gt;OP_JMPN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// jump to index if top element on stack is nil (won't pop otherwise)&lt;/span&gt;

&lt;span class="n"&gt;OP_BODY_TILL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// jump to index which is where the body (of a function) ends + 1&lt;/span&gt;
&lt;span class="n"&gt;OP_MKFN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// create a function object&lt;/span&gt;

&lt;span class="n"&gt;OP_BLKA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// add count scopes&lt;/span&gt;
&lt;span class="n"&gt;OP_BLKR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// rem count scopes&lt;/span&gt;

&lt;span class="n"&gt;OP_FNCL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// call a function (string arg - argument format)&lt;/span&gt;
&lt;span class="n"&gt;OP_MEM_FNCL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// call a member function (string arg - argument format)&lt;/span&gt;
&lt;span class="n"&gt;OP_ATTR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// get attribute from an object (operand is attribute name)&lt;/span&gt;

&lt;span class="n"&gt;OP_RET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// return - bool - false pushes nil on top of stack&lt;/span&gt;
&lt;span class="n"&gt;OP_CONTINUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// size_t operand - jump to&lt;/span&gt;
&lt;span class="n"&gt;OP_BREAK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// size_t operand - jump to&lt;/span&gt;

&lt;span class="c1"&gt;// for loops&lt;/span&gt;
&lt;span class="n"&gt;OP_PUSH_LOOP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// marks a loop's beginning for variable stack&lt;/span&gt;
&lt;span class="n"&gt;OP_POP_LOOP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// marks a loop's ending for variable stack&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As of yet, to be honest, the VM is most certainly not quite optimized. I am working on that, but it’s definitely not agonizingly slow — by a long shot!&lt;/p&gt;

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

&lt;p&gt;Well, this is a very short introduction, as well as the main things I feel to be interesting about Feral. As the development continues, the language is becoming more and more stable, and frankly, I am incredibly excited about working with it, using it and sharing about it!&lt;/p&gt;

&lt;p&gt;Hope you all find the post and language interesting/exciting! Comment your thoughts on them and do check out Feral. Feedback’s always welcome and most appreciated! But that’s it for today.&lt;/p&gt;

&lt;p&gt;Until next time everyone! ❤️ ❤️&lt;/p&gt;

&lt;h1&gt;
  
  
  Links:
&lt;/h1&gt;

&lt;p&gt;Feral Language Organization: &lt;a href="https://github.com/Feral-Lang"&gt;Feral-Lang&lt;/a&gt;&lt;br&gt;
Feral Compiler/VM: &lt;a href="https://github.com/Feral-Lang/Feral"&gt;Feral-Lang/Feral&lt;/a&gt;&lt;br&gt;
Feral Book/Guide: &lt;a href="https://feral-lang.github.io/Book/"&gt;Feral-Lang/Book&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ... Just One More Example, Pretty Please!
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"std/io"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"std/fs"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"std/sys"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;curl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"curl"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"http://212.183.159.230/10MB.zip"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"10MB.zip"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;out_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fs&lt;/span&gt;&lt;span class="nf"&gt;.open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"10MB.zip"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"w+"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;curl&lt;/span&gt;&lt;span class="nf"&gt;.new_easy&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="nf"&gt;.set_opt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl&lt;/span&gt;&lt;span class="py"&gt;.OPT_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="nf"&gt;.set_opt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl&lt;/span&gt;&lt;span class="py"&gt;.OPT_FOLLOWLOCATION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="nf"&gt;.set_opt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl&lt;/span&gt;&lt;span class="py"&gt;.OPT_NOPROGRESS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="nf"&gt;.set_opt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl&lt;/span&gt;&lt;span class="py"&gt;.OPT_WRITEDATA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out_file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="nf"&gt;.perform&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="nf"&gt;.println&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="nf"&gt;.println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"failed to download file '"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"' to '"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"'"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="nf"&gt;.exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="nf"&gt;.println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Downloaded file: "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code uses the (Work in Progress) Curl C library and its Feral API to download a file.&lt;br&gt;
It's so cute isn't it!! 🥺❤️&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>compilers</category>
      <category>interpreters</category>
      <category>languagedesign</category>
    </item>
  </channel>
</rss>
