<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://news.eolang.org/rss.xml" rel="self" type="application/atom+xml" /><link href="https://news.eolang.org/" rel="alternate" type="text/html" /><updated>2026-04-21T09:36:17+03:00</updated><id>https://news.eolang.org/rss.xml</id><title type="html">News About EO Programming Language</title><subtitle>Here we post most recent news about EO programming language and 𝜑-calculus
</subtitle><author><name>EO</name><email>team@eolang.org</email></author><entry><title type="html">Auto named abstract objects or how to reach the ρ</title><link href="https://news.eolang.org/2025-02-21-auto-named-abstract-objects.html" rel="alternate" type="text/html" title="Auto named abstract objects or how to reach the ρ" /><published>2025-02-21T00:00:00+03:00</published><updated>2025-02-21T00:00:00+03:00</updated><id>https://news.eolang.org/auto-named-abstract-objects</id><content type="html" xml:base="https://news.eolang.org/2025-02-21-auto-named-abstract-objects.html"><![CDATA[<p>It’s been a difficult year… It’s been a while since our
<a href="https://news.eolang.org/2024-05-14-rho-sigma-delta-lambda.html">last</a> blog post. Today, we’re back
and starting by answering a question from our Telegram <a href="https://t.me/eolang_org">chat</a> reader:
“What does the <code class="language-plaintext highlighter-rouge">&gt;&gt;</code> EO syntax stand for”?</p>

<!--more-->

<p>In one of the previous releases, we introduced this EO syntax for the automated naming of abstract
objects. The only place where such auto-named abstract objects are allowed is as arguments of an
application. They CAN’T be used as top-level abstract objects because that wouldn’t make any
sense — there would be no way to “touch” them from other objects.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[x] &gt;&gt;     # prohibited

malloc.of
  12
  [m] &gt;&gt;   # allowed
</code></pre></div></div>

<p>The idea is simple: generate a random unique name for an object if the user considers
meaningful naming unnecessary. But why might they decide this? That’s the most interesting part.</p>

<p>To understand the real reason, we need to go back to the
<a href="https://news.eolang.org/2024-05-14-rho-sigma-delta-lambda.html">previous</a> blog post,
particularly the section about the <code class="language-plaintext highlighter-rouge">ρ</code> (Rho) attribute. Let’s recap some important points:</p>

<ol>
  <li>The <code class="language-plaintext highlighter-rouge">ρ</code> (Rho) attribute of the object <code class="language-plaintext highlighter-rouge">voice</code> refers to the object <code class="language-plaintext highlighter-rouge">animal</code> that uses <code class="language-plaintext highlighter-rouge">voice</code>.</li>
  <li>In EO, the <code class="language-plaintext highlighter-rouge">ρ</code> (Rho) attribute is indicated by the <code class="language-plaintext highlighter-rouge">^</code> sign.</li>
  <li>“The object <code class="language-plaintext highlighter-rouge">animal</code> uses the object <code class="language-plaintext highlighter-rouge">voice</code>” implies dynamic dispatch.</li>
  <li>Dynamic dispatch in EO is a mechanism for retrieving an attribute from an object.
Syntactically, it is implemented via dot notation: <code class="language-plaintext highlighter-rouge">animal.voice</code>.</li>
  <li>The <code class="language-plaintext highlighter-rouge">ρ</code> (Rho) attribute is initially empty and is set right after dynamic dispatch occurs.</li>
</ol>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[name] &gt; animal
  [] &gt; voice

animal "kitty" &gt; cat
cat.voice &gt; meow
</code></pre></div></div>

<p>In the code snippet above, we copy the object <code class="language-plaintext highlighter-rouge">animal</code> and set its attribute <code class="language-plaintext highlighter-rouge">name</code> to <code class="language-plaintext highlighter-rouge">"kitty"</code>
(which is a <code class="language-plaintext highlighter-rouge">string</code> object). Then, we take the <code class="language-plaintext highlighter-rouge">voice</code> attribute from the object <code class="language-plaintext highlighter-rouge">cat</code>.
At the exact moment the object <code class="language-plaintext highlighter-rouge">voice</code> is retrieved, its <code class="language-plaintext highlighter-rouge">ρ</code> (Rho) attribute is set and starts
referring to the object <code class="language-plaintext highlighter-rouge">cat</code>. Now, we can do <code class="language-plaintext highlighter-rouge">meow.^</code>.</p>

<p>Considering the above, we can assume that for the object <code class="language-plaintext highlighter-rouge">meow</code> (which is a copied <code class="language-plaintext highlighter-rouge">voice</code> object)
to use the <code class="language-plaintext highlighter-rouge">ρ</code> (Rho) attribute, <code class="language-plaintext highlighter-rouge">voice</code> must be “taken” (or dispatched) from somewhere
(specifically, from the object <code class="language-plaintext highlighter-rouge">cat</code>). If it has to be “taken,” that means the object <code class="language-plaintext highlighter-rouge">cat</code> must
have an attribute named <code class="language-plaintext highlighter-rouge">voice</code>, because dynamic dispatch is only possible via an attribute name.
This is the key point: an object must have an attribute with a name. Only the presence of a name
allows the object to have the <code class="language-plaintext highlighter-rouge">ρ</code> (Rho) attribute.</p>

<p>Now, let’s return to the example with abstract objects.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[] &gt; foo
  "Hello" &gt; greetings
  malloc.of &gt; @
    5
    [m]
      $.^.greetings &gt; str
      m.write str &gt; @
</code></pre></div></div>

<p>Here, we have an object <code class="language-plaintext highlighter-rouge">foo</code> with two attributes: <code class="language-plaintext highlighter-rouge">greetings</code> and <code class="language-plaintext highlighter-rouge">@</code>. The attribute <code class="language-plaintext highlighter-rouge">@</code> is bound
to the object <code class="language-plaintext highlighter-rouge">malloc.of</code>, which is copied with two arguments: the object <code class="language-plaintext highlighter-rouge">5</code> and a nameless
abstract object (let’s call it “scope”). The “scope” has three attributes: <code class="language-plaintext highlighter-rouge">m</code>, <code class="language-plaintext highlighter-rouge">str</code>, and <code class="language-plaintext highlighter-rouge">@</code>.
As you can see, <code class="language-plaintext highlighter-rouge">str</code> is bound to a chain of dynamic dispatches: <code class="language-plaintext highlighter-rouge">$.^.greetings</code>.</p>

<p>Here, <code class="language-plaintext highlighter-rouge">$</code> means “this” (i.e., the abstract object itself, “scope”);
<code class="language-plaintext highlighter-rouge">.^</code> takes the <code class="language-plaintext highlighter-rouge">ρ</code> (Rho) attribute of the abstract object;
and <code class="language-plaintext highlighter-rouge">.greetings</code> retrieves the <code class="language-plaintext highlighter-rouge">greetings</code> attribute.</p>

<p>Clearly, “scope” is trying to access the <code class="language-plaintext highlighter-rouge">greetings</code> attribute of <code class="language-plaintext highlighter-rouge">foo</code> via its <code class="language-plaintext highlighter-rouge">ρ</code> (Rho) attribute.
For this to work, “scope” must have the <code class="language-plaintext highlighter-rouge">ρ</code> attribute referring to <code class="language-plaintext highlighter-rouge">foo</code>, meaning that “scope” must
be dispatched (or “taken”) from <code class="language-plaintext highlighter-rouge">foo</code>. However, “scope” lacks a name. No name means no dynamic
dispatch, and without dynamic dispatch, there is no <code class="language-plaintext highlighter-rouge">ρ</code> (Rho) attribute.</p>

<p>The solution is simple: give a name to “scope”.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[] &gt; foo
  "Hello" &gt; greetings
  malloc.of &gt; @
    5
    [m] &gt; scope
      $.^.greetings &gt; str
      m.write str &gt; @
</code></pre></div></div>

<p>This is a sugared version where the name <code class="language-plaintext highlighter-rouge">scope</code> is placed at a certain nesting level.
To better understand it, let’s rewrite it in its canonical form, which is semantically the
same (and which our compiler actually builds under the hood).</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[] &gt; foo
  "Hello" &gt; greetings
  [m] &gt; scope
    $.^.greetings &gt; str
    m.write str &gt; @
  malloc.of &gt; @
    5
    $.scope
</code></pre></div></div>

<p>Now, you can see that <code class="language-plaintext highlighter-rouge">foo</code> has one more attribute, <code class="language-plaintext highlighter-rouge">scope</code>, and the second argument of
<code class="language-plaintext highlighter-rouge">malloc.of</code> now appears slightly different: <code class="language-plaintext highlighter-rouge">$.scope</code>. Take a closer look at it.
What do you see? Right! This is dynamic dispatch we have here! The <code class="language-plaintext highlighter-rouge">$</code> means “this”
(i.e., the current abstract object, <code class="language-plaintext highlighter-rouge">foo</code>), and <code class="language-plaintext highlighter-rouge">.scope</code> retrieves the <code class="language-plaintext highlighter-rouge">scope</code> attribute
from <code class="language-plaintext highlighter-rouge">foo</code>. This means that right after the dispatch is done, the <code class="language-plaintext highlighter-rouge">scope</code> object has
its <code class="language-plaintext highlighter-rouge">ρ</code> attribute set, referring to <code class="language-plaintext highlighter-rouge">foo</code>, and <code class="language-plaintext highlighter-rouge">$.^.greetings</code> starts working correctly.</p>

<p>This solves the main problem. However, the canonical form is somewhat verbose, while the
sugared form relies on attribute naming when it’s unnecessary.</p>

<p>For cases where an abstract object’s name is unimportant but must be present to enable dynamic
dispatch, we introduced the <code class="language-plaintext highlighter-rouge">&gt;&gt;</code> syntax.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[] &gt; foo
  "Hello" &gt; greetings
  malloc.of &gt; @
    5
    [m] &gt;&gt;
      $.^.greetings &gt; str
      m.write str &gt; @
</code></pre></div></div>

<p>Under the hood, the compiler rewrites it into something like this:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[] &gt; foo
  "Hello" &gt; greetings
  [m] &gt; random-unique-name
    $.^.greetings &gt; str
    m.write str &gt; @
  malloc.of &gt; @
    5
    $.random-unique-name
</code></pre></div></div>

<p>It continues to work according to the same rules but looks cleaner for the user.</p>

<p>That’s all for today. Hopefully, you now have a better understanding of the <code class="language-plaintext highlighter-rouge">ρ</code> attribute and
dynamic dispatch in EO.</p>]]></content><author><name>maxonfjvipon</name></author><summary type="html"><![CDATA[It’s been a difficult year… It’s been a while since our last blog post. Today, we’re back and starting by answering a question from our Telegram chat reader: “What does the &gt;&gt; EO syntax stand for”?]]></summary></entry><entry><title type="html">Rho, Sigma and Other Fantastic Beasts of EO</title><link href="https://news.eolang.org/2024-05-14-rho-sigma-delta-lambda.html" rel="alternate" type="text/html" title="Rho, Sigma and Other Fantastic Beasts of EO" /><published>2024-05-14T00:00:00+03:00</published><updated>2024-05-14T00:00:00+03:00</updated><id>https://news.eolang.org/rho-sigma-delta-lambda</id><content type="html" xml:base="https://news.eolang.org/2024-05-14-rho-sigma-delta-lambda.html"><![CDATA[<p>Since the last blog post, we <a href="https://github.com/objectionary/eo/releases/tag/0.38.0">released</a> a
new version of EO where we got rid of the <code class="language-plaintext highlighter-rouge">σ</code> (Sigma) attribute. So, this blog post will try to
explain all special attributes and assets such as <code class="language-plaintext highlighter-rouge">Δ</code> (Delta), <code class="language-plaintext highlighter-rouge">φ</code> (Phi), <code class="language-plaintext highlighter-rouge">σ</code> (Sigma), <code class="language-plaintext highlighter-rouge">λ</code> (Lambda),
and <code class="language-plaintext highlighter-rouge">ρ</code> (Rho) as promised in one of the previous blog posts.</p>

<!--more-->

<h3 id="where-i-was-born">Where I Was Born</h3>

<p>The first special attribute we’re observing (and which was removed) is <code class="language-plaintext highlighter-rouge">σ</code> (Sigma). The <code class="language-plaintext highlighter-rouge">σ</code>
attribute of the object <code class="language-plaintext highlighter-rouge">X</code> was the attribute that referred to the object <code class="language-plaintext highlighter-rouge">Y</code> inside which the
scope object <code class="language-plaintext highlighter-rouge">X</code> was born (formed or created for the first time).</p>

<p>The <code class="language-plaintext highlighter-rouge">σ</code> attribute in EO:</p>
<ul>
  <li>was indicated by the <code class="language-plaintext highlighter-rouge">&amp;</code> sign.</li>
  <li>was initialized right after the object is formed.</li>
  <li>every object except the global parent object <code class="language-plaintext highlighter-rouge">Φ</code> had it.</li>
</ul>

<p>For example, <code class="language-plaintext highlighter-rouge">int.&amp; -&gt; eolang</code>, <code class="language-plaintext highlighter-rouge">float.div.&amp; -&gt; float</code>. Consider the next code snippet:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[] &gt; loop
  "Hello, world" &gt; str

  while &gt; @
    true
    [i]
      stdout &gt; @
        &amp;.str
</code></pre></div></div>

<p>Here we have an endless while loop. The second argument of the object <code class="language-plaintext highlighter-rouge">while</code> is an anonymous
abstract object, let’s call it <code class="language-plaintext highlighter-rouge">X</code>. The <code class="language-plaintext highlighter-rouge">X</code> object is not used in the scope of the object <code class="language-plaintext highlighter-rouge">loop</code>;
it’s just created here. The object <code class="language-plaintext highlighter-rouge">X</code> will be used inside the scope of the object <code class="language-plaintext highlighter-rouge">while</code> when
dataization is started. But as you may see <code class="language-plaintext highlighter-rouge">X</code> has access to the scope of the object <code class="language-plaintext highlighter-rouge">loop</code> via
<code class="language-plaintext highlighter-rouge">&amp;</code> and may reach the attributes of <code class="language-plaintext highlighter-rouge">loop</code> like <code class="language-plaintext highlighter-rouge">str</code>.</p>

<p>And we decided that it was a bad idea to give the object such an opportunity to have access to the
place where it was born. It kind of breaks the idea of object orientation because <code class="language-plaintext highlighter-rouge">&amp;</code> is actually
a static attribute like a static method in Java. We don’t tolerate static methods and attributes,
<a href="https://www.yegor256.com/2014/05/05/oop-alternative-to-utility-classes.html">here’s</a> why.</p>

<h3 id="who-uses-me">Who Uses Me</h3>

<p>The second special attribute we’re observing is <code class="language-plaintext highlighter-rouge">ρ</code> (Rho). The <code class="language-plaintext highlighter-rouge">ρ</code> attribute of the object <code class="language-plaintext highlighter-rouge">X</code> is
the attribute that refers to the object <code class="language-plaintext highlighter-rouge">Y</code> that uses the object <code class="language-plaintext highlighter-rouge">X</code>. In EO, the attribute <code class="language-plaintext highlighter-rouge">ρ</code> is
indicated by the <code class="language-plaintext highlighter-rouge">^</code> sign. Drawing the analogy with Java, the closest thing to <code class="language-plaintext highlighter-rouge">ρ</code> is the <code class="language-plaintext highlighter-rouge">this</code>
keyword which refers to the current object:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>class Animal {
  String type;
  Animal(String tpe) {
    this.type = tpe;
  }
  void voice() {
    System.out.print("I'm a %s", this.type)
  }
}

Animal cat = new Animal("Cat");
cat.voice();                    // I'm a Cat

Animal dog = new Animal("Dog");
dog.voice();                    // I'm a Dog
</code></pre></div></div>

<p>Here we create two instances of <code class="language-plaintext highlighter-rouge">Animal</code> - <code class="language-plaintext highlighter-rouge">cat</code> and <code class="language-plaintext highlighter-rouge">dog</code>. The <code class="language-plaintext highlighter-rouge">this</code> keyword inside their
<code class="language-plaintext highlighter-rouge">voice</code> functions refers to different objects - <code class="language-plaintext highlighter-rouge">cat</code> and <code class="language-plaintext highlighter-rouge">dog</code> accordingly.</p>

<p>The same functionality can be achieved in EO:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[type] &gt; animal
  [] &gt; voice
    stdout &gt; @
      sprintf
        "I'm a %s"
        ^.type

animal "Cat" &gt; cat
cat.voice &gt; meow   # I'm a Cat

animal "Dog" &gt; dog
dog.voice &gt; woof   # I'm a Dog

</code></pre></div></div>
<p>The main difference between <code class="language-plaintext highlighter-rouge">this</code> in Java and <code class="language-plaintext highlighter-rouge">ρ</code> in EO is the moment when these “links” actually
become referred to the objects. In Java - right after the object is created, in EO - on attribute
dispatch. Let’s look a bit closer. The dynamic dispatch in EO is a mechanism of retrieving an
attribute from the object. Syntactically it’s implemented via “dot-notation”.</p>

<p>So this is dispatch:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cat.voice
</code></pre></div></div>

<p>We’re trying to retrieve an attribute <code class="language-plaintext highlighter-rouge">voice</code> from the concrete object <code class="language-plaintext highlighter-rouge">cat</code>. At the moment we’ve
found the attribute <code class="language-plaintext highlighter-rouge">voice</code> inside the object <code class="language-plaintext highlighter-rouge">cat</code> and are ready to return it - the <code class="language-plaintext highlighter-rouge">voice</code> attribute
is copied and its <code class="language-plaintext highlighter-rouge">ρ</code> attribute is initialized with a link to the object <code class="language-plaintext highlighter-rouge">cat</code>. Until we touch
the <code class="language-plaintext highlighter-rouge">cat.voice</code> object, its <code class="language-plaintext highlighter-rouge">ρ</code> attribute refers to <code class="language-plaintext highlighter-rouge">Ø</code> (nothing).</p>

<p>A few more examples:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cat.voice &gt; voice1  # voice1.^ -&gt; cat
cat.voice &gt; voice2  # voice2.^ -&gt; cat
dog.voice &gt; voice3  # voice3.^ -&gt; dog

cat.voice &gt; voice4  # voice4.&amp; -&gt; animal - deprecated
dog.voice &gt; voice5  # voice5.&amp; -&gt; animal - deprecated
</code></pre></div></div>

<h3 id="what-i-decorate">What I Decorate</h3>

<p>The third special attribute we’re observing is <code class="language-plaintext highlighter-rouge">φ</code> (Phi). We’ve already described the attribute in
one of the previous blog posts, but let’s dive a bit deeper. In EO, the attribute is indicated
by <code class="language-plaintext highlighter-rouge">@</code> sign. The attribute is not mandatory and may be absent. The <code class="language-plaintext highlighter-rouge">φ</code> attribute of the object <code class="language-plaintext highlighter-rouge">X</code>
is the attribute that refers to the object <code class="language-plaintext highlighter-rouge">Y</code> which object <code class="language-plaintext highlighter-rouge">X</code> decorates. The main purpose of
decoration is the reuse of attributes. For example:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[type] &gt; animal
  [] &gt; voice
    stdout &gt; @
      sprintf
        "I'm a %s"
        ^.type

[] &gt; cat
  animal "Cat" &gt; @
</code></pre></div></div>

<p>Here we have an object <code class="language-plaintext highlighter-rouge">cat</code> which decorates an object <code class="language-plaintext highlighter-rouge">animal</code> with <code class="language-plaintext highlighter-rouge">type</code> attribute set to
<code class="language-plaintext highlighter-rouge">"Cat"</code>. That means that all the attributes which are allowed to be taken from the object <code class="language-plaintext highlighter-rouge">animal</code>,
like <code class="language-plaintext highlighter-rouge">voice</code>, are allowed to be taken from the object <code class="language-plaintext highlighter-rouge">cat</code>:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cat.voice &gt; meow # I'm a Cat
</code></pre></div></div>

<p>The decoration may have several layers and all the attributes on the deepest level are available
on the top level:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[type] &gt; animal
  [] &gt; voice
    stdout &gt; @
      sprintf
        "I'm a %s"
        ^.type

[color] &gt; cat
  animal &gt; @
    sprintf
      "%s cat"
      color

[] &gt; black-cat
  cat "black" &gt; @
</code></pre></div></div>

<p>Here the object <code class="language-plaintext highlighter-rouge">black-cat</code> decorates the object <code class="language-plaintext highlighter-rouge">cat</code> and the object <code class="language-plaintext highlighter-rouge">cat</code> decorates the object
<code class="language-plaintext highlighter-rouge">animal</code>. This onion of decorators allows taking the attribute <code class="language-plaintext highlighter-rouge">voice</code> from the object <code class="language-plaintext highlighter-rouge">black-cat</code>:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>black-cat.voice &gt; meow # I'm a black cat
</code></pre></div></div>

<h3 id="what-data-i-have">What Data I Have</h3>

<p>The fourth special thing we’re observing is <code class="language-plaintext highlighter-rouge">Δ</code> (Delta) asset. A few words about this asset:</p>
<ul>
  <li>It’s not an attribute but an asset because it refers not to the object but to the data which is
a sequence of bytes.</li>
  <li>There’s no way to explicitly touch this asset in EO.</li>
  <li>Only <code class="language-plaintext highlighter-rouge">org.eolang.bytes</code> object has this asset.</li>
  <li>The only way to touch the data in the asset is dataization.</li>
</ul>

<h3 id="what-i-can-reach-from-outside">What I Can Reach from Outside</h3>

<p>The last special thing we’re observing is <code class="language-plaintext highlighter-rouge">λ</code> (Lambda) asset. Let’s look at it a bit closely:</p>
<ul>
  <li>It’s not an attribute but an asset because it refers not to the object but to some external
function which returns an object.</li>
  <li>Objects in EO that have the <code class="language-plaintext highlighter-rouge">λ</code> asset are called “atoms”.</li>
  <li>There’s no way to explicitly touch this asset in EO.</li>
  <li>Atoms can’t have a <code class="language-plaintext highlighter-rouge">φ</code> attribute.</li>
  <li>The <code class="language-plaintext highlighter-rouge">λ</code> asset, as well as the <code class="language-plaintext highlighter-rouge">φ</code> attribute, also allows reusing the attributes:</li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[] &gt; mars-temperature /float # measures the temperature on Mars and returns float

mars-temperature.div 10 &gt; divided
</code></pre></div></div>

<p>Here, as you may see, <code class="language-plaintext highlighter-rouge">mars-temperature</code> is the atom that does not have an attribute <code class="language-plaintext highlighter-rouge">div</code> and
returns <code class="language-plaintext highlighter-rouge">float</code>. However, we can still retrieve the attribute <code class="language-plaintext highlighter-rouge">div</code> from it. It will go to the
<code class="language-plaintext highlighter-rouge">λ</code> asset, execute it, do some calculations, return us some <code class="language-plaintext highlighter-rouge">float</code>, and the <code class="language-plaintext highlighter-rouge">div</code> attribute will
be taken from this <code class="language-plaintext highlighter-rouge">float</code>.</p>

<p>That’s all for today. We’ll be right back in a week with a new fresh blog post. Stay in touch.</p>]]></content><author><name>maxonfjvipon</name></author><summary type="html"><![CDATA[Since the last blog post, we released a new version of EO where we got rid of the σ (Sigma) attribute. So, this blog post will try to explain all special attributes and assets such as Δ (Delta), φ (Phi), σ (Sigma), λ (Lambda), and ρ (Rho) as promised in one of the previous blog posts.]]></summary></entry><entry><title type="html">New Syntax for Nameless @-Bound-Only Objects</title><link href="https://news.eolang.org/2024-05-02-phi-bound-only.html" rel="alternate" type="text/html" title="New Syntax for Nameless @-Bound-Only Objects" /><published>2024-05-02T00:00:00+03:00</published><updated>2024-05-02T00:00:00+03:00</updated><id>https://news.eolang.org/phi-bound-only</id><content type="html" xml:base="https://news.eolang.org/2024-05-02-phi-bound-only.html"><![CDATA[<p>We’re continuing to observe the features of the latest
<a href="https://github.com/objectionary/eo/releases/tag/0.37.0">release</a> of EO, and today we’re talking
about new syntax for nameless @-bound-only objects.</p>

<!--more-->

<p>The <code class="language-plaintext highlighter-rouge">@</code> attribute is a special attribute that indicates the current object decorates another object.
For example, in the snippet below, objects <code class="language-plaintext highlighter-rouge">cat</code> and <code class="language-plaintext highlighter-rouge">dog</code> decorate an object <code class="language-plaintext highlighter-rouge">animal</code>:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[voice] &gt; animal

[] &gt; cat
  animal "Meow" &gt; @

[] &gt; dog
  animal "Woof" &gt; @
</code></pre></div></div>

<p>The attribute <code class="language-plaintext highlighter-rouge">@</code> is also often used in nameless abstract objects. A common example is the second
argument of the object <code class="language-plaintext highlighter-rouge">try</code>:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>try
  1.div 0
  [e]
    QQ.io.stdout &gt; @
      e
  true
</code></pre></div></div>

<p>We noticed quite some time ago that there were so many small objects with only the <code class="language-plaintext highlighter-rouge">@</code> attribute
bound. So, to simplify the code and reduce the number of indentations, we introduced new syntax for
such objects:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>QQ.io.stdout e &gt; [e]

# Which is the same as

[e]
  QQ.io.stdout e &gt; @

# OR

[e]
  QQ.io.stdout &gt; @
    e
</code></pre></div></div>

<p>It’s worth noting that only objects in horizontal notation can be used with such syntax:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>QQ.io.stdout e &gt; [e]       # horizontal application, the same as:
                           # [e]
                           #   QQ.io.stdout e &gt; @
                           #
if. true first second &gt; [] # reversed horizontal application, the same as:
                           # []
                           #   if. &gt; @
                           #     true
                           #     first
                           #     second
                           # OR
                           # []
                           #   if. true first second &gt; @
                           #
QQ.io.stdout &gt; []          # horizontal method/dispatch, the same as:
                           # []
                           #   QQ.io.stdout &gt; @
                           #
x &gt; []                     # object reference, the same as:
                           # []
                           #   x &gt; @
                           # OR
                           # [] (x &gt; @)
                           #
[x] (5.plus x &gt; sum) &gt; [i] # horizontal anonymous abstract object
                           # the same as:
                           # [i]
                           #   [x] &gt; @
                           #     5.plus x &gt; sum
</code></pre></div></div>

<p>All objects in vertical notation can NOT be used with such syntax and their usage leads to a parsing
exception:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>QQ.io.stdout &gt; [e]         # vertical application - wrong
  e                        #
                           #
QQ                         # vertical method/dispatch - wrong
.io                        #
.stdout &gt; [e]              #
                           #
if. &gt; @                    # reversed vertical method with application - wrong
  true                     #
  first                    #
  second                   #
                           #
[x] &gt; [i]                  # vertical anonymous abstract object - wrong
  5.plus x &gt; sum           #
</code></pre></div></div>

<p>Returning to the example with object <code class="language-plaintext highlighter-rouge">try</code>, it can now be written in a shorter and more convenient way:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>try
  1.div 0
  QQ.io.stdout e &gt; [e]
  true
</code></pre></div></div>

<p>That’s all for today. We’ll be right back in a week with a new fresh blog post. Stay in touch.</p>]]></content><author><name>maxonfjvipon</name></author><summary type="html"><![CDATA[We’re continuing to observe the features of the latest release of EO, and today we’re talking about new syntax for nameless @-bound-only objects.]]></summary></entry><entry><title type="html">Bye-bye, bool!</title><link href="https://news.eolang.org/2024-04-26-bye-bye-bool.html" rel="alternate" type="text/html" title="Bye-bye, bool!" /><published>2024-04-26T00:00:00+03:00</published><updated>2024-04-26T00:00:00+03:00</updated><id>https://news.eolang.org/bye-bye-bool</id><content type="html" xml:base="https://news.eolang.org/2024-04-26-bye-bye-bool.html"><![CDATA[<p>After the <a href="https://news.eolang.org/2024-04-16-release-0-36-0.html">previous</a> blog post, one of the
followers brought an interesting suggestion in our Telegram <a href="https://t.me/eolang_org">chat</a> (join it btw).
He proposed getting rid of the object <code class="language-plaintext highlighter-rouge">bool</code> and making <code class="language-plaintext highlighter-rouge">if</code> an object, not an atom.
And it was quite interesting. So we made a new <a href="https://github.com/objectionary/eo/releases/tag/0.37.0">release</a>
where we followed our follower’s proposal.</p>

<!--more-->

<p>The idea is simple: instead of one object <code class="language-plaintext highlighter-rouge">bool</code>, we introduced two new objects, <code class="language-plaintext highlighter-rouge">true</code> and <code class="language-plaintext highlighter-rouge">false</code>,
which decorate specific <code class="language-plaintext highlighter-rouge">bytes</code>, <code class="language-plaintext highlighter-rouge">01-</code> and <code class="language-plaintext highlighter-rouge">00-</code>, respectively.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[] &gt; true
  01- &gt; @

[] &gt; false
  00- &gt; @
</code></pre></div></div>

<p>Such an implementation has the following benefits:</p>
<ul>
  <li>There’s no way to create a boolean object with an unexpected amount of bytes.</li>
  <li>We got rid of the atom <code class="language-plaintext highlighter-rouge">if</code> and defined it right inside <code class="language-plaintext highlighter-rouge">true</code> and <code class="language-plaintext highlighter-rouge">false</code>:</li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[] &gt; true
  01- &gt; @

  [left right] &gt; if
    left &gt; @

[] &gt; false
  00- &gt; @

  [left right] &gt; if
    right &gt; @
</code></pre></div></div>

<p>The decision on which <code class="language-plaintext highlighter-rouge">if</code> branch we should jump to is transferred to the moment of creation of the
objects <code class="language-plaintext highlighter-rouge">true</code> or <code class="language-plaintext highlighter-rouge">false</code>.</p>

<ul>
  <li>We got rid of two literals <code class="language-plaintext highlighter-rouge">TRUE</code> and <code class="language-plaintext highlighter-rouge">FALSE</code> in EO
<a href="https://github.com/objectionary/eo?tab=readme-ov-file#backus-naur-form">grammar</a>.</li>
  <li>The implementation of other <code class="language-plaintext highlighter-rouge">bool</code> objects like <code class="language-plaintext highlighter-rouge">and</code>, <code class="language-plaintext highlighter-rouge">or</code>, <code class="language-plaintext highlighter-rouge">not</code> became simpler.</li>
</ul>

<p>So, the result <code class="language-plaintext highlighter-rouge">true</code> and <code class="language-plaintext highlighter-rouge">false</code> objects now look like:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[] &gt; true
  01- &gt; @
  false &gt; not

  [left right] &gt; if
    left &gt; @

  [x] &gt; and
    01-.eq x &gt; @

  [x] &gt; or
    ^ &gt; @

[] &gt; false
  00- &gt; @
  true &gt; @

  [left right] &gt; if
    right &gt; @

  [x] &gt; and
    ^ &gt; @

  [x] &gt; or
    01-.eq x &gt; @
</code></pre></div></div>

<p>That’s it for today. There are more interesting features we introduced in the last release.
We’re planning to write blog posts about all of them because they’re worth it. So keep following us!</p>]]></content><author><name>maxonfjvipon</name></author><summary type="html"><![CDATA[After the previous blog post, one of the followers brought an interesting suggestion in our Telegram chat (join it btw). He proposed getting rid of the object bool and making if an object, not an atom. And it was quite interesting. So we made a new release where we followed our follower’s proposal.]]></summary></entry><entry><title type="html">Big changes in 0.36.0</title><link href="https://news.eolang.org/2024-04-16-release-0-36-0.html" rel="alternate" type="text/html" title="Big changes in 0.36.0" /><published>2024-04-16T00:00:00+03:00</published><updated>2024-04-16T00:00:00+03:00</updated><id>https://news.eolang.org/release-0-36-0</id><content type="html" xml:base="https://news.eolang.org/2024-04-16-release-0-36-0.html"><![CDATA[<p>It’s been a while since our last blog post. All this time, we were working hard on fixing bugs,
creating new objects, and improving EO in general. And here it is - release
<a href="https://github.com/objectionary/eo/releases/tag/0.36.0">0.36.0</a>, which contains many new features.
So, this blog post is a summary that highlights the most significant changes.</p>

<!--more-->

<h3 id="rho-attribute">Rho attribute</h3>
<p>The first significant change is related to the special <code class="language-plaintext highlighter-rouge">ρ</code> (rho) attribute. A few words about it:</p>
<ul>
  <li>In general, the <code class="language-plaintext highlighter-rouge">ρ</code> attribute refers to the “parent” (or context) of the object. In Java, an
analog of <code class="language-plaintext highlighter-rouge">ρ</code> would be the <code class="language-plaintext highlighter-rouge">this</code> keyword.</li>
  <li>Every object has a <code class="language-plaintext highlighter-rouge">ρ</code> attribute.</li>
  <li>At the beginning, when an object is formed (just created for the first time), its <code class="language-plaintext highlighter-rouge">ρ</code> is void (referring to nothing).</li>
  <li><code class="language-plaintext highlighter-rouge">ρ</code> is immutable and may be set only once (the rules of setting will be described in a future blog post).</li>
</ul>

<h3 id="vertex-attribute">Vertex attribute</h3>
<p>The second significant change is related to the <code class="language-plaintext highlighter-rouge">ν</code> (vertex) attribute. We got rid of it and made our language simpler.</p>

<p>The purpose of the <code class="language-plaintext highlighter-rouge">ν</code> attribute was to uniquely identify an object in the universe. Before the
release <a href="https://github.com/objectionary/eo/releases/tag/0.36.0">0.36.0</a>, every object had such a
unique numeric identifier, and EO guaranteed that. However, we decided that giving such badges to
objects is not really object-oriented. We don’t want and don’t need to interact with objects relying
on whether they have some unique ID. All we want from the object is its behavior, the functionality
it provides. So, it just does not matter if an object has some identifier or not; the way it behaves
with us is what really matters.</p>

<p>That’s why objects in EO don’t have the <code class="language-plaintext highlighter-rouge">ν</code> attribute anymore.</p>

<h3 id="caching">Caching</h3>
<p>We’ve changed the logic of object caching in EO.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>some-object &gt; cached!
</code></pre></div></div>
<p>Until now, this <code class="language-plaintext highlighter-rouge">!</code> meant that if we take attributes from the object more than once, they will be
calculated only the first time and cached. Sounds good, but it didn’t work as we wanted.</p>

<p>Now, <code class="language-plaintext highlighter-rouge">!</code> means that when a cached object is touched for the first time (for example, an attribute
is taken), it’s dataized, converted to <code class="language-plaintext highlighter-rouge">bytes</code>, and starts to behave as the <code class="language-plaintext highlighter-rouge">bytes</code>. All the next
manipulations with the cached object are transferred to the given <code class="language-plaintext highlighter-rouge">bytes</code>.</p>

<h3 id="objects">Objects</h3>
<p>We’ve done a lot of work to remove redundant objects, redesign some old ones, and introduce new ones.</p>

<ul>
  <li>The object <code class="language-plaintext highlighter-rouge">while</code> was removed from <code class="language-plaintext highlighter-rouge">bool</code> and became a
<a href="https://github.com/objectionary/eo/blob/0.36.0/eo-runtime/src/main/eo/org/eolang/while.eo">separated</a>
object written in pure EO. Its logic is still
<a href="https://news.eo.org/2022-12-22-declarative-while.html">declarative</a> as it was before.</li>
  <li>The object <code class="language-plaintext highlighter-rouge">if</code> also was removed from <code class="language-plaintext highlighter-rouge">bool</code> and became a
<a href="https://github.com/objectionary/eo/blob/0.36.0/eo-runtime/src/main/eo/org/eolang/if.eo">separated</a> object.</li>
  <li>The object <code class="language-plaintext highlighter-rouge">goto</code> was
<a href="https://github.com/objectionary/eo/blob/0.36.0/eo-runtime/src/main/eo/org/eolang/go.eo">implemented</a> in pure EO.</li>
  <li>The object <code class="language-plaintext highlighter-rouge">dataized</code> was
<a href="https://github.com/objectionary/eo/blob/0.36.0/eo-runtime/src/main/eo/org/eolang/dataized.eo">introduced</a>.
 This object dataizes its argument, makes a new instance of the <code class="language-plaintext highlighter-rouge">bytes</code> object, and behaves as it.</li>
  <li>The objects <code class="language-plaintext highlighter-rouge">ram</code> and <code class="language-plaintext highlighter-rouge">heap</code> were removed.</li>
  <li>The object <code class="language-plaintext highlighter-rouge">malloc</code> was
<a href="https://github.com/objectionary/eo/blob/0.36.0/eo-runtime/src/main/eo/org/eolang/malloc.eo">introduced</a>.
It’s a classic memory management object that can allocate a block in memory, write to it, read from it, and free it.</li>
  <li>The object <code class="language-plaintext highlighter-rouge">memory</code> was redesigned and
<a href="https://github.com/objectionary/eo/blob/0.36.0/eo-runtime/src/main/eo/org/eolang/memory.eo">implemented</a> in pure EO.
It uses the objects <code class="language-plaintext highlighter-rouge">dataized</code> and <code class="language-plaintext highlighter-rouge">malloc</code> inside.</li>
  <li>The object <code class="language-plaintext highlighter-rouge">cage</code> was
<a href="https://github.com/objectionary/eo/blob/0.36.0/eo-runtime/src/main/eo/org/eolang/cage.eo">redesigned</a>.
But it’s still a “bad” object, which does not belong to EO.</li>
</ul>

<h3 id="grammar">Grammar</h3>
<p>We’ve made EO more strict by making changes in its <a href="https://github.com/objectionary/eo#backus-naur-form">grammar rules</a>:</p>
<ul>
  <li>Empty lines inside an abstract object body are prohibited. Only one line in front of an abstract object is allowed.</li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Wrong.
[] &gt; object

  5 &gt; five

  10 &gt; ten

  [] &gt; inner

# Right.
[] &gt; object
  5 &gt; five
  10 &gt; ten

  [] &gt; inner
</code></pre></div></div>
<ul>
  <li>A comment in front of a named abstract object is mandatory. A comment in front of an anonymous
(unnamed) abstract object is prohibited. The mandatory comment must start with a capital letter,
end with a dot, have a length &gt;= 64 characters, and include only printable characters (<code class="language-plaintext highlighter-rouge">0x20-0x7f</code>).
Comments in front of other top-level objects are optional.</li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># This is a good commentary in front of a named abstract object with a length &gt;= 64 characters.
[] &gt; object
  # This comment is optional but has the same requirements as in front of an abstract object.
  while &gt; @
    TRUE
    # This commentary is prohibited and will lead to a parsing exception being thrown.
    [i] (i &gt; @)
</code></pre></div></div>
<ul>
  <li>The <code class="language-plaintext highlighter-rouge">ν</code> (vertex) attribute is removed from the grammar.</li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># This code won't be parsed.
TRUE.&lt; &gt; vtx
</code></pre></div></div>
<ul>
  <li>Explicit object copying via <code class="language-plaintext highlighter-rouge">'</code> is removed. Until now, the main purpose of explicit object copying
was to create a new object with a new <code class="language-plaintext highlighter-rouge">ν</code> (vertex) attribute. But since we got rid of it, there’s
no more sense in having such an operation in EO.</li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># This code won't be parsed.
TRUE' &gt; copy
</code></pre></div></div>
<ul>
  <li>Object caching via <code class="language-plaintext highlighter-rouge">!</code> is no longer a language feature but just syntax sugar for the <code class="language-plaintext highlighter-rouge">dataized</code> object.</li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>some-object &gt; cached!
# The same as
(dataized some-object).as-bytes &gt; cached
</code></pre></div></div>
<p>That’s it. This is what we were working on for the last 4 months. We’ll try not to make such huge
breaks between blog posts in the future. So keep following us!</p>]]></content><author><name>maxonfjvipon</name></author><summary type="html"><![CDATA[It’s been a while since our last blog post. All this time, we were working hard on fixing bugs, creating new objects, and improving EO in general. And here it is - release 0.36.0, which contains many new features. So, this blog post is a summary that highlights the most significant changes.]]></summary></entry><entry><title type="html">Recursive Tuple and Varargs</title><link href="https://news.eolang.org/2023-12-19-tuple-varargs.html" rel="alternate" type="text/html" title="Recursive Tuple and Varargs" /><published>2023-12-19T00:00:00+03:00</published><updated>2023-12-19T00:00:00+03:00</updated><id>https://news.eolang.org/tuple-varargs</id><content type="html" xml:base="https://news.eolang.org/2023-12-19-tuple-varargs.html"><![CDATA[<p>We’re continuing to observe new features of the latest release
<a href="https://github.com/objectionary/eo/releases/tag/0.34.1">0.34.1</a> of EO, and today we talk about the new
recursive implementation of the <code class="language-plaintext highlighter-rouge">tuple</code> object and why we got rid of varargs in our language.</p>

<!--more-->
<h3 id="recursive-tuple">Recursive tuple</h3>
<p>As it was mentioned in the <a href="https://news.eolang.org/2023-12-08-phi-and-unphi-mojos.html">previous</a>
blog post, EO is based on φ-calculus, which is a formal model that we are attempting to use as
a base for object-oriented programming languages. There are only two fundamental entities in the
calculus - objects and data. An object is a collection of uniquely named attributes and data is just a
sequence of bytes.</p>

<p>There’s also a special attribute <code class="language-plaintext highlighter-rouge">Δ</code>(delta) which is attached to the data. In our vision of EO only
one object should have such an attribute - <code class="language-plaintext highlighter-rouge">bytes</code>. But for a long time at least 6 objects had it:
<code class="language-plaintext highlighter-rouge">bytes</code>, <code class="language-plaintext highlighter-rouge">int</code>, <code class="language-plaintext highlighter-rouge">float</code>, <code class="language-plaintext highlighter-rouge">string</code>, <code class="language-plaintext highlighter-rouge">bool</code> and (surprise) <code class="language-plaintext highlighter-rouge">tuple</code>. The <code class="language-plaintext highlighter-rouge">Δ</code> attribute of <code class="language-plaintext highlighter-rouge">tuple</code>
stored an array of Java <code class="language-plaintext highlighter-rouge">Phi</code> objects, which was totally wrong.</p>

<p>But the decision was made - only <code class="language-plaintext highlighter-rouge">bytes</code> should have a <code class="language-plaintext highlighter-rouge">Δ</code> attribute, so we needed to remove it from
the other 5 objects including <code class="language-plaintext highlighter-rouge">tuple</code>. And it was a good chance to rewrite <code class="language-plaintext highlighter-rouge">tuple</code> in pure EO which
allowed us to decrease the number of <a href="https://news.eolang.org/2022-12-02-java-atoms.html">atoms</a>.</p>

<p>So, welcome new implementation of <code class="language-plaintext highlighter-rouge">tuple</code> written in pure EO:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Tuple.
[head tail] &gt; tuple
  # Empty tuple
  [] &gt; empty
    [i] &gt; at
      error "Can't get an object from the empty tuple" &gt; @
    [x] &gt; with
      tuple &gt; @
        tuple.empty
        x
    0 &gt; length

  # Obtain the length of the tuple.
  [] &gt; length
    ^.head.length.plus 1 &gt; @

  # Take one element from the tuple, at the given position.
  [i] &gt; at
    ^.length &gt; len!
    if. &gt; index!
      i.lt 0
      len.plus i
      i
    if. &gt; @
      or.
        index.lt 0
        index.gte len
      error "Given index is out of tuple bounds"
      if.
        index.lt (len.plus -1)
        ^.head.at index
        ^.tail

  # Create a new tuple with this element added to the end of it.
  [x] &gt; with
    tuple &gt; @
      ^
      x
</code></pre></div></div>

<p>As you may see, <code class="language-plaintext highlighter-rouge">tuple</code> has two free attributes now: <code class="language-plaintext highlighter-rouge">head</code> and <code class="language-plaintext highlighter-rouge">tail</code>; where <code class="language-plaintext highlighter-rouge">head</code> is always
supposed to be a <code class="language-plaintext highlighter-rouge">tuple</code> as well and <code class="language-plaintext highlighter-rouge">tail</code> is the object we want to store.</p>

<p>For example, if we want to create a tuple of one object it would look like this:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>tuple &gt; my-tuple
  tuple.empty
  1
</code></pre></div></div>

<p>The <code class="language-plaintext highlighter-rouge">tuple.empty</code> is a special <code class="language-plaintext highlighter-rouge">tuple</code> that stores nothing and is used as a top-level <code class="language-plaintext highlighter-rouge">tuple</code> in the whole
recursion.</p>

<p>If we want to create a tuple of three objects it would look like this:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>tuple &gt; my-tuple
  tuple
    tuple
      tuple.empty
      1
    2
  3
</code></pre></div></div>

<p>I hope you get the idea. We also left the <code class="language-plaintext highlighter-rouge">*</code>(star) syntax sugar which allows you to write a <code class="language-plaintext highlighter-rouge">tuple</code>
in one line:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>* 1 2 3 &gt; my-tuple
</code></pre></div></div>

<p>This example is equivalent to the previous one and will be transformed by the compiler to it.</p>

<h3 id="varargs">Varargs</h3>

<p>Before the release <a href="https://github.com/objectionary/eo/releases/tag/0.34.0">0.34.0</a> there were
varargs in EO which allowed you to have an object with an uncertain number of free attributes. For
example, the <code class="language-plaintext highlighter-rouge">int.plus</code> object looked something like this:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[] &gt; int
  [x...] &gt; plus
    # code here

5.plus 5 10 &gt; twenty
20.plus 1 2 3 4 &gt; thirty
</code></pre></div></div>

<p>It was quite a convenient mechanism, but it didn’t match φ-calculus where every attribute has to
be attached to the concrete object. With varargs, the application <code class="language-plaintext highlighter-rouge">5.plus 5 10</code> looks something like
this:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Φ.org.eolang.int(Δ ⤍ 5).plus(
  α0 ↦ Φ.org.eolang.int(Δ ⤍ 5),
  α1 ↦ Φ.org.eolang.int(Δ ⤍ 10)
)
</code></pre></div></div>

<p>But there aren’t two free attributes in the formation of <code class="language-plaintext highlighter-rouge">int.plus</code>, only one — <code class="language-plaintext highlighter-rouge">x</code>:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Φ ↦ ⟦org ↦ ⟦eolang ↦ ⟦int ↦ ⟦plus ↦ ⟦x ↦ ∅, ...⟧, ...⟧, ...⟧, ...⟧, ...⟧
</code></pre></div></div>

<p>So as not to complicate things, we decided to get rid of varargs in EO altogether. And now it’s a perfect
match between EO and φ-calculus. Of course, readability suffered a little because of it, but it’s
worth it.</p>

<p>Next time we’ll put an end to data primitives, be in touch.</p>]]></content><author><name>maxonfjvipon</name></author><summary type="html"><![CDATA[We’re continuing to observe new features of the latest release 0.34.1 of EO, and today we talk about the new recursive implementation of the tuple object and why we got rid of varargs in our language.]]></summary></entry><entry><title type="html">Convert EO to φ-calculus Expression and Back</title><link href="https://news.eolang.org/2023-12-08-phi-and-unphi-mojos.html" rel="alternate" type="text/html" title="Convert EO to φ-calculus Expression and Back" /><published>2023-12-08T00:00:00+03:00</published><updated>2023-12-08T00:00:00+03:00</updated><id>https://news.eolang.org/phi-and-unphi-mojos</id><content type="html" xml:base="https://news.eolang.org/2023-12-08-phi-and-unphi-mojos.html"><![CDATA[<p>In the recently released version <a href="https://github.com/objectionary/eo/releases/tag/0.34.0">0.34.0</a>,
we have implemented several changes to EO. Today, we will discuss the conversion of EO
to φ-calculus expression and vice versa.</p>

<!--more-->

<p>As you may know, φ-calculus is a formal model that we are attempting to use as a base for
object-oriented programming languages, including EO.</p>

<p>From now on, it is possible to convert a program written in EO to a φ-calculus expression.
Here’s how you can accomplish this in your personal project.</p>

<p>First, you need to add the <code class="language-plaintext highlighter-rouge">eo-maven-plugin</code> dependency:</p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;dependency&gt;</span>
  <span class="nt">&lt;groupId&gt;</span>org.eolang<span class="nt">&lt;/groupId&gt;</span>
  <span class="nt">&lt;artifactId&gt;</span>eo-maven-plugin<span class="nt">&lt;/artifactId&gt;</span>
  <span class="nt">&lt;version&gt;</span>0.34.0<span class="nt">&lt;/version&gt;</span> <span class="c">&lt;!-- use 0.34.0 or younger --&gt;</span>
<span class="nt">&lt;/dependency&gt;</span>
</code></pre></div></div>

<p>Conversion occurs in four stages: registration, parsing, optimization, and actual conversion.
Therefore, include the corresponding goals in your build pipeline:</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;build&gt;</span>
  <span class="nt">&lt;plugins&gt;</span>
    <span class="nt">&lt;plugin&gt;</span>
      <span class="nt">&lt;groupId&gt;</span>org.eolang<span class="nt">&lt;/groupId&gt;</span>
      <span class="nt">&lt;artifactId&gt;</span>eo-maven-plugin<span class="nt">&lt;/artifactId&gt;</span>
      <span class="nt">&lt;version&gt;</span><span class="c">&lt;!-- use the last version --&gt;</span><span class="nt">&lt;/version&gt;</span>
      <span class="nt">&lt;executions&gt;</span>
        <span class="nt">&lt;execution&gt;</span>
          <span class="nt">&lt;id&gt;</span>convert<span class="nt">&lt;/id&gt;</span>
          <span class="nt">&lt;goals&gt;</span>
            <span class="nt">&lt;goal&gt;</span>register<span class="nt">&lt;/goal&gt;</span>
            <span class="nt">&lt;goal&gt;</span>parse<span class="nt">&lt;/goal&gt;</span>
            <span class="nt">&lt;goal&gt;</span>optimize<span class="nt">&lt;/goal&gt;</span>
            <span class="nt">&lt;goal&gt;</span>xmir-to-phi<span class="nt">&lt;/goal&gt;</span>
          <span class="nt">&lt;/goals&gt;</span>
        <span class="nt">&lt;/execution&gt;</span>
        <span class="nt">&lt;configuration&gt;</span>
          <span class="nt">&lt;sourcesDir&gt;</span><span class="c">&lt;!-- Where .eo source is placed, src/main/eo by default --&gt;</span><span class="nt">&lt;/sourcesDir&gt;</span>
          <span class="nt">&lt;phiOutputDir&gt;</span><span class="c">&lt;!-- Where .phi files are placed target/eo/phi by default --&gt;</span><span class="nt">&lt;/phiOutputDir&gt;</span>
        <span class="nt">&lt;/configuration&gt;</span>
      <span class="nt">&lt;/executions&gt;</span>
    <span class="nt">&lt;/plugin&gt;</span>
  <span class="nt">&lt;/plugins&gt;</span>
<span class="nt">&lt;/build&gt;</span>
</code></pre></div></div>

<p>Now, you are ready to convert an EO program to a φ-calculus expression. Place the <code class="language-plaintext highlighter-rouge">.eo</code> file in the source
directory and run your Maven project. When it’s done, files with the <code class="language-plaintext highlighter-rouge">.phi</code> extension are placed in
the <code class="language-plaintext highlighter-rouge">phiOutputDir</code> directory.</p>

<p>You may also convert a φ-calculus expression back to EO.
For this, your build pipeline should look like:</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;build&gt;</span>
  <span class="nt">&lt;plugins&gt;</span>
    <span class="nt">&lt;plugin&gt;</span>
      <span class="nt">&lt;groupId&gt;</span>org.eolang<span class="nt">&lt;/groupId&gt;</span>
      <span class="nt">&lt;artifactId&gt;</span>eo-maven-plugin<span class="nt">&lt;/artifactId&gt;</span>
      <span class="nt">&lt;version&gt;</span><span class="c">&lt;!-- use the last version --&gt;</span><span class="nt">&lt;/version&gt;</span>
      <span class="nt">&lt;executions&gt;</span>
        <span class="nt">&lt;execution&gt;</span>
          <span class="nt">&lt;id&gt;</span>convert<span class="nt">&lt;/id&gt;</span>
          <span class="nt">&lt;goals&gt;</span>
            <span class="nt">&lt;goal&gt;</span>phi-to-xmir<span class="nt">&lt;/goal&gt;</span>
            <span class="nt">&lt;goal&gt;</span>optimize<span class="nt">&lt;/goal&gt;</span>
            <span class="nt">&lt;goal&gt;</span>print<span class="nt">&lt;/goal&gt;</span>
          <span class="nt">&lt;/goals&gt;</span>
        <span class="nt">&lt;/execution&gt;</span>
        <span class="nt">&lt;configuration&gt;</span>
          <span class="nt">&lt;unphiInputDir&gt;</span><span class="c">&lt;!-- Where .phi source is placed, target/eo/phi by default --&gt;</span><span class="nt">&lt;/unphiInputDir&gt;</span>
          <span class="nt">&lt;printSourcesDir&gt;</span>${project.basedir}/target/eo/2-optimize<span class="nt">&lt;/printSourcesDir&gt;</span> <span class="c">&lt;!-- /src/main/xmir by default --&gt;</span>
          <span class="nt">&lt;printOutputDir&gt;</span><span class="c">&lt;!-- Where result .eo files are placed, target/generated-sources/eo by default --&gt;</span><span class="nt">&lt;/printOutputDir&gt;</span>
        <span class="nt">&lt;/configuration&gt;</span>
      <span class="nt">&lt;/executions&gt;</span>
    <span class="nt">&lt;/plugin&gt;</span>
  <span class="nt">&lt;/plugins&gt;</span>
<span class="nt">&lt;/build&gt;</span>
</code></pre></div></div>

<p>When it’s done, the resulting <code class="language-plaintext highlighter-rouge">.eo</code> files are placed in the output <code class="language-plaintext highlighter-rouge">printOutputDir</code> directory.</p>

<p>Here’s an example of how the EO Fibonacci program looks in φ-calculus (you can find more examples
<a href="https://github.com/objectionary/eo/tree/master/eo-maven-plugin/src/test/resources/org/eolang/maven/phi">here</a>):</p>
<pre><code class="language-eo">+package eo.example

[n] &gt; fibonacci
  if. &gt; @
    lt.
      n
      2
    n
    plus.
      fibonacci
        n.minus 1
      fibonacci
        n.minus 2
</code></pre>

<p>Its <a href="https://news.eolang.org/2022-11-25-xmir-guide.html">XMIR</a> representation (default location is
<code class="language-plaintext highlighter-rouge">target/eo/2-optimize</code>):</p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
<span class="nt">&lt;program</span> <span class="na">dob=</span><span class="s">"2023-03-19T00:00:00"</span>
         <span class="na">ms=</span><span class="s">"12"</span>
         <span class="na">name=</span><span class="s">"foo.x.main"</span>
         <span class="na">revision=</span><span class="s">"1234567"</span>
         <span class="na">source=</span><span class="s">"/var/folders/xj/f4s949893tq37zzw0pdmd68h0000gn/T/junit2727451398454004374/foo/x/main.eo"</span>
         <span class="na">time=</span><span class="s">"2023-12-13T10:04:53.022835Z"</span>
         <span class="na">version=</span><span class="s">"0.0-SNAPSHOT"</span><span class="nt">&gt;</span>
   <span class="c">&lt;!--This is XMIR - a dialect of XML, which is used to present a parsed EO program. For more information please visit https://news.eolang.org/2022-11-25-xmir-guide.html--&gt;</span>
   <span class="nt">&lt;listing&gt;</span>+package eo.example

[n] <span class="ni">&amp;gt;</span> fibonacci
  if. <span class="ni">&amp;gt;</span> @
    lt.
      n
      2
    n
    plus.
      fibonacci
        n.minus 1
      fibonacci
        n.minus 2
<span class="nt">&lt;/listing&gt;</span>
   <span class="nt">&lt;errors&gt;</span>
      <span class="nt">&lt;error</span> <span class="na">check=</span><span class="s">"missing-home"</span>
             <span class="na">line=</span><span class="s">""</span>
             <span class="na">severity=</span><span class="s">"warning"</span>
             <span class="na">sheet=</span><span class="s">"mandatory-home-meta"</span>
             <span class="na">step=</span><span class="s">"0"</span><span class="nt">&gt;</span>Missing home<span class="nt">&lt;/error&gt;</span>
      <span class="nt">&lt;error</span> <span class="na">check=</span><span class="s">"missing-version-meta"</span>
             <span class="na">line=</span><span class="s">""</span>
             <span class="na">severity=</span><span class="s">"warning"</span>
             <span class="na">sheet=</span><span class="s">"mandatory-version-meta"</span>
             <span class="na">step=</span><span class="s">"0"</span><span class="nt">&gt;</span>Missing version meta<span class="nt">&lt;/error&gt;</span>
   <span class="nt">&lt;/errors&gt;</span>
   <span class="nt">&lt;sheets&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>not-empty-atoms<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>duplicate-names<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>many-free-attributes<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>broken-aliases<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>duplicate-aliases<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>global-nonames<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>same-line-names<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>self-naming<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>cti-adds-errors<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>add-refs<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>wrap-method-calls<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>expand-qqs<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>add-probes<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>vars-float-up<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>add-refs<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>sparse-decoration<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>unsorted-metas<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>incorrect-architect<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>incorrect-home<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>incorrect-version<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>expand-aliases<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>resolve-aliases<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>add-refs<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>add-default-package<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>broken-refs<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>unknown-names<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>noname-attributes<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>duplicate-names<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>duplicate-metas<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>mandatory-package-meta<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>mandatory-home-meta<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>mandatory-version-meta<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>correct-package-meta<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>prohibited-package<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>external-weak-typed-atoms<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>unused-aliases<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>unit-test-without-phi<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>explicit-data<span class="nt">&lt;/sheet&gt;</span>
      <span class="nt">&lt;sheet&gt;</span>set-locators<span class="nt">&lt;/sheet&gt;</span>
   <span class="nt">&lt;/sheets&gt;</span>
   <span class="nt">&lt;license/&gt;</span>
   <span class="nt">&lt;metas&gt;</span>
      <span class="nt">&lt;meta</span> <span class="na">line=</span><span class="s">"1"</span><span class="nt">&gt;</span>
         <span class="nt">&lt;head&gt;</span>package<span class="nt">&lt;/head&gt;</span>
         <span class="nt">&lt;tail&gt;</span>eo.example<span class="nt">&lt;/tail&gt;</span>
         <span class="nt">&lt;part&gt;</span>eo.example<span class="nt">&lt;/part&gt;</span>
      <span class="nt">&lt;/meta&gt;</span>
      <span class="nt">&lt;meta</span> <span class="na">line=</span><span class="s">"4"</span><span class="nt">&gt;</span>
         <span class="nt">&lt;head&gt;</span>probe<span class="nt">&lt;/head&gt;</span>
         <span class="nt">&lt;tail&gt;</span>n.lt.if<span class="nt">&lt;/tail&gt;</span>
         <span class="nt">&lt;part&gt;</span>n.lt.if<span class="nt">&lt;/part&gt;</span>
      <span class="nt">&lt;/meta&gt;</span>
   <span class="nt">&lt;/metas&gt;</span>
   <span class="nt">&lt;objects&gt;</span>
      <span class="nt">&lt;o</span> <span class="na">abstract=</span><span class="s">""</span>
         <span class="na">line=</span><span class="s">"3"</span>
         <span class="na">loc=</span><span class="s">"Φ.eo.example.fibonacci"</span>
         <span class="na">name=</span><span class="s">"fibonacci"</span>
         <span class="na">pos=</span><span class="s">"0"</span><span class="nt">&gt;</span>
         <span class="nt">&lt;o</span> <span class="na">line=</span><span class="s">"3"</span> <span class="na">loc=</span><span class="s">"Φ.eo.example.fibonacci.n"</span> <span class="na">name=</span><span class="s">"n"</span> <span class="na">pos=</span><span class="s">"1"</span><span class="nt">/&gt;</span>
         <span class="nt">&lt;o</span> <span class="na">base=</span><span class="s">".if"</span>
            <span class="na">line=</span><span class="s">"4"</span>
            <span class="na">loc=</span><span class="s">"Φ.eo.example.fibonacci.φ"</span>
            <span class="na">name=</span><span class="s">"@"</span>
            <span class="na">pos=</span><span class="s">"2"</span><span class="nt">&gt;</span>
            <span class="nt">&lt;o</span> <span class="na">base=</span><span class="s">".lt"</span> <span class="na">line=</span><span class="s">"5"</span> <span class="na">loc=</span><span class="s">"Φ.eo.example.fibonacci.φ.ρ"</span> <span class="na">pos=</span><span class="s">"4"</span><span class="nt">&gt;</span>
               <span class="nt">&lt;o</span> <span class="na">base=</span><span class="s">"n"</span>
                  <span class="na">line=</span><span class="s">"6"</span>
                  <span class="na">loc=</span><span class="s">"Φ.eo.example.fibonacci.φ.ρ.ρ"</span>
                  <span class="na">pos=</span><span class="s">"6"</span>
                  <span class="na">ref=</span><span class="s">"3"</span><span class="nt">/&gt;</span>
               <span class="nt">&lt;o</span> <span class="na">base=</span><span class="s">"org.eolang.int"</span>
                  <span class="na">line=</span><span class="s">"7"</span>
                  <span class="na">loc=</span><span class="s">"Φ.eo.example.fibonacci.φ.ρ.α0"</span>
                  <span class="na">pos=</span><span class="s">"6"</span><span class="nt">&gt;</span>
                  <span class="nt">&lt;o</span> <span class="na">base=</span><span class="s">"org.eolang.bytes"</span>
                     <span class="na">data=</span><span class="s">"bytes"</span>
                     <span class="na">loc=</span><span class="s">"Φ.eo.example.fibonacci.φ.ρ.α0.α0"</span><span class="nt">&gt;</span>00 00 00 00 00 00 00 02<span class="nt">&lt;/o&gt;</span>
               <span class="nt">&lt;/o&gt;</span>
            <span class="nt">&lt;/o&gt;</span>
            <span class="nt">&lt;o</span> <span class="na">base=</span><span class="s">"n"</span>
               <span class="na">line=</span><span class="s">"8"</span>
               <span class="na">loc=</span><span class="s">"Φ.eo.example.fibonacci.φ.α0"</span>
               <span class="na">pos=</span><span class="s">"4"</span>
               <span class="na">ref=</span><span class="s">"3"</span><span class="nt">/&gt;</span>
            <span class="nt">&lt;o</span> <span class="na">base=</span><span class="s">".plus"</span> <span class="na">line=</span><span class="s">"9"</span> <span class="na">loc=</span><span class="s">"Φ.eo.example.fibonacci.φ.α1"</span> <span class="na">pos=</span><span class="s">"4"</span><span class="nt">&gt;</span>
               <span class="nt">&lt;o</span> <span class="na">base=</span><span class="s">"fibonacci"</span>
                  <span class="na">line=</span><span class="s">"10"</span>
                  <span class="na">loc=</span><span class="s">"Φ.eo.example.fibonacci.φ.α1.ρ"</span>
                  <span class="na">pos=</span><span class="s">"6"</span>
                  <span class="na">ref=</span><span class="s">"3"</span><span class="nt">&gt;</span>
                  <span class="nt">&lt;o</span> <span class="na">base=</span><span class="s">".minus"</span>
                     <span class="na">line=</span><span class="s">"11"</span>
                     <span class="na">loc=</span><span class="s">"Φ.eo.example.fibonacci.φ.α1.ρ.α0"</span>
                     <span class="na">pos=</span><span class="s">"9"</span><span class="nt">&gt;</span>
                     <span class="nt">&lt;o</span> <span class="na">base=</span><span class="s">"n"</span>
                        <span class="na">line=</span><span class="s">"11"</span>
                        <span class="na">loc=</span><span class="s">"Φ.eo.example.fibonacci.φ.α1.ρ.α0.ρ"</span>
                        <span class="na">pos=</span><span class="s">"8"</span>
                        <span class="na">ref=</span><span class="s">"3"</span><span class="nt">/&gt;</span>
                     <span class="nt">&lt;o</span> <span class="na">base=</span><span class="s">"org.eolang.int"</span>
                        <span class="na">line=</span><span class="s">"11"</span>
                        <span class="na">loc=</span><span class="s">"Φ.eo.example.fibonacci.φ.α1.ρ.α0.α0"</span>
                        <span class="na">pos=</span><span class="s">"16"</span><span class="nt">&gt;</span>
                        <span class="nt">&lt;o</span> <span class="na">base=</span><span class="s">"org.eolang.bytes"</span>
                           <span class="na">data=</span><span class="s">"bytes"</span>
                           <span class="na">loc=</span><span class="s">"Φ.eo.example.fibonacci.φ.α1.ρ.α0.α0.α0"</span><span class="nt">&gt;</span>00 00 00 00 00 00 00 01<span class="nt">&lt;/o&gt;</span>
                     <span class="nt">&lt;/o&gt;</span>
                  <span class="nt">&lt;/o&gt;</span>
               <span class="nt">&lt;/o&gt;</span>
               <span class="nt">&lt;o</span> <span class="na">base=</span><span class="s">"fibonacci"</span>
                  <span class="na">line=</span><span class="s">"12"</span>
                  <span class="na">loc=</span><span class="s">"Φ.eo.example.fibonacci.φ.α1.α0"</span>
                  <span class="na">pos=</span><span class="s">"6"</span>
                  <span class="na">ref=</span><span class="s">"3"</span><span class="nt">&gt;</span>
                  <span class="nt">&lt;o</span> <span class="na">base=</span><span class="s">".minus"</span>
                     <span class="na">line=</span><span class="s">"13"</span>
                     <span class="na">loc=</span><span class="s">"Φ.eo.example.fibonacci.φ.α1.α0.α0"</span>
                     <span class="na">pos=</span><span class="s">"9"</span><span class="nt">&gt;</span>
                     <span class="nt">&lt;o</span> <span class="na">base=</span><span class="s">"n"</span>
                        <span class="na">line=</span><span class="s">"13"</span>
                        <span class="na">loc=</span><span class="s">"Φ.eo.example.fibonacci.φ.α1.α0.α0.ρ"</span>
                        <span class="na">pos=</span><span class="s">"8"</span>
                        <span class="na">ref=</span><span class="s">"3"</span><span class="nt">/&gt;</span>
                     <span class="nt">&lt;o</span> <span class="na">base=</span><span class="s">"org.eolang.int"</span>
                        <span class="na">line=</span><span class="s">"13"</span>
                        <span class="na">loc=</span><span class="s">"Φ.eo.example.fibonacci.φ.α1.α0.α0.α0"</span>
                        <span class="na">pos=</span><span class="s">"16"</span><span class="nt">&gt;</span>
                        <span class="nt">&lt;o</span> <span class="na">base=</span><span class="s">"org.eolang.bytes"</span>
                           <span class="na">data=</span><span class="s">"bytes"</span>
                           <span class="na">loc=</span><span class="s">"Φ.eo.example.fibonacci.φ.α1.α0.α0.α0.α0"</span><span class="nt">&gt;</span>00 00 00 00 00 00 00 02<span class="nt">&lt;/o&gt;</span>
                     <span class="nt">&lt;/o&gt;</span>
                  <span class="nt">&lt;/o&gt;</span>
               <span class="nt">&lt;/o&gt;</span>
            <span class="nt">&lt;/o&gt;</span>
         <span class="nt">&lt;/o&gt;</span>
      <span class="nt">&lt;/o&gt;</span>
   <span class="nt">&lt;/objects&gt;</span>
<span class="nt">&lt;/program&gt;</span>
</code></pre></div></div>

<p>And its φ-calculus representation:</p>

<pre><code class="language-phi">{
    eo ↦ ⟦
        example ↦ ⟦
            fibonacci ↦ ⟦
                n ↦ ∅,
                φ ↦ ξ.n.lt(
                    α0 ↦ Φ.org.eolang.int(
                        α0 ↦ Φ.org.eolang.bytes(Δ ⤍ 00-00-00-00-00-00-00-02)
                    )
                ).if(
                    α0 ↦ ξ.n,
                    α1 ↦ ξ.ρ.fibonacci(
                        α0 ↦ ξ.n.minus(
                            α0 ↦ Φ.org.eolang.int(
                                α0 ↦ Φ.org.eolang.bytes(Δ ⤍ 00-00-00-00-00-00-00-01)
                            )
                        )
                    ).plus(
                        α0 ↦ ξ.ρ.fibonacci(
                            α0 ↦ ξ.n.minus(
                                α0 ↦ Φ.org.eolang.int(
                                    α0 ↦ Φ.org.eolang.bytes(Δ ⤍ 00-00-00-00-00-00-00-02)
                                )
                            )
                        )
                    )
                )
            ⟧,
            λ ⤍ Package
        ⟧,
        λ ⤍ Package
    ⟧
}
</code></pre>

<p>That’s it for now, be in touch.</p>]]></content><author><name>maxonfjvipon</name></author><summary type="html"><![CDATA[In the recently released version 0.34.0, we have implemented several changes to EO. Today, we will discuss the conversion of EO to φ-calculus expression and vice versa.]]></summary></entry><entry><title type="html">$ Object</title><link href="https://news.eolang.org/2023-11-15-this.html" rel="alternate" type="text/html" title="$ Object" /><published>2023-11-15T00:00:00+03:00</published><updated>2023-11-15T00:00:00+03:00</updated><id>https://news.eolang.org/this</id><content type="html" xml:base="https://news.eolang.org/2023-11-15-this.html"><![CDATA[<p>In the world of EO programming, the <code class="language-plaintext highlighter-rouge">$</code> object acts as syntactic sugar that refers to the current abstract object it is used in.
This seemingly simple yet powerful feature provides programmers with an elegant way to manipulate and access objects within their code,
ultimately enhancing readability and ease of use.
In this blog post, we will dive deep into the concept of the <code class="language-plaintext highlighter-rouge">$</code> object and shed light on its practical applications through illustrative examples.</p>

<!--more-->

<h3 id="understanding-the--object">Understanding the $ Object</h3>
<p>Upon encountering the <code class="language-plaintext highlighter-rouge">$</code> symbol in EO code, it is important to recognize its true significance.
The <code class="language-plaintext highlighter-rouge">$</code> object essentially serves as a reference to the abstract object within which it is utilized.
By leveraging this syntactic sugar, developers can harness the power of the current object without explicitly referring to it by name.
This concise and intuitive approach enhances code clarity and conciseness, leading to more efficient and maintainable codebases.</p>

<h3 id="an-example">An Example</h3>
<p>Let’s examine a code snippet to better understand how the <code class="language-plaintext highlighter-rouge">$</code> object functions within the EO programming language:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[] &gt; foo
  assert-that &gt; @
    2.plus 2
    $.equal-to 4
</code></pre></div></div>

<p>In this example, we define an abstract object named <code class="language-plaintext highlighter-rouge">foo</code>. Within the <code class="language-plaintext highlighter-rouge">assert-that</code> scope, we pass the <code class="language-plaintext highlighter-rouge">2.plus 2</code> object as the parameter to it,
and the second object’s matcher, then verify whether it is equal to <code class="language-plaintext highlighter-rouge">4</code>, using the <code class="language-plaintext highlighter-rouge">$</code> object as a reference.
Upon initial inspection, the code may seem a bit puzzling. However, we can break it down to reveal its true meaning:</p>

<ol>
  <li>Firstly, <code class="language-plaintext highlighter-rouge">$</code> refers to the nearest abstract object, <code class="language-plaintext highlighter-rouge">foo</code>:
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[] &gt; foo
  assert-that &gt; @
 2.plus 2
 foo.equal-to 4
</code></pre></div>    </div>
    <p>But the <code class="language-plaintext highlighter-rouge">foo</code> object does not have an <code class="language-plaintext highlighter-rouge">equal-to</code> object. So, the EO compiler needs to find an object that has the <code class="language-plaintext highlighter-rouge">equal-to</code> object.</p>
  </li>
  <li>Secondly, the EO compiler tries to get <code class="language-plaintext highlighter-rouge">foo.@</code> and take <code class="language-plaintext highlighter-rouge">equal-to</code> from there:
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[] &gt; foo
  assert-that &gt; @
 2.plus 2
 foo.@.equal-to 4
</code></pre></div>    </div>
  </li>
  <li>Finally, the compiler finds the <code class="language-plaintext highlighter-rouge">equal-to</code> object in the <code class="language-plaintext highlighter-rouge">assert-that</code> object and takes it from there:
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[] &gt; foo
  assert-that &gt; @
 2.plus 2
 assert-that.equal-to 4
</code></pre></div>    </div>
    <p>By using <code class="language-plaintext highlighter-rouge">$</code> as a reference, we can directly access the <code class="language-plaintext highlighter-rouge">assert-that</code> object while within the <code class="language-plaintext highlighter-rouge">foo</code> scope.
Here is the example of the <code class="language-plaintext highlighter-rouge">assert-that</code> object for better understanding:</p>
  </li>
</ol>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[actual matcher] &gt; assert-that
...
  [expected] &gt; equal-to
    actual.eq expected &gt; @
</code></pre></div></div>

<h3 id="practical-applications-of-the--object">Practical Applications of the $ Object</h3>
<p>Undoubtedly, the <code class="language-plaintext highlighter-rouge">$</code> object’s syntactic sugar provides programmers with a clean and expressive way to work with objects.
The following scenarios highlight its practical applications:</p>
<ol>
  <li>Chaining Methods:
By utilizing the <code class="language-plaintext highlighter-rouge">$</code> object, we can succinctly chain methods together, simplifying complex operations.
This leads to more readable and concise code, enhancing collaboration among team members and reducing the chances of introducing bugs.</li>
  <li>Context Independence:
The <code class="language-plaintext highlighter-rouge">$</code> object allows developers to maintain the context of their code while reducing the need for lengthy and repetitive object references.
It facilitates writing clean and modular code that is easier to understand and maintain.</li>
</ol>

<h3 id="conclusion">Conclusion</h3>
<p>In conclusion, the <code class="language-plaintext highlighter-rouge">$</code> object serves as vital syntactic sugar in the EO programming language, offering developers an elegant way to refer to the current
abstract object within their code.
By leveraging this feature, programmers can enhance the readability and conciseness of their code, ultimately improving collaboration and productivity.
Understanding the true meaning behind the <code class="language-plaintext highlighter-rouge">$</code> object allows developers to unlock its full potential and leverage it in various scenarios,
from method chaining to context independence.</p>

<p>So, embrace the <code class="language-plaintext highlighter-rouge">$</code> object and embrace the power of EO programming!</p>]]></content><author><name>graur</name></author><summary type="html"><![CDATA[In the world of EO programming, the $ object acts as syntactic sugar that refers to the current abstract object it is used in. This seemingly simple yet powerful feature provides programmers with an elegant way to manipulate and access objects within their code, ultimately enhancing readability and ease of use. In this blog post, we will dive deep into the concept of the $ object and shed light on its practical applications through illustrative examples.]]></summary></entry><entry><title type="html">Comparison of 0.0 and -0.0</title><link href="https://news.eolang.org/2023-11-02-comparison-of-floating-zeros.html" rel="alternate" type="text/html" title="Comparison of 0.0 and -0.0" /><published>2023-11-02T00:00:00+03:00</published><updated>2023-11-02T00:00:00+03:00</updated><id>https://news.eolang.org/comparison-of-floating-zeros</id><content type="html" xml:base="https://news.eolang.org/2023-11-02-comparison-of-floating-zeros.html"><![CDATA[<p>Due to the peculiarities of working with data in EO, an interesting quirk arose when comparing <code class="language-plaintext highlighter-rouge">0.0</code> and
<code class="language-plaintext highlighter-rouge">-0.0.</code> The fact is that in EO these two values were not considered equal until we made changes.</p>

<p>Until recently, the comparison of <code class="language-plaintext highlighter-rouge">0.0</code> and <code class="language-plaintext highlighter-rouge">-0.0</code> in EO didn’t work like in other languages, but we changed that. This
short blog post provides a simplified explanation of number encodings, how such comparison takes place in popular
programming languages, and how we changed this comparison in EO to meet the standard.</p>

<!--more-->

<h3 id="why-do-we-have-two-zeros">Why do we have two zeros?</h3>

<p>Without delving into the intricacies of number encoding and standards, let’s briefly understand why this happens.</p>

<p>The familiar <code class="language-plaintext highlighter-rouge">signed int</code> works based on the <a href="https://en.wikipedia.org/wiki/Two%27s_complement">two’s complement</a>
principle, in which zero has a unique representation (all bits are <code class="language-plaintext highlighter-rouge">0</code>).</p>

<p>On the other hand, <code class="language-plaintext highlighter-rouge">float</code> operates differently, using the <a href="https://en.wikipedia.org/wiki/IEEE_754">IEEE 754</a> standard
for encoding and arithmetic operations. In this standard, numbers have a sign bit. If the sign bit is <code class="language-plaintext highlighter-rouge">1</code>, the number is
negative; if it’s <code class="language-plaintext highlighter-rouge">0</code>, the number is positive. As a result, we have two different binary representations of float
zero: <code class="language-plaintext highlighter-rouge">0.0</code> has all zeros in its binary representation, while <code class="language-plaintext highlighter-rouge">-0.0</code> has all zeros except for the sign bit.</p>

<h3 id="comparison-of-00-and--00-in-eo-before-the-changes">Comparison of 0.0 and -0.0 in EO before the changes</h3>

<p>EO comparison used to work as follows:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>0.0.eq -0.0 # FALSE
0.0.gt -0.0 # FALSE
0.0.lt -0.0 # FALSE
0.0.gte -0.0 # FALSE
0.0.lte -0.0 # FALSE
</code></pre></div></div>

<p>This happened because the <code class="language-plaintext highlighter-rouge">eq</code> attribute compared data within objects bitwise. In simpler terms, regardless of the data
being compared, it was first interpreted as a set of bits and then compared.</p>

<p>Thus, due to the fact that numbers <code class="language-plaintext highlighter-rouge">0.0</code> and <code class="language-plaintext highlighter-rouge">-0.0</code>, as previously determined, have different bitwise representations,
when compared in EO using <code class="language-plaintext highlighter-rouge">eq</code>, they turned out to be not equal.</p>

<h3 id="comparison-of-00-and--00-in-other-languages">Comparison of 0.0 and -0.0 in other languages</h3>

<p>In most mainstream programming languages <code class="language-plaintext highlighter-rouge">0.0</code> is considered equal to <code class="language-plaintext highlighter-rouge">-0.0</code> in basic equality comparisons. For
example, in Java, C++, JavaScript, and Python, the comparison of these values works as follows:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="mf">0.0</span> <span class="o">==</span> <span class="o">-</span><span class="mf">0.0</span> <span class="c1">// true</span>
<span class="mf">0.0</span> <span class="o">&lt;</span> <span class="o">-</span><span class="mf">0.0</span> <span class="c1">// false</span>
<span class="mf">0.0</span> <span class="o">&gt;</span> <span class="o">-</span><span class="mf">0.0</span> <span class="c1">// false</span>
<span class="mf">0.0</span> <span class="o">&lt;=</span> <span class="o">-</span><span class="mf">0.0</span> <span class="c1">// true</span>
<span class="mf">0.0</span> <span class="o">&gt;=</span> <span class="o">-</span><span class="mf">0.0</span> <span class="c1">// true</span>
</code></pre></div></div>

<p>Why do these languages consider <code class="language-plaintext highlighter-rouge">0.0</code> and <code class="language-plaintext highlighter-rouge">-0.0</code> as equal, even though they have different bitwise representations? The
same IEEE 754 standard states that <em>“negative zero and positive zero should compare as equal with the usual (numerical)
comparison operators”</em> (referencing the standard in the blog post isn’t possible as it’s a paid document, but you can
find this information <a href="https://en.wikipedia.org/wiki/Signed_zero">here</a>).</p>

<p>Thus, this behavior for float numbers is built into most CPUs and works at the assembler level. Comparison operators,
such as <code class="language-plaintext highlighter-rouge">==</code>, in the languages discussed above, correspond to how it is implemented in the hardware. This is indeed the
case in most languages.</p>

<h3 id="comparison-of-00-and--00-in-eo-now">Comparison of 0.0 and -0.0 in EO now</h3>

<p>In order for the floating-point comparison in EO to comply with the standard, we have changed the behavior of the <code class="language-plaintext highlighter-rouge">eq</code>
attribute for <code class="language-plaintext highlighter-rouge">float</code>. After these changes, the comparison of <code class="language-plaintext highlighter-rouge">0.0</code> and <code class="language-plaintext highlighter-rouge">-0.0</code> behaves as follows:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>0.0.eq -0.0 # TRUE
0.0.gt -0.0 # FALSE
0.0.lt -0.0 # FALSE
0.0.gte -0.0 # TRUE
0.0.lte -0.0 # TRUE
</code></pre></div></div>

<p>Now it works like in all popular programming languages. It’s worth noting that we didn’t add extra atoms (you can read
more about atoms in <a href="https://news.eolang.org/2022-12-02-java-atoms.html">this</a> blog post). The <code class="language-plaintext highlighter-rouge">eq</code> attribute still
compares floats bitwise; we simply added a special condition for zeros.</p>

<h3 id="conclusion">Conclusion</h3>

<p>We changed the <code class="language-plaintext highlighter-rouge">eq</code> attribute of <code class="language-plaintext highlighter-rouge">float</code> to meet the IEEE 754 standard. Significant reasons are needed to deviate from the
standard, so we decided that it would be more correct to do as in other programming languages.</p>]]></content><author><name>c71n93</name></author><summary type="html"><![CDATA[Due to the peculiarities of working with data in EO, an interesting quirk arose when comparing 0.0 and -0.0. The fact is that in EO these two values were not considered equal until we made changes. Until recently, the comparison of 0.0 and -0.0 in EO didn’t work like in other languages, but we changed that. This short blog post provides a simplified explanation of number encodings, how such comparison takes place in popular programming languages, and how we changed this comparison in EO to meet the standard.]]></summary></entry><entry><title type="html">Application to application</title><link href="https://news.eolang.org/2023-10-04-application-to-application.html" rel="alternate" type="text/html" title="Application to application" /><published>2023-10-04T00:00:00+03:00</published><updated>2023-10-04T00:00:00+03:00</updated><id>https://news.eolang.org/application-to-application</id><content type="html" xml:base="https://news.eolang.org/2023-10-04-application-to-application.html"><![CDATA[<p>In the process of working on the recent release
<a href="https://github.com/objectionary/eo/releases/tag/0.32.0">0.32.0</a>, we’ve faced an interesting case
related to one of the fundamental concepts of EO in particular and phi-calculus in general -
application.</p>

<p>This blog post will attempt to explain what application is under the hood, how it works in our
compiler, and why this code <code class="language-plaintext highlighter-rouge">(arr.at 0) "Hello"</code> does not work in the way you expect.</p>

<!--more-->

<h3 id="application">Application</h3>
<p>Application is the process of copying an abstract object while specifying some of its free
attributes.</p>

<p>Consider the example. Here, <code class="language-plaintext highlighter-rouge">dog</code> is an abstract object with one free attribute: <code class="language-plaintext highlighter-rouge">name</code>.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[name] &gt; dog
  stdout &gt; bark
    sprintf
      "I'm %s! Woof!"
      name
</code></pre></div></div>

<p>Abstract objects are like templates or factories for concrete objects. So, getting a specific
instance of a <code class="language-plaintext highlighter-rouge">dog</code> occurs in two stages: copying and setting a free attribute. The copying process
takes place behind the scenes. Thus, we obtain a new specified object, <code class="language-plaintext highlighter-rouge">dog</code>, with its <code class="language-plaintext highlighter-rouge">name</code> as
“Bary”.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dog "Bary" &gt; bary
</code></pre></div></div>

<p>At the Java level (into which EO is being translated), application looks something like this:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">Phi</span> <span class="n">dog</span> <span class="o">=</span> <span class="nc">Phi</span><span class="o">.</span><span class="na">Ф</span><span class="o">.</span><span class="na">attr</span><span class="o">(</span><span class="s">"org.eolang.dog"</span><span class="o">).</span><span class="na">get</span><span class="o">();</span> <span class="c1">// finding an abstract object "dog"</span>
<span class="nc">Phi</span> <span class="n">copy</span> <span class="o">=</span> <span class="n">dog</span><span class="o">.</span><span class="na">copy</span><span class="o">();</span>                        <span class="c1">// copying/cloning an abstract object</span>
<span class="n">copy</span><span class="o">.</span><span class="na">attr</span><span class="o">(</span><span class="s">"name"</span><span class="o">).</span><span class="na">put</span><span class="o">(</span><span class="s">"Bary"</span><span class="o">);</span>                <span class="c1">// setting the free attribute</span>
</code></pre></div></div>

<p>As you can see, no object execution occurs. It’s vital to note and remember that everything that
happens during the application involves getting a new object by copying and setting its internal
state. Nothing more.</p>

<h3 id="application-to-application">Application to application</h3>

<p>However, despite knowing what application is, we encountered an interesting problem for which we
couldn’t find a solution for a long time.</p>

<p>Consider the following code:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1. [name] &gt; dog
2.   "I'm %s! Woof!" &gt; bark
3. * dog &gt; arr
4. (arr.at 0) "Bary" &gt; bary
</code></pre></div></div>

<ul>
  <li>As before, <code class="language-plaintext highlighter-rouge">dog</code> is an abstract object with one free attribute, <code class="language-plaintext highlighter-rouge">name</code>.</li>
  <li>In the third line, an abstract object <code class="language-plaintext highlighter-rouge">dog</code> is stored in an array.</li>
  <li>In the fourth line, we attempt to retrieve an abstract object <code class="language-plaintext highlighter-rouge">dog</code> from the array by applying
object <code class="language-plaintext highlighter-rouge">0</code> to <code class="language-plaintext highlighter-rouge">arr.at</code> (in simpler words, we’re trying to access the first element of the array)
and then set the object <code class="language-plaintext highlighter-rouge">"Bary"</code> as the free attribute <code class="language-plaintext highlighter-rouge">name</code> of the <code class="language-plaintext highlighter-rouge">dog</code>.</li>
</ul>

<p>We can try to clarify the code like this:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1. [name] &gt; dog
2.   "I'm %s! Woof!" &gt; bark
3. * dog &gt; arr
4. arr.at 0 &gt; first
5. first "Bary" &gt; bary
</code></pre></div></div>

<p>It appears that everything is fine, and the code should work, but it doesn’t, and moreover, it must
not.</p>

<h3 id="whats-wrong">What’s wrong</h3>

<p>It all comes down to the application discussed earlier. No object execution occurs during the
application. So if you take a closer look at the fourth line:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>4. arr.at 0 &gt; first
</code></pre></div></div>

<p>there is no information about what’s inside the array. It simply sets the object <code class="language-plaintext highlighter-rouge">0</code> as the free
attribute of the object <code class="language-plaintext highlighter-rouge">arr.at</code>, and that’s it.</p>

<p>And what happens next in the fifth line:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>5. first "Bary" &gt; bary
</code></pre></div></div>

<p>We’re taking an object <code class="language-plaintext highlighter-rouge">first</code> (which is just a reference to the object <code class="language-plaintext highlighter-rouge">arr.at</code> with an already
specified free attribute) and then trying to specify its free attribute again.</p>

<p>And obviously (perhaps not so obvious), this leads to an error because we’re trying to set the same
free attribute twice.</p>

<h3 id="so-whats-the-solution">So, what’s the solution?</h3>

<p>Firstly, code where application is placed at the “head” of another application is now prohibited at
the grammar level:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(arr.at 0) "Bary"
</code></pre></div></div>

<p>Secondly, we found out that such cases can be easily resolved with code like this:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(arr.at 0).@ "Bary" &gt; bary
</code></pre></div></div>

<p>Here, we first specify the free attribute of the object <code class="language-plaintext highlighter-rouge">arr.at</code>, and then we access its <code class="language-plaintext highlighter-rouge">@</code>
attribute and apply the object <code class="language-plaintext highlighter-rouge">"Bary"</code> to it.</p>

<p>The information about the abstract object <code class="language-plaintext highlighter-rouge">dog</code> stored inside the array is revealed when we access
the <code class="language-plaintext highlighter-rouge">@</code> attribute of the object <code class="language-plaintext highlighter-rouge">arr.at</code>.</p>

<p>In this particular case, <code class="language-plaintext highlighter-rouge">arr.at.@</code> is a so-called lambda object that performs calculations and
returns the object from the array by providing an index. It’s worth noting that if the free
attribute of <code class="language-plaintext highlighter-rouge">arr.at</code> is not specified, the following code:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>arr.at.@
</code></pre></div></div>

<p>will fail with an error.</p>

<p>I hope you’ve learned a little more about EO today. Stay tuned for updates and be in touch!</p>]]></content><author><name>maxonfjvipon</name></author><summary type="html"><![CDATA[In the process of working on the recent release 0.32.0, we’ve faced an interesting case related to one of the fundamental concepts of EO in particular and phi-calculus in general - application. This blog post will attempt to explain what application is under the hood, how it works in our compiler, and why this code (arr.at 0) "Hello" does not work in the way you expect.]]></summary></entry></feed>