<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="/rss.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Andrey Listopadov</title>
    <link>https://andreyor.st/tags/rust/</link>
    <image>
      <title>Andrey Listopadov</title>
      <link>https://andreyor.st/tags/rust/</link>
      <url>https://andreyor.st/tags/rust/favicon-64.png</url>
    </image>
    <description>Posts tagged 'rust' by Andrey Listopadov</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <copyright>Andrey Listopadov 2020-2026 - This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</copyright>
    <lastBuildDate>Fri, 03 Apr 2020 15:37:00 +0300</lastBuildDate>
    <atom:link href="https://andreyor.st/tags/rust/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>GRScheme Design Part 3 - Quasiquoting</title>
      <link>https://andreyor.st/posts/2020-04-03-grscheme-design-part-3/</link>
      <guid>https://andreyor.st/posts/2020-04-03-grscheme-design-part-3/</guid>
      <description>&lt;p&gt;At the end of the &lt;a href=&#34;https://andreyor.st/posts/2020-03-22-grscheme-design-part-2/#quasiquoting-unquoting-and-unquote-splicing&#34;&gt;Part 2&lt;/a&gt; I mentioned that quasiquoting was problematic in GRScheme, due to some of the internal representations and algorithms, but now it is not an issue (I hope).&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve figured out the correct way to maintain a list invariant, splice one tree into another tree, and so on.
So this post will describe how &lt;code&gt;quasiquote&lt;/code&gt;, &lt;code&gt;unquote&lt;/code&gt;, and &lt;code&gt;unquote-splicing&lt;/code&gt; procedures are done in GRScheme.&lt;/p&gt;
&lt;p&gt;Also, I should mention, that I&amp;rsquo;ve changed my mind, and now results are printed without the leading quote:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;;; before&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;car&lt;/span&gt; &amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;c&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;car&lt;/span&gt; &amp;#39;(&amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;c&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;&amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;;; now&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;car&lt;/span&gt; &amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;c&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;a
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;car&lt;/span&gt; &amp;#39;(&amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;c&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I was using this format because Racket language was the first thing I saw when I touched the world of Scheme and Lisp, so it was natural to me, to see that results are quoted.
Although after some interactions with Clojure, Common Lisp, and GNU Guile, I&amp;rsquo;ve changed my mind.
This doesn&amp;rsquo;t affect internal representation though, only printing.
But if you don&amp;rsquo;t know about it, it probably will not matter at all.&lt;/p&gt;
&lt;h2 id=&#34;quasiquoting&#34;&gt;Quasiquoting&lt;/h2&gt;
&lt;p&gt;First things I&amp;rsquo;ve did were &lt;code&gt;quasiquote&lt;/code&gt; and &lt;code&gt;unquote&lt;/code&gt;.
Although those are directly related, since we can&amp;rsquo;t use &lt;code&gt;unquote&lt;/code&gt; outside of &lt;code&gt;quasiquote&lt;/code&gt;, let&amp;rsquo;s first look at how plain &lt;code&gt;quasiquote&lt;/code&gt; behaves.&lt;/p&gt;
&lt;p&gt;In Racket, &lt;code&gt;quasiquote&lt;/code&gt; of any quote-able form yields quoted form:&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; code examples below are representing Racket and GRScheme REPLs, so for better distinguishing purposes, each prompt will be marked with a language name, e.g. &lt;code&gt;racket&amp;gt;&lt;/code&gt; or &lt;code&gt;grscheme&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;racket&amp;gt; `&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;racket&amp;gt; `(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is also the case for GRScheme:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grscheme&amp;gt; `&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;a
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grscheme&amp;gt; `(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(a)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;All nested &lt;code&gt;quasiquote&lt;/code&gt; calls are preserved in their original form, e.g. not changed to &lt;code&gt;quote&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;racket&amp;gt; ``&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;`&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;racket&amp;gt; `(`&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(`&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And in GRScheme:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grscheme&amp;gt; ``&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;`&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grscheme&amp;gt; `(`&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(`&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This means that the interpreter should be aware of what quasiquote it is expanding at the moment - is it nested or not?
We&amp;rsquo;re not going to explicitly check for this by analyzing expressions up the tree, but instead, we&amp;rsquo;ll add a counter to our &lt;code&gt;eval&lt;/code&gt; function:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;eval&lt;/span&gt;(&amp;amp;&lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;, expression: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;NodePtr&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Result&lt;/span&gt;&amp;lt;NodePtr, EvalError&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; stack = vec![expression.clone()];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; res = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;None&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; quasiquote_level = 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(expr) = stack.last() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        res = &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::expression_type(&amp;amp;expr) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// …
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So when our &lt;code&gt;quasiquote_level&lt;/code&gt; is zero, we&amp;rsquo;re going to interpret its result as quoted form, and as &lt;code&gt;quasiquote&lt;/code&gt; form otherwise.
I know that this is probably not the best way to manage this, but believe me, the worst is yet to come.
Quasiquoting in GRScheme is really ad hoc right now, but it works.&lt;/p&gt;
&lt;p&gt;Now we need to actually interpret &lt;code&gt;quasiquote&lt;/code&gt; forms.
Let&amp;rsquo;s look at &lt;code&gt;match&lt;/code&gt; arms that are responsible for that:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;eval&lt;/span&gt;(&amp;amp;&lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;, expression: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;NodePtr&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Result&lt;/span&gt;&amp;lt;NodePtr, EvalError&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; stack = vec![expression.clone()];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; res = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;None&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; quasiquote_level = 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; unquote_level = 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(expr) = stack.last() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        res = &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::expression_type(&amp;amp;expr) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// …
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;            Type::Quasiquote &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; quasiquote_level == 0 || quasiquote_level == unquote_level =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; args = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::rest_expressions(&amp;amp;expr)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; unquotes = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::pre_quasiquote(&amp;amp;args)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; !unquotes.is_empty() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    stack.extend_from_slice(&amp;amp;unquotes);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                quasiquote_level += 1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;font-weight:bold&#34;&gt;continue&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Type::Quasiquote =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; (res, _) = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::quote(&amp;amp;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::rest_expressions(&amp;amp;expr)?)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Tree::replace_tree(&amp;amp;expr, res);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                quasiquote_level -= 1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                stack.pop()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// …
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notice that I&amp;rsquo;ve added &lt;code&gt;unquote_level&lt;/code&gt; counter, and we use both to decide what &lt;code&gt;match&lt;/code&gt; arm to take.
If our &lt;code&gt;quasiquote_level&lt;/code&gt; is &lt;code&gt;0&lt;/code&gt; or our &lt;code&gt;quasiquote_level&lt;/code&gt; is equal to &lt;code&gt;unquote_level&lt;/code&gt; we&amp;rsquo;re taking first branch, that extends our tree traversal stack, increments &lt;code&gt;quasiquote_level&lt;/code&gt; and goes to next iteration.
Otherwise, we &lt;code&gt;quote&lt;/code&gt; the result, which means that we&amp;rsquo;re out of current &lt;code&gt;quasiquote&lt;/code&gt; context.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look at the first arm in more detail.
Let&amp;rsquo;s imagine that we&amp;rsquo;re evaluating &lt;code&gt;`(a b ,c d)&lt;/code&gt; expression here.
First, we take out the vector of all arguments to &lt;code&gt;quasiquote&lt;/code&gt;, which in this case is &lt;code&gt;[a, b, (unquote c), d]&lt;/code&gt;.
Next we pass it to &lt;code&gt;pre_quasiquote&lt;/code&gt; procedure.
As was described in &lt;a href=&#34;https://andreyor.st/posts/2020-03-22-grscheme-design-part-2/&#34;&gt;Part 2&lt;/a&gt; all &lt;code&gt;pre_something&lt;/code&gt; procedures are used to decide what arguments should be evaluated before we go further.
Mostly what we did before, was just filtering of arguments based on their type.
But that&amp;rsquo;s not really the case for &lt;code&gt;pre_quasiquote&lt;/code&gt;, because &lt;code&gt;unquote&lt;/code&gt; has another property that must be maintained.
But first, let&amp;rsquo;s what &lt;code&gt;unquote&lt;/code&gt; does.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look at this expression:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;racket&amp;gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;define&lt;/span&gt; c 42)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;racket&amp;gt; `(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; ,c &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;d&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; 42 &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;d&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can see that &lt;code&gt;,c&lt;/code&gt; was replaced with the value of &lt;code&gt;c&lt;/code&gt;.
That&amp;rsquo;s what &lt;code&gt;unquote&lt;/code&gt; does in &lt;code&gt;quasiquote&lt;/code&gt;.
One can think of quasiquoting as of inversion of evaluation of &lt;code&gt;list&lt;/code&gt; arguments:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;racket&amp;gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;list&lt;/span&gt; &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; c &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;d&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; 42 &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;c&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can see that everything was quoted except &lt;code&gt;c&lt;/code&gt;.
In &lt;code&gt;quasiquote&lt;/code&gt; form only &lt;code&gt;c&lt;/code&gt; was unquoted.
But there&amp;rsquo;s another property for &lt;code&gt;unquote&lt;/code&gt; and it is &lt;code&gt;quasiquote&lt;/code&gt; nesting level:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;racket&amp;gt; `(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; ,&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;c&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;d&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; 42 &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;c&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nothing changed, &lt;code&gt;c&lt;/code&gt; still evaluates to &lt;code&gt;42&lt;/code&gt;, but if we change &lt;code&gt;&#39;&lt;/code&gt; to &lt;code&gt;`&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;racket&amp;gt; `(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; `(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; ,c &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;d&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; `(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; ,&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;c&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;d&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nothing happened to &lt;code&gt;c&lt;/code&gt;.
This is because there were two nested &lt;code&gt;quasiquote&lt;/code&gt; calls and only one &lt;code&gt;unquote&lt;/code&gt; one.
If we add another &lt;code&gt;unquote&lt;/code&gt; we&amp;rsquo;ll see this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;racket&amp;gt; `(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; `(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; ,,c &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;d&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; `(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; ,42 &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;d&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;,c&lt;/code&gt; was replaced by &lt;code&gt;42&lt;/code&gt;, but outer &lt;code&gt;,&lt;/code&gt; is still there, thus &lt;code&gt;,42&lt;/code&gt; is the result of &lt;code&gt;,,c&lt;/code&gt;.
Nested &lt;code&gt;quasiquotes&lt;/code&gt; must be escaped by the same amount of nested &lt;code&gt;unquotes&lt;/code&gt;.
This is also the case for &lt;code&gt;unquote-splicing&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Racket documentation features this weird expression:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;racket&amp;gt; `(1 ```,,@,,@(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;list&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;+&lt;/span&gt; 1 2)) 4)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(1 ```,,@,3 4)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That is quite complex, but it works in GRScheme in the same way:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grscheme&amp;gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;define&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;list&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;lambda&lt;/span&gt; x x))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grscheme&amp;gt; `(1 ```,,@,,@(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;list&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;+&lt;/span&gt; 1 2)) 4)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(1 ```,,@,3 4)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With this information, we can now look at how &lt;code&gt;pre_quasiquote&lt;/code&gt; is implemented.&lt;/p&gt;
&lt;h3 id=&#34;filtering-arguments-for-quasiquote&#34;&gt;Filtering arguments for &lt;code&gt;quasiquote&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;pre_quasiquote&lt;/code&gt; procedure is quite big, so we&amp;rsquo;ll split it into parts as was done in previous posts.&lt;/p&gt;
&lt;p&gt;The first thing we do is check for argument count, and create two stacks, one for tree traversal, and another for &lt;code&gt;unquote&lt;/code&gt; forms that are valid to evaluate:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;pre_quasiquote&lt;/span&gt;(args: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;[NodePtr]) -&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Result&lt;/span&gt;&amp;lt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Vec&lt;/span&gt;&amp;lt;NodePtr&amp;gt;, EvalError&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::check_argument_count(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;quasiquote&amp;#34;&lt;/span&gt;, ArgAmount::NotEqual(1), args)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; stack = vec![args[0].clone()];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; unquotes = vec![];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// …
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Ok&lt;/span&gt;(unquotes)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the end, we will return a vector of &lt;code&gt;unquote&lt;/code&gt; forms, which may be empty, if no valid forms were found, either because of the fact that levels weren&amp;rsquo;t balanced, or because there simply were no &lt;code&gt;unquote&lt;/code&gt; calls.&lt;/p&gt;
&lt;p&gt;Next, we  iterate over our stack,  as in &lt;code&gt;eval&lt;/code&gt; procedure, and check for
expression type on each iteration:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(expr) = stack.pop() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::expression_type(&amp;amp;expr) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// …
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Depending on what type we&amp;rsquo;ve got we going to, either put it to the stack, put it to quotes, or continue.
The first type, which is the simplest case, that we need to check is &lt;code&gt;Procedure&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type::Procedure =&amp;gt; stack.extend_from_slice(&amp;amp;expr.borrow().siblings),
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If we see &lt;code&gt;(something …)&lt;/code&gt; we expand our stack with all inside expressions, and &lt;code&gt;continue&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Next arm checks for &lt;code&gt;Quasiquote&lt;/code&gt;, &lt;code&gt;Symbol&lt;/code&gt;, and &lt;code&gt;List&lt;/code&gt;.
We do one more check for arguments, because all these types take exactly one argument, and if everything is OK, we &lt;code&gt;continue&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type::Quasiquote | Type::Symbol | Type::List =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; args = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::rest_expressions(&amp;amp;expr)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::check_argument_count(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;quasiquote&amp;#34;&lt;/span&gt;, ArgAmount::NotEqual(1), &amp;amp;args)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    stack.extend_from_slice(&amp;amp;args);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The second to last arm is for all kinds of &lt;code&gt;unquote&lt;/code&gt; expressions, and that&amp;rsquo;s where everything happens.
The last arm does nothing, as we don&amp;rsquo;t need to extend the stack with other types:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type::Unquote | Type::UnquoteSplicing =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; args = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::rest_expressions(&amp;amp;expr)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::check_argument_count(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;unquote&amp;#34;&lt;/span&gt;, ArgAmount::NotEqual(1), &amp;amp;args)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; (q, u) = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::quasiquote_unquote_levels(&amp;amp;expr);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; q == 0 {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Err&lt;/span&gt;(EvalError::UnquoteNotInQquote);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;font-weight:bold&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; q == u {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            unquotes.push(expr.clone());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::expression_type(&amp;amp;args[0]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Type::Procedure | Type::Quasiquote | Type::List | Type::Symbol =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                stack.extend_from_slice(&amp;amp;args[0].borrow().siblings)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Type::Unquote | Type::UnquoteSplicing &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; q &amp;gt; u =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                stack.push(args[0].clone())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Type::Unquote | Type::UnquoteSplicing =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Err&lt;/span&gt;(EvalError::UnquoteNotInQquote)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            _ =&amp;gt; (),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;_ =&amp;gt; (),
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So what&amp;rsquo;s happening here is another check for arguments, and &lt;code&gt;quasiquote_unquote_levels&lt;/code&gt; call.
This function analyses the current expression, and all its parents to be either &lt;code&gt;quasiquote&lt;/code&gt; or &lt;code&gt;unquote&lt;/code&gt; and &lt;code&gt;unqoute-splicing&lt;/code&gt; calls, and sets counters for the nest levels of those.
This function returns a tuple, which we destructive binding to &lt;code&gt;q&lt;/code&gt; and &lt;code&gt;u&lt;/code&gt; variables, that stand for &lt;code&gt;quasiquote&lt;/code&gt; and &lt;code&gt;unquote&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If &lt;code&gt;q&lt;/code&gt; is equal to &lt;code&gt;0&lt;/code&gt; this means that we&amp;rsquo;ve got &lt;code&gt;unquote&lt;/code&gt; outside of &lt;code&gt;quasiquote&lt;/code&gt;, which is not allowed.
Otherwise, if we got the same levels we push expression to &lt;code&gt;unquotes&lt;/code&gt; stack.
But this is not the end, we still have to analyze inner expressions, because &lt;code&gt;unquote&lt;/code&gt; may contain other calls for &lt;code&gt;unquote&lt;/code&gt; or &lt;code&gt;quasiquote&lt;/code&gt; and so on, so our algorithm repeats itself one more time and pushes expressions to stack depending on their types and levels.&lt;/p&gt;
&lt;p&gt;This function produces vector of valid &lt;code&gt;unquote&lt;/code&gt; and &lt;code&gt;unquote-splicing&lt;/code&gt; calls that we pass to our &lt;code&gt;eval&lt;/code&gt; function and evaluate.&lt;/p&gt;
&lt;h2 id=&#34;unquote-procedure&#34;&gt;&lt;code&gt;Unquote&lt;/code&gt; procedure&lt;/h2&gt;
&lt;p&gt;To perform unquoting, we have to take into account several things.
But first let&amp;rsquo;s look at &lt;code&gt;Unquote&lt;/code&gt; arms in &lt;code&gt;eval&lt;/code&gt; procedure:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type::Unquote &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; quasiquote_level &amp;gt; 0 =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; rest = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::rest_expressions(&amp;amp;expr)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; args_to_eval = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::pre_unquote(&amp;amp;rest)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; !args_to_eval.is_empty() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        unquote_level += 1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        stack.extend_from_slice(&amp;amp;args_to_eval);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;continue&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    unquote_level -= 1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; (res, pop) = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::unquote(&amp;amp;rest)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Tree::replace_tree(&amp;amp;expr, res);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; pop {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        stack.pop()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;font-weight:bold&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;continue&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type::Unquote =&amp;gt; &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Err&lt;/span&gt;(EvalError::UnquoteNotInQquote),
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Similarly to &lt;code&gt;qasiquote&lt;/code&gt; arm, we check for &lt;code&gt;quasiquote_level&lt;/code&gt;, but now if it is greater than &lt;code&gt;0&lt;/code&gt;.
If it&amp;rsquo;s &lt;code&gt;0&lt;/code&gt; it&amp;rsquo;s an error that we have to catch at the top level.&lt;/p&gt;
&lt;p&gt;You can see that there&amp;rsquo;s another &lt;code&gt;pre_&lt;/code&gt; procedure here.
That is because we&amp;rsquo;re going to evaluate &lt;code&gt;unquote&lt;/code&gt; argument, and then actually &lt;code&gt;unquote&lt;/code&gt; it.
&lt;code&gt;pre_unquote&lt;/code&gt; just checks for valid forms that we actually need to evaluate, similarly to other &lt;code&gt;pre_&lt;/code&gt; procedures, so I don&amp;rsquo;t think we need to look closely at it.
We&amp;rsquo;ve seen a lot of those in &lt;a href=&#34;https://andreyor.st/posts/2020-03-22-grscheme-design-part-2/&#34;&gt;Part 2&lt;/a&gt;, and this one is no different.&lt;/p&gt;
&lt;p&gt;After everything is evaluated, we call &lt;code&gt;Self::unquote&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;unquote&lt;/span&gt;(args: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;[NodePtr]) -&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Result&lt;/span&gt;&amp;lt;(NodePtr, &lt;span style=&#34;font-weight:bold&#34;&gt;bool&lt;/span&gt;), EvalError&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::check_argument_count(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;unquote&amp;#34;&lt;/span&gt;, ArgAmount::NotEqual(1), args)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::expression_type(&amp;amp;args[0]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Type::List | Type::Symbol | Type::Quasiquote =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Ok&lt;/span&gt;((&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::rest_expressions(&amp;amp;args[0])?[0].clone(), &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        _ =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Ok&lt;/span&gt;((args[0].clone(), &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This procedure is extremely similar to &lt;code&gt;quote&lt;/code&gt;, except it removes &lt;code&gt;quote&lt;/code&gt; from &lt;code&gt;List&lt;/code&gt;, &lt;code&gt;Symbol&lt;/code&gt;, and &lt;code&gt;Quasiquote&lt;/code&gt; forms, and returns all other forms as is.
It also indicates if we should pop our tree traversal stack or not.&lt;/p&gt;
&lt;h2 id=&#34;unquote-splicing-procedure&#34;&gt;&lt;code&gt;Unquote-splicing&lt;/code&gt; procedure&lt;/h2&gt;
&lt;p&gt;This procedure is kinda the same as &lt;code&gt;unquote&lt;/code&gt; and actually uses &lt;code&gt;unquote&lt;/code&gt; underneath, but the big thing is &lt;code&gt;splicing&lt;/code&gt; part here.&lt;/p&gt;
&lt;p&gt;Because GRScheme uses trees of vectors, which are not linked lists, I thought that maybe there should not be such a thing as splicing, but in the end, I&amp;rsquo;ve decided that it&amp;rsquo;ll be better with it.&lt;/p&gt;
&lt;p&gt;Splicing works kinda like you would expect, except that it modifies the vector:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;impl&lt;/span&gt; Tree&amp;lt;T&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// …
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;splice_in_childs&lt;/span&gt;(root: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;NodePtr&lt;/span&gt;&amp;lt;T&amp;gt;, pos: &lt;span style=&#34;font-weight:bold&#34;&gt;usize&lt;/span&gt;, tree: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;NodePtr&lt;/span&gt;&amp;lt;T&amp;gt;) -&amp;gt; &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;NodePtr&lt;/span&gt;&amp;lt;T&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; broot = root.borrow_mut();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; pos = &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; pos &amp;gt; broot.siblings.len() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            broot.siblings.len() - 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;font-weight:bold&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            pos
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;for&lt;/span&gt; child &lt;span style=&#34;font-weight:bold&#34;&gt;in&lt;/span&gt; tree.borrow().siblings.iter().rev() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            broot.siblings.insert(pos, child.clone());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        root
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// …
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Not very idiomatic to do such a thing with vectors, but, eh, I can live with that.
This gives us the ability to splice in siblings of one tree into another one at a given place.
If a place is more than the size of the current tree&amp;rsquo;s siblings, we just put those to the end.
Now we can use it in &lt;code&gt;UnquoteSplicing&lt;/code&gt; arm:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type::UnquoteSplicing &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; quasiquote_level &amp;gt; 0 =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; parent = Tree::parent(&amp;amp;expr).unwrap();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; !&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::splicing_context_valid(&amp;amp;expr) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Err&lt;/span&gt;(EvalError::UnquoteSplicingInWrongContext)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; pos = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::splicing_pos(&amp;amp;parent).unwrap();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; rest = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::rest_expressions(&amp;amp;expr)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; args_to_eval = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::pre_unquote(&amp;amp;rest)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; !args_to_eval.is_empty() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        unquote_level += 1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        stack.extend_from_slice(&amp;amp;args_to_eval);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;continue&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    unquote_level -= 1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; (res, pop) = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::unquote(&amp;amp;rest)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Tree::remove_child(&amp;amp;parent, pos);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Tree::splice_in_childs(&amp;amp;parent, pos, res);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; pop {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        stack.pop()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;font-weight:bold&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;continue&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type::UnquoteSplicing =&amp;gt; &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Err&lt;/span&gt;(EvalError::UnquoteNotInQquote),
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For the most part, it is the same as the &lt;a href=&#34;#unquote-procedure&#34;&gt;&lt;code&gt;unquote&lt;/code&gt;&lt;/a&gt; procedure, except that at the end we splice results in, and also we check that we&amp;rsquo;re inside the valid context.
This check finds the &lt;code&gt;quasiquote&lt;/code&gt; procedure and checks if it has an argument of &lt;code&gt;Procedure&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;`(,@&amp;#39;(1 2 3)) &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;;; valid&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;`,@&amp;#39;(1 2 3)   &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;;; invalid&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As a little showcase of how everything works so far, let&amp;rsquo;s implement the thread first macro from Clojure &lt;code&gt;-&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grscheme&amp;gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;define&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;lambda&lt;/span&gt; forms
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;font-weight:bold&#34;&gt;define&lt;/span&gt; loop (&lt;span style=&#34;font-weight:bold&#34;&gt;lambda&lt;/span&gt; (x forms)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;empty?&lt;/span&gt; forms)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  x
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  (&lt;span style=&#34;font-weight:bold&#34;&gt;let&lt;/span&gt; (form (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;car&lt;/span&gt; forms))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    (&lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;list?&lt;/span&gt; form)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        (loop `(,(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;car&lt;/span&gt; form) ,x ,@(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;cdr&lt;/span&gt; form)) (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;cdr&lt;/span&gt; forms))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        (loop `(,form ,x) (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;cdr&lt;/span&gt; forms)))))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;eval&lt;/span&gt; (loop (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;car&lt;/span&gt; forms) (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;cdr&lt;/span&gt; forms)))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grscheme&amp;gt; &lt;span style=&#34;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#procedure:-&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grscheme&amp;gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Thread first!&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;display&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Thread first!
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grscheme&amp;gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &amp;#39;&amp;#39;(1 2 3)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;cdr&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;car&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;cons&lt;/span&gt; &amp;#39;(3 4 5)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(2 3 4 5)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Of course, this is not a real macro, and everything happens in run time every time we call &lt;code&gt;-&amp;gt;&lt;/code&gt;, but the algorithm is the same as in Clojure&amp;rsquo;s &lt;code&gt;-&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;grscheme-complete&#34;&gt;GRScheme complete?&lt;/h2&gt;
&lt;p&gt;Certainly not.
When I started working on it, I knew literally nothing about Scheme, Lisp, and the basic ideas behind its implementations.
I was using different Lisps to some extent, like Emacs Lisp for writing small functions for my Emacs config, and going through SICP with Guile, but up until I wrote my own evaluator I had no complete understanding of what I&amp;rsquo;m doing.
Since then I&amp;rsquo;ve &lt;a href=&#34;https://sep.yimg.com/ty/cdn/paulgraham/bel.bel&#34; target=&#34;_blank&#34;&gt;read&lt;/a&gt; &lt;a href=&#34;https://sep.yimg.com/ty/cdn/paulgraham/bellanguage.txt&#34; target=&#34;_blank&#34;&gt;some&lt;/a&gt; &lt;a href=&#34;http://www-formal.stanford.edu/jmc/recursive.pdf&#34; target=&#34;_blank&#34;&gt;papers&lt;/a&gt; on Lisp design, got into Clojure, and progressed through SICP, so I know a little more on how things should work internally for the most part.
And with this knowledge…&lt;/p&gt;
&lt;p&gt;I understand that my implementation of the whole thing is bad, and I mean &lt;strong&gt;really&lt;/strong&gt; bad :D&lt;/p&gt;
&lt;p&gt;There are still no macros, internal data representation is really ugly, strings are useless, there&amp;rsquo;s no file IO, REPL is really basic, there&amp;rsquo;s no debugging, the stack doesn&amp;rsquo;t exist, and so on.
I don&amp;rsquo;t think I should really turn GRScheme into complete language, at least right now.&lt;/p&gt;
&lt;p&gt;Even if I wanted to create a real practical language, that could compete with other Schemes, Clojure, or Common Lisp, I would have to redesign everything from the bottom up, so probably it will be easier to write a completely new thing.
And that will still mean that I&amp;rsquo;ll have to re-implement every feature that those languages provide, which is an insane amount of work.&lt;/p&gt;
&lt;p&gt;Although I would say that I think Rust is a great choice as the implementation language because it helps produce memory-safe code, and probably will make the implementation of multi-threading less worrying, compared to C.
Initially, I had planned on supporting execution in separate threads, but I&amp;rsquo;ve dropped this idea because the current tree traversal algorithm can&amp;rsquo;t be easily converted to use multiple threads.&lt;/p&gt;
&lt;p&gt;This mostly concludes my experiment with the development of Scheme-like language.
I hope it was at least an interesting read.
Thanks!&lt;/p&gt;
&lt;div class=&#34;comment-link&#34;&gt; &lt;a href=&#34;mailto:%61%6e%64%72%65%79%6f%72%73%74%2b%62%6c%6f%67%40%67%6d%61%69%6c%2e%63%6f%6d?subject=Comment: GRScheme Design Part 3 - Quasiquoting&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Comment via email&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 03 Apr 2020 15:37:00 +0300</pubDate>
    </item><item>
      <title>GRScheme Design Part 2 - Evaluation</title>
      <link>https://andreyor.st/posts/2020-03-22-grscheme-design-part-2/</link>
      <guid>https://andreyor.st/posts/2020-03-22-grscheme-design-part-2/</guid>
      <description>&lt;p&gt;Good things happened since my previous post!
I&amp;rsquo;ve finished rewriting the interpreter from recursive to iterative, which means that there will be no stack overflows when traversing deep trees.
I&amp;rsquo;ve also simplified name binding and lookup systems added support for arbitrary-sized integers, fractions, and 64-bit floating point numbers, but most importantly figured out tail call elimination and closures.
This post will describe all of these themes!&lt;/p&gt;
&lt;p&gt;Right now I still need to figure out unquoting and quasiquoting (which will be mentioned at the end), as well as the macro system, but I think that it will not be that difficult since I&amp;rsquo;ve already done most part of the language.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve already briefly described how interpretation works in GRScheme, but to refresh it, here&amp;rsquo;s a general mechanism.&lt;/p&gt;
&lt;p&gt;Given text input, &lt;em&gt;reader&lt;/em&gt; produces an internal data structure that represents the input:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/sum-expression.svg&#34;
         alt=&#34;Figure 1: Parsing input expression to GRData&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 1: &lt;/span&gt;Parsing input expression to GRData&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;After that, the data structure is passed to the evaluator:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/sum-expression-evaluated.svg&#34;
         alt=&#34;Figure 2: Using GRData to provide result&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 2: &lt;/span&gt;Using GRData to provide result&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;In &lt;a href=&#34;https://andreyor.st/posts/2020-02-25-grscheme-design-part-1/&#34;&gt;previous post&lt;/a&gt;, I&amp;rsquo;ve described what happens in the &lt;em&gt;reader&lt;/em&gt; module, and this post is going to be about &lt;em&gt;evaluator&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;evaluator-structure&#34;&gt;&lt;code&gt;Evaluator&lt;/code&gt; structure&lt;/h2&gt;
&lt;p&gt;Since everything in Scheme is a list (in our case a vector, but this doesn&amp;rsquo;t matter right now), we have uniform rules for evaluation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If something is a list:
&lt;ul&gt;
&lt;li&gt;the first element is a procedure name,&lt;/li&gt;
&lt;li&gt;rest are procedure arguments.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Else if something is a non-primitive type:
&lt;ul&gt;
&lt;li&gt;lookup in scope,&lt;/li&gt;
&lt;li&gt;evaluate&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If something is a primitive type, evaluate it to self.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This means that things such as &lt;em&gt;quoted lists&lt;/em&gt;, &lt;em&gt;symbols&lt;/em&gt;, numeric constants, and strings are primitive types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&#39;(list of items)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&#39;symbol&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1&lt;/code&gt;, &lt;code&gt;3.14&lt;/code&gt;, &lt;code&gt;22/7&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;string of text&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;ve marked &lt;em&gt;quoted lists&lt;/em&gt; and &lt;em&gt;symbols&lt;/em&gt; as cursive because actually, it&amp;rsquo;s not primitive types in GRScheme, but calls to &lt;code&gt;quote&lt;/code&gt; procedure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;(quote (list of items))&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(quote symbol)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However I&amp;rsquo;ve said that primitive types are evaluated to themselves, and this is the case for &lt;code&gt;quote&lt;/code&gt; calls - those produce quote calls, e.g. themselves.
Well, most of the time.
I&amp;rsquo;ll explain why a bit later.&lt;/p&gt;
&lt;p&gt;This leads us to procedure application syntax.
Everything that is wrapped with parentheses is a call to proceed with some arguments, where some may actually be &lt;em&gt;none&lt;/em&gt;.
For example, procedure &lt;code&gt;car&lt;/code&gt; returns the first element of the list it was given:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;car &lt;/span&gt;&amp;#39;(1 2 3)) &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;;; (car (quote (1 2 3)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When we pass this expression to the reader it produces such a tree:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/call-to-car.svg&#34;
         alt=&#34;Figure 3: (car &amp;#39;(1 2 3)) expression as GRData&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 3: &lt;/span&gt;&lt;code&gt;(car &#39;(1 2 3))&lt;/code&gt; expression as GRData&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;After that, &lt;em&gt;evaluator&lt;/em&gt; calls &lt;code&gt;eval&lt;/code&gt; function, on that expression, which iterates over the tree and checks the type of each leaf.
The first leaf it finds, in this case, is the root of the tree, which is &lt;code&gt;(&lt;/code&gt;.
This means that it is a procedure call, so we check what procedure we should call.
In this case, it is &lt;code&gt;car&lt;/code&gt;.
We check if this name exists in the current scope by using the &lt;code&gt;lookup&lt;/code&gt; procedure, which in turn checks for each scope that is available for us at this moment - the scope of the caller, and the global scope.
Since caller scope is empty &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, we check global scope for name &lt;code&gt;car&lt;/code&gt; and find out that it holds &lt;code&gt;#procedure:car&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;What is &lt;code&gt;#procedure:car&lt;/code&gt;?
It is a &lt;em&gt;pattern&lt;/em&gt; - a special keyword that means something to the interpreter.
Patterns are reserved (for now) and can&amp;rsquo;t be created, but can be assigned to names, which is the case for &lt;code&gt;car&lt;/code&gt;.
This pattern describes how we should treat this name, e.g. as a &lt;code&gt;#procedure&lt;/code&gt;, which procedure it contains, &lt;code&gt;car&lt;/code&gt;, and what to expect of its arguments - should we evaluate those, or not.&lt;/p&gt;
&lt;p&gt;Since we need to evaluate arguments of &lt;code&gt;car&lt;/code&gt;, our next step is the evaluation of the arguments.
In our case, there&amp;rsquo;s one argument, and it is a primitive type one - a list &lt;code&gt;&#39;(1 2 3)&lt;/code&gt;, so we evaluate the call to &lt;code&gt;quote&lt;/code&gt; procedure.
The result of calling a quote with a list is a list itself, so &lt;code&gt;quote&lt;/code&gt; returns &lt;code&gt;&#39;(1 2 3)&lt;/code&gt;.
Now, when all arguments are evaluated, we can pass those to &lt;code&gt;#procedure:car&lt;/code&gt; call.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;car&lt;/code&gt; should take the first element of the list that we&amp;rsquo;ve passed to it, so in the case of &lt;code&gt;car&lt;/code&gt; there should be only 1 parameter, and we need to check it.
If there are more parameters than there should be, we will throw an error and abort the execution of the whole expression.
In our case, there&amp;rsquo;s exactly one parameter of type &lt;em&gt;list&lt;/em&gt;, which is what &lt;code&gt;car&lt;/code&gt; expects.
If the parameter has the wrong type &lt;code&gt;car&lt;/code&gt; will signal an error and abort.
If the list is empty, we will also signal an error.
In our case, we successfully take the first element from the list and &lt;code&gt;quote&lt;/code&gt; it.&lt;/p&gt;
&lt;p&gt;So the result of &lt;code&gt;(car &#39;(1 2 3)&lt;/code&gt; is &lt;code&gt;(quote 1)&lt;/code&gt;, but because &lt;code&gt;1&lt;/code&gt; is a primitive type and can&amp;rsquo;t be quoted, the result of &lt;code&gt;(quote 1)&lt;/code&gt; expression is &lt;code&gt;1&lt;/code&gt;, which is what interpreter prints after executing our expression.&lt;/p&gt;
&lt;p&gt;With this information, you should understand the general idea behind the evaluation process.
Now let&amp;rsquo;s look at the code.&lt;/p&gt;
&lt;h2 id=&#34;function-eval&#34;&gt;Function &lt;code&gt;eval&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://gitlab.com/andreyorst/grscheme/-/blob/dac2c1eef7745beaee8ad4f05a75a554585d2cd1/src/evaluator.rs#L121-235&#34; target=&#34;_blank&#34;&gt;Here&amp;rsquo;s&lt;/a&gt; the whole code of &lt;code&gt;eval&lt;/code&gt; function at the moment of publication.
In recursive form it was much shorter, however, shared the common problem of all recursion algorithms - stack overflow.
Unfortunately, I could not figure out a way of making it tail-recursive to use trampolines, because we do some work after each iteration, so I&amp;rsquo;ve turned it to pure iterative form.
If you&amp;rsquo;re interested in how this function looks with the recursion algorithm check &lt;a href=&#34;https://gitlab.com/andreyorst/grscheme/-/blob/1781c53eabe9d0a69db373409decc718142423bd/src/evaluator.rs#L75-104&#34; target=&#34;_blank&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This function is quite big to list here in its full form so let&amp;rsquo;s tackle it piece by piece.
It also works better for explanation purposes.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s begin with the function signature:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;eval&lt;/span&gt;(&amp;amp;&lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;, expression: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;NodePtr&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Result&lt;/span&gt;&amp;lt;NodePtr, EvalError&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This function takes two parameters - &lt;code&gt;&amp;amp;mut self&lt;/code&gt; and &lt;code&gt;expression: &amp;amp;NodePtr&lt;/code&gt;.
&lt;code&gt;NodePtr&lt;/code&gt; is a &lt;code&gt;type&lt;/code&gt; that is defined in &lt;code&gt;reader&lt;/code&gt; module as &lt;code&gt;pub type NodePtr = tree::NodePtr&amp;lt;GRData&amp;gt;;&lt;/code&gt; and just a shorter way to manage tree leafs.
The first parameter is &lt;code&gt;self&lt;/code&gt; which means that this function is a method of an object it was called from.
This object is &lt;code&gt;Evaluator&lt;/code&gt; structure which is quite simple and has only one field:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;Evaluator&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    global_scope: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;HashMap&lt;/span&gt;&amp;lt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;String&lt;/span&gt;, NodePtr&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Thus if we create new &lt;code&gt;Evaluator&lt;/code&gt; and call &lt;code&gt;eval&lt;/code&gt; method it will be able to see &lt;code&gt;global_scope&lt;/code&gt;.
We&amp;rsquo;ll get to that later.&lt;/p&gt;
&lt;p&gt;The first thing we do in &lt;code&gt;eval&lt;/code&gt; is stack creation, and variable to hold our end result:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; stack = vec![expression.clone()];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; res = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;None&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, when we have a place to store our result and a stack to iterate we can begin iteration itself:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(expr) = stack.last() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    res = &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::expression_type(&amp;amp;expr) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// …
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Ok&lt;/span&gt;(res.unwrap())
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is the core of our evaluator.
Well, not exactly the core, but an important part of it.
We pop the last element from the stack and analyze its type.
Depending on that type we will perform different actions.
There are 9 types right now:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#[derive(Debug, Clone, PartialEq, PartialOrd)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;enum&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;Type&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Integer,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Rational,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Float,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Name,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Str,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Symbol,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    List,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Unquote,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Quasiquote,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Procedure,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Pattern,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 1:&lt;/span&gt;
  Types of expressions needed for evaluation
&lt;/div&gt;
&lt;p&gt;We have types for different numbers, including &lt;code&gt;Integer&lt;/code&gt; for all integers, such as &lt;code&gt;1&lt;/code&gt;, &lt;code&gt;123&lt;/code&gt;, &lt;code&gt;-123&lt;/code&gt;, &lt;code&gt;2352975723524562345&lt;/code&gt;, e.t.c., &lt;code&gt;Rational&lt;/code&gt; for fractions: &lt;code&gt;1/2&lt;/code&gt;, &lt;code&gt;22/7&lt;/code&gt;, &lt;code&gt;235297594562345/2359524562347&lt;/code&gt;, and &lt;code&gt;Float&lt;/code&gt; for 64 bit floating numbers.
Next, we have &lt;code&gt;Name&lt;/code&gt;, names are everything that is simply a sequence of letters and numbers without white space and reserved characters, e.g. &lt;code&gt;car&lt;/code&gt;, &lt;code&gt;quote&lt;/code&gt;, &lt;code&gt;hello1234&lt;/code&gt;.
And &lt;code&gt;Str&lt;/code&gt; is for strings - arbitrary sequences of anything wrapped within pair of &lt;code&gt;&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The next ones are more interesting.
We have &lt;code&gt;Symbol&lt;/code&gt;.
Symbols are quoted names and are primitive types.
For example &lt;code&gt;car&lt;/code&gt; is a name, and &lt;code&gt;&#39;car&lt;/code&gt; is a symbol.
&lt;code&gt;List&lt;/code&gt; is another primitive type, which we have already seen before: &lt;code&gt;&#39;(1 2 3)&lt;/code&gt;.
A list can contain anything inside, including other lists.&lt;/p&gt;
&lt;p&gt;And the big ones - &lt;code&gt;Procedure&lt;/code&gt; and &lt;code&gt;Pattern&lt;/code&gt;.
These types are special because the first one determines &lt;em&gt;what&lt;/em&gt; we will do with our list, and the second one is &lt;em&gt;how&lt;/em&gt; we will do it.
Rules are simple - everything that starts with &lt;code&gt;(&lt;/code&gt; is a &lt;code&gt;Procedure&lt;/code&gt;, and everything that starts with &lt;code&gt;#&lt;/code&gt; is a pattern.
Now there&amp;rsquo;s one problem.
We have lists and symbols, which are represented as &lt;code&gt;&#39;(a)&lt;/code&gt; and &lt;code&gt;&#39;a&lt;/code&gt; but in fact are stored as &lt;code&gt;(quote (a))&lt;/code&gt; and &lt;code&gt;(quote a)&lt;/code&gt;.
This means that these are procedure calls.
So how does it work?
Let&amp;rsquo;s look at the function that determines the type of the expression:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;expression_type&lt;/span&gt;(s: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;NodePtr&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;Type&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; data = &amp;amp;s.borrow().data.data;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; data {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Data::&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;String&lt;/span&gt; { data } =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; data.starts_with(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;#&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Type::Pattern
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; !s.borrow().siblings.is_empty() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &amp;amp;s.borrow().siblings[0].borrow().data.data {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    Data::&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;String&lt;/span&gt; { data }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; data == &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;quote&amp;#34;&lt;/span&gt; &amp;amp;&amp;amp; s.borrow().siblings.len() &amp;gt; 1 =&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &amp;amp;s.borrow().siblings[1].borrow().data.data {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            Data::&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;String&lt;/span&gt; { data } &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; data == &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;(&amp;#34;&lt;/span&gt; =&amp;gt; Type::List,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            _ =&amp;gt; Type::Symbol,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    Data::&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;String&lt;/span&gt; { data } &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; data == &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;unquote&amp;#34;&lt;/span&gt; =&amp;gt; Type::Unquote,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    Data::&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;String&lt;/span&gt; { data } &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; data == &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;quasiquote&amp;#34;&lt;/span&gt; =&amp;gt; Type::Quasiquote,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    _ =&amp;gt; Type::Procedure,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; data.starts_with(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;) &amp;amp;&amp;amp; data.ends_with(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Type::Str
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;font-weight:bold&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Type::Name
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Data::Integer { .. } =&amp;gt; Type::Integer,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Data::Float { .. } =&amp;gt; Type::Float,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Data::Rational { .. } =&amp;gt; Type::Rational,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 2:&lt;/span&gt;
  Expression type analyzer
&lt;/div&gt;
&lt;p&gt;It&amp;rsquo;s quite simple, actually.
We pass our tree to it and it analyses the top level.
If our root has &lt;code&gt;String&lt;/code&gt; data, there&amp;rsquo;s a possibility of it containing anything but numerical data.
So we check if the &lt;code&gt;data&lt;/code&gt; starts with &lt;code&gt;#&lt;/code&gt;, and if that&amp;rsquo;s the case, we got &lt;code&gt;Pattern&lt;/code&gt;.
If not, we check if it has sub-nodes, which actually means that this is a procedure call.
If the procedure we&amp;rsquo;re calling is &lt;code&gt;quote&lt;/code&gt; and there are other sub-nodes around, we check if those have either &lt;code&gt;(&lt;/code&gt; or whatever, thus producing &lt;code&gt;List&lt;/code&gt; and &lt;code&gt;Symbol&lt;/code&gt;.
If there are no extra sub-nodes, or the procedure is not &lt;code&gt;quote&lt;/code&gt; that&amp;rsquo;s &lt;code&gt;Procedure&lt;/code&gt;.
Same think for &lt;code&gt;Unquote&lt;/code&gt; and &lt;code&gt;Quasiquote&lt;/code&gt;.
If there are no sub-nodes at all, that&amp;rsquo;s either a &lt;code&gt;Str&lt;/code&gt;, if it starts and ends with &lt;code&gt;&amp;quot;&lt;/code&gt;, or a &lt;code&gt;Name&lt;/code&gt;.
In case there are numerical data, we take its type.&lt;/p&gt;
&lt;p&gt;So how do we use this information?
In our &lt;code&gt;while let&lt;/code&gt; loop over the stack we get the expression type and match it against it.
But we do not actually need to match against all of those:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;res = &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::expression_type(&amp;amp;expr) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Type::Procedure =&amp;gt; { &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;/* …  */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Type::List | Type::Symbol =&amp;gt; { &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;/* …  */&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Type::Quasiquote =&amp;gt; { &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;/* …  */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Type::Unquote =&amp;gt; { &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;/* …  */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Type::Name =&amp;gt; { &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;/* …  */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _ =&amp;gt; stack.pop(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 3:&lt;/span&gt;
  Evaluation branching based on the type of current expression
&lt;/div&gt;
&lt;p&gt;We obviously need to evaluate &lt;code&gt;Procedure&lt;/code&gt;, but because &lt;code&gt;List&lt;/code&gt; and &lt;code&gt;Symbol&lt;/code&gt; are a bit more fundamental (as building blocks) we evaluate those separately.
&lt;code&gt;Unquote&lt;/code&gt; and &lt;code&gt;Quasiquote&lt;/code&gt; are implemented as hack, so I won&amp;rsquo;t really discuss it here &lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.
Names are also evaluated in a special way, and the rest types are evaluated to themselves so we do not need to do anything with those, so we simply pop those from the stack.
We do this at the end of each &lt;code&gt;match&lt;/code&gt; arm, except for the first one.
Let&amp;rsquo;s go from the bottom.&lt;/p&gt;
&lt;h3 id=&#34;name-evaluation&#34;&gt;&lt;code&gt;Name&lt;/code&gt; evaluation&lt;/h3&gt;
&lt;p&gt;That&amp;rsquo;s how we evaluate names.
It&amp;rsquo;s simple but there&amp;rsquo;s a lot of what actually happens:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type::Name =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Tree::replace_tree(&amp;amp;expr, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.lookup(&amp;amp;expr)?);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    stack.pop()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 4:&lt;/span&gt;
  Branch that evaluates &lt;code&gt;Name&lt;/code&gt; expressions
&lt;/div&gt;
&lt;p&gt;First, we&amp;rsquo;re calling &lt;code&gt;self.lookup&lt;/code&gt; procedure, that looks through all available scopes for the value of the name.
There&amp;rsquo;s this &lt;code&gt;?&lt;/code&gt; operator, which you may have seen before in some code above.
It is syntactic sugar for passing the correct value to the caller and the error value out of the caller.
Because &lt;code&gt;lookup&lt;/code&gt; returns &lt;code&gt;Result&lt;/code&gt; type and it is a compound error type we need to pass an error to the handler which is not this function.
We could write this call in a more explicit way:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.lookup(&amp;amp;expr) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Ok&lt;/span&gt;(result) =&amp;gt; result,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Err&lt;/span&gt;(error) =&amp;gt; &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Err&lt;/span&gt;(error),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 5:&lt;/span&gt;
  &lt;code&gt;?&lt;/code&gt; operator does exactly this
&lt;/div&gt;
&lt;p&gt;But it is tedious to do, so &lt;code&gt;?&lt;/code&gt; is great.
Let&amp;rsquo;s not look at &lt;code&gt;lookup&lt;/code&gt; for now, until we talk about scopes.
What you need to know is that &lt;code&gt;lookup&lt;/code&gt; will check every scope current expression car reach and the global scope.
If value can not be found it will return &lt;code&gt;Err(EvalError::UnboundIdentifier { name })&lt;/code&gt; which will be passed to error handler.
This error can&amp;rsquo;t be handled so we will see the message in &lt;code&gt;stderr&lt;/code&gt; saying that &lt;code&gt;name&lt;/code&gt; is not bound to anything.&lt;/p&gt;
&lt;p&gt;If the value of a name was found we pass it to our next function &lt;code&gt;Tree::replace_tree&lt;/code&gt;.
The value of a &lt;code&gt;Name&lt;/code&gt; is always some tree, so we need to replace our current expression with a new tree.
Now we have finally touched the reduction process of the tree.&lt;/p&gt;
&lt;p&gt;Our tree consists of reference-counted pointers to sub-trees.
What this means is that if we have a pointer to the tree if we have a pointer and we&amp;rsquo;re not violating any of the borrowing rules we can change the value of this pointer.
In the case of our &lt;code&gt;eval&lt;/code&gt; procedure, we have the &lt;code&gt;stack&lt;/code&gt; of such pointers, and when we take out each pointer we&amp;rsquo;re basically fine to do anything with it.
So when we&amp;rsquo;ve found the value of the &lt;code&gt;Name&lt;/code&gt; - new tree we can replace the old tree, holding that &lt;code&gt;Name&lt;/code&gt; with our new tree.
Let&amp;rsquo;s look on a simple example of &lt;code&gt;(+ a 1)&lt;/code&gt; given that &lt;code&gt;a&lt;/code&gt; holds &lt;code&gt;41&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/scope-and-expression.svg&#34;
         alt=&#34;Figure 4: (&amp;#43; a 1) expression and global scope holding a&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 4: &lt;/span&gt;&lt;code&gt;(+ a 1)&lt;/code&gt; expression and global scope holding &lt;code&gt;a&lt;/code&gt;&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;So we have this box labeled &lt;em&gt;Global Scope&lt;/em&gt;.
Scopes use &lt;code&gt;HashMap&lt;/code&gt; to organize data and optimize search by hashing keys, but here we will use names directly.
When the evaluator reaches &lt;code&gt;a&lt;/code&gt; leaf, it calls &lt;code&gt;lookup&lt;/code&gt;, which checks if the global scope has key &lt;code&gt;a&lt;/code&gt; in the table, and gets out the copy of the tree that holds &lt;code&gt;42&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/lookup.svg&#34;
         alt=&#34;Figure 5: Process of looking up a and gathering the value by copying&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 5: &lt;/span&gt;Process of looking up &lt;code&gt;a&lt;/code&gt; and gathering the value by copying&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Now that we got &lt;code&gt;42&lt;/code&gt; we can replace &lt;code&gt;a&lt;/code&gt; with it:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/replace.svg&#34;
         alt=&#34;Figure 6: Replacing a with 41 and dropping pointer&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 6: &lt;/span&gt;Replacing &lt;code&gt;a&lt;/code&gt; with &lt;code&gt;41&lt;/code&gt; and dropping pointer&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;We then drop our &lt;code&gt;a&lt;/code&gt; from the expression, and replace it with &lt;code&gt;42&lt;/code&gt;, while dropping the pointer which originally held &lt;code&gt;42&lt;/code&gt;.
The resulting expression is:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/replace-result.svg&#34;
         alt=&#34;Figure 7: Expression with a evaluated to 41&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 7: &lt;/span&gt;Expression with &lt;code&gt;a&lt;/code&gt; evaluated to &lt;code&gt;41&lt;/code&gt;&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;This is a general idea behind tree manipulation.
&lt;code&gt;Tree::replace_tree&lt;/code&gt; keeps the original pointer, but drops all of the node&amp;rsquo;s sub-nodes changes its value to the value of another node, and pushes new sub-nodes from another node.
Then the pointer to another node is dropped.&lt;/p&gt;
&lt;p&gt;So for example if &lt;code&gt;a&lt;/code&gt; would have held this list: &lt;code&gt;&#39;(1 2 3)&lt;/code&gt; we would get such expression:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/replace-to-list.svg&#34;
         alt=&#34;Figure 8: Example of gathering a list from the global scope&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 8: &lt;/span&gt;Example of gathering a list from the global scope&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Of course, it would not work, because you can&amp;rsquo;t add &lt;code&gt;1&lt;/code&gt; to &lt;code&gt;&#39;(1 2 3)&lt;/code&gt;, but this should illustrate the idea of what&amp;rsquo;s happening with the tree.&lt;/p&gt;
&lt;p&gt;Now we can go to a bit more complex &lt;code&gt;List&lt;/code&gt; and &lt;code&gt;Symbol&lt;/code&gt; evaluation.&lt;/p&gt;
&lt;h3 id=&#34;list-and-symbol-evaluation&#34;&gt;&lt;code&gt;List&lt;/code&gt; and &lt;code&gt;Symbol&lt;/code&gt; evaluation&lt;/h3&gt;
&lt;p&gt;On the last image we&amp;rsquo;ve seen list expression &lt;code&gt;&#39;(1 2 3)&lt;/code&gt; and how it&amp;rsquo;s represented in GRScheme Data:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-01-27-on-schemes-dots/list_in_grscheme.svg&#34;
         alt=&#34;Figure 9: &amp;#39;(1 2 3) list representation in GRData&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 9: &lt;/span&gt;&lt;code&gt;&#39;(1 2 3)&lt;/code&gt; list representation in GRData&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;This is done in such a way because we always have a full tree of our program at any time of evaluation.
Therefore if we would apply the quote as the real Scheme does, we would get &lt;code&gt;(1 2 3)&lt;/code&gt;, store it in the tree like that, and when we will try to do something with that list, we would assume that it is a procedure.
Which is not.
So the &lt;code&gt;quote&lt;/code&gt; is stored within the list permanently.
The same goes for &lt;code&gt;Symbols&lt;/code&gt;, those are stored exactly like lists, except the second subtree is just a &lt;code&gt;Name&lt;/code&gt;, e.g. &lt;code&gt;&#39;a&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/symbol.svg&#34;
         alt=&#34;Figure 10: &amp;#39;a symbol in GRData&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 10: &lt;/span&gt;&lt;code&gt;&#39;a&lt;/code&gt; symbol in GRData&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;That&amp;rsquo;s how we evaluate &lt;code&gt;Lists&lt;/code&gt; and &lt;code&gt;Symbols&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type::List | Type::Symbol =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; (res, change) = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::quote(&amp;amp;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::rest_expressions(&amp;amp;expr)?)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; change {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::replace_tree(&amp;amp;expr, res);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    stack.pop()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 6:&lt;/span&gt;
  Part of &lt;code&gt;eval&lt;/code&gt; that responsible to &lt;code&gt;List&lt;/code&gt; and &lt;code&gt;Symbol&lt;/code&gt; evaluation
&lt;/div&gt;
&lt;p&gt;It is similar to the evaluation of the &lt;code&gt;Name&lt;/code&gt; but a bit different.
First, instead of calling &lt;code&gt;lookup&lt;/code&gt; we call &lt;code&gt;Self::quote&lt;/code&gt; over the result of &lt;code&gt;Self::rest_expressions&lt;/code&gt;.
What &lt;code&gt;rest_expressions&lt;/code&gt; does, is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;takes the reference to expression,&lt;/li&gt;
&lt;li&gt;checks whether it has sub-expressions,
&lt;ul&gt;
&lt;li&gt;if there are sub expressions it checks if it has more than one of those,&lt;/li&gt;
&lt;li&gt;if There&amp;rsquo;s more than one, it creates a vector with pointers to those expressions, except the first one, and returns it,&lt;/li&gt;
&lt;li&gt;otherwise, it returns an empty vector,&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;if no subexpressions were found it signals an error.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So &lt;code&gt;quote&lt;/code&gt; receives a reference to that vector of subexpressions.
This is what &lt;code&gt;quote&lt;/code&gt; does:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;quote&lt;/span&gt;(args: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;[NodePtr]) -&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Result&lt;/span&gt;&amp;lt;(NodePtr, &lt;span style=&#34;font-weight:bold&#34;&gt;bool&lt;/span&gt;), EvalError&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::check_argument_count(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;quote&amp;#34;&lt;/span&gt;, ArgAmount::NotEqual(1), args)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; res = args[0].clone();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::expression_type(&amp;amp;res) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Type::Procedure | Type::Name | Type::Unquote | Type::Quasiquote =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; root = Tree::new(GRData::from_str(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;(&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Tree::push_child(&amp;amp;root, GRData::from_str(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;#procedure:quote&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Tree::push_tree(&amp;amp;root, res);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Ok&lt;/span&gt;((root, &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        _ =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Ok&lt;/span&gt;((res, &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 7:&lt;/span&gt;
  Code of the &lt;code&gt;quote&lt;/code&gt; procedure
&lt;/div&gt;
&lt;p&gt;This function returns a compound type of &lt;code&gt;Result&amp;lt;T, E&amp;gt;&lt;/code&gt;, where &lt;code&gt;T&lt;/code&gt; is the success type, and &lt;code&gt;E&lt;/code&gt; is the error type.
In our case success type itself is compound, and it is a &lt;a href=&#34;https://doc.rust-lang.org/std/primitive.tuple.html&#34; target=&#34;_blank&#34;&gt;tuple&lt;/a&gt; that consists of a pointer to the subexpression and a Boolean.
First, we check if there&amp;rsquo;s a correct amount of arguments passed, which in the case of &lt;code&gt;quote&lt;/code&gt; is &lt;code&gt;1&lt;/code&gt;.
Then we check its type.
If it is &lt;code&gt;Procedure&lt;/code&gt;, &lt;code&gt;Name&lt;/code&gt;, &lt;code&gt;Unquote&lt;/code&gt;, or &lt;code&gt;Quasiquote&lt;/code&gt; we wrap those into &lt;code&gt;quote&lt;/code&gt; and return with field argument set to &lt;code&gt;false&lt;/code&gt;.
If it is anything else, means that it cannot be quoted, so we return what was passed to &lt;code&gt;quote&lt;/code&gt; with the second field set to &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This second Boolean will indicate whether should we use &lt;code&gt;replace_tree&lt;/code&gt; over our result.
Because replacing a tree is somewhat expensive for long lists we should avoid it when possible.
Why do we do extra work if we don&amp;rsquo;t use it, though?
We&amp;rsquo;re using this function for quasiquoting without checking its second field.
But later about that.&lt;/p&gt;
&lt;p&gt;After we&amp;rsquo;ve replaced our expression with the result we pop it out of the stack.
If it was the last expression we will use it as a result.
If not it will be used by another expression up the tree.
That pretty much concludes the evaluation process of these forms.
Now we can look at the evaluation of &lt;code&gt;Procedure&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;evaluation-of-a-procedure&#34;&gt;Evaluation of a &lt;code&gt;Procedure&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;This is the most complex part of the evaluator because it is the main part.
I will split this into a lot of small parts so you can follow up and not get lost in all the stuff that happens because it spreads across the whole interpreter.&lt;/p&gt;
&lt;p&gt;First things first, let&amp;rsquo;s remember how procedures are constructed.
It&amp;rsquo;s a list, which has at least one item inside it.
The first item is going to be the name of the procedure, and the rest, if any, will be parameters.
Thus &lt;code&gt;(+ 1 2)&lt;/code&gt; is a call to the procedure &lt;code&gt;+&lt;/code&gt; with arguments of &lt;code&gt;1&lt;/code&gt; and &lt;code&gt;2&lt;/code&gt;.
That&amp;rsquo;s not always the case, though.
The first argument can be another procedure call, e.g. &lt;code&gt;((get-plus) 1 2)&lt;/code&gt;, where &lt;code&gt;get-plus&lt;/code&gt; is a procedure that returns a &lt;code&gt;+&lt;/code&gt; procedure, so we need to check for this type of thing.
That&amp;rsquo;s what we do when we&amp;rsquo;ve reached &lt;code&gt;Type::Procedure&lt;/code&gt; arm in our &lt;code&gt;eval&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type::Procedure =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; expr = expr.clone();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; proc = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::first_expression(&amp;amp;expr)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; proc = &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::expression_type(&amp;amp;proc) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Type::Procedure | Type::Name =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            stack.push(proc);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold&#34;&gt;continue&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        _ =&amp;gt; proc,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// …
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 8:&lt;/span&gt;
  Part of &lt;code&gt;eval&lt;/code&gt; function responsible to &lt;code&gt;Procedure&lt;/code&gt; evaluation
&lt;/div&gt;
&lt;p&gt;First, we create a copy of a pointer to the current expression due to some ownership rules.
Then we use &lt;code&gt;Self::first_expression&lt;/code&gt; on a reference to this expression to get the first sub-expression which will either be a procedure, name, or something else.&lt;/p&gt;
&lt;p&gt;Next, we check its type, and if it is either a &lt;code&gt;Procedure&lt;/code&gt; or &lt;code&gt;Name&lt;/code&gt; we push it to the stack and go to the next iteration.
This will evaluate &lt;code&gt;Name&lt;/code&gt; and return what it holds to us, so we can use it, and in the case of &lt;code&gt;Procedure&lt;/code&gt;, we will return to this arm and repeat the first steps.&lt;/p&gt;
&lt;p&gt;What we are looking for is &lt;code&gt;Pattern&lt;/code&gt;.
And a very specific one.
All functions are described through &lt;code&gt;#procedure:name&lt;/code&gt; pattern.
For example in this expression &lt;code&gt;(+ 1 2)&lt;/code&gt;, &lt;code&gt;+&lt;/code&gt; actually holds a pattern &lt;code&gt;#procedure:+&lt;/code&gt;, and &lt;code&gt;+&lt;/code&gt; itself is a name, so we push it to the stack, evaluate it to &lt;code&gt;#procedure:+&lt;/code&gt; and return to our expression which now holds &lt;code&gt;(#procedure:+ 1 1)&lt;/code&gt;.
Since it is not &lt;code&gt;Procedure&lt;/code&gt; or &lt;code&gt;Name&lt;/code&gt; we set our &lt;code&gt;proc&lt;/code&gt; to it.&lt;/p&gt;
&lt;p&gt;Patterns are used to describe what we should do with some particular thing, and also to describe what this particular thing should do with its arguments.
So patterns is a special data type, that holds extra information about the environment it expects around it.
Each pattern follows some kind of &lt;em&gt;behavior pattern&lt;/em&gt; thus the name.&lt;/p&gt;
&lt;p&gt;So once we&amp;rsquo;ve got our procedure pattern, we can get its arguments by calling &lt;code&gt;Self::rest_expressions&lt;/code&gt; on our pointer to the expression:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; args = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::rest_expressions(&amp;amp;expr)?;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This creates a vector of arguments and we&amp;rsquo;re not going to do much with it right now.
Our next step is the name of the procedure, so we request it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; proc_name = proc.borrow().data.data.to_string();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now once we have it, we check if it is more than 11 chars long, and substitute the first 11 chars of it.
If it&amp;rsquo;s not 11 chars long, we&amp;rsquo;ve probably got the wrong pattern, but we&amp;rsquo;ll catch that later:&lt;/p&gt;
&lt;p&gt;&lt;a id=&#34;code-snippet--checking-arguments&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; proc_name.len() &amp;gt; 11 {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; name = &amp;amp;proc_name[11..];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; user_defined = proc.borrow().data.user_defined_procedure;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; args_to_eval: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Vec&lt;/span&gt;&amp;lt;NodePtr&amp;gt; = &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; name {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;if&amp;#34;&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; !user_defined =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::pre_if(&amp;amp;args)?,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;let&amp;#34;&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; !user_defined =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::pre_let(&amp;amp;args)?,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;define&amp;#34;&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; !user_defined =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::pre_define(&amp;amp;args)?,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;progn&amp;#34;&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; !user_defined =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::pre_progn(&amp;amp;args)?,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;amp;_ &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; user_defined
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            || !BUILTINS_NOEVAL.contains(&amp;amp;name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            || &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::expression_type(&amp;amp;proc) == Type::List =&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::pre_eval(&amp;amp;args)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;amp;_ =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Vec&lt;/span&gt;::with_capacity(0),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; !args_to_eval.is_empty() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        stack.extend_from_slice(&amp;amp;args_to_eval);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;continue&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;&lt;a href=&#34;#code-snippet--checking-arguments&#34;&gt;Code Snippet 9&lt;/a&gt;:&lt;/span&gt;
  Checking what arguments we have to evaluate before continuing
&lt;/div&gt;
&lt;p&gt;Now we have the name, in our case, it&amp;rsquo;s &lt;code&gt;+&lt;/code&gt; again because we&amp;rsquo;ve stripped the &lt;code&gt;#procedure:&lt;/code&gt; part of it away.
We also get the information from our node if this procedure is &lt;code&gt;user_defined&lt;/code&gt; or not, but about that later.
Now the interesting part happens.&lt;/p&gt;
&lt;p&gt;You can see that &lt;code&gt;match&lt;/code&gt; with arms, such as &lt;code&gt;&amp;quot;if&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;let&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;define&amp;quot;&lt;/code&gt;, &lt;code&gt;progn&lt;/code&gt; all calling these &lt;code&gt;pre_&lt;/code&gt; procedures.
These are special forms.
We check if those are user-defined because if those are, they are not special anymore and we&amp;rsquo;ll call those regular functions.
But if they are not defined by the user, we call these &lt;code&gt;pre_&lt;/code&gt; functions and pass a reference to our array of arguments to those.
Let&amp;rsquo;s look at what happens in &lt;code&gt;pre_if&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;pre_if&lt;/span&gt;(args: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;[NodePtr]) -&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Result&lt;/span&gt;&amp;lt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Vec&lt;/span&gt;&amp;lt;NodePtr&amp;gt;, EvalError&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::check_argument_count(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;if&amp;#34;&lt;/span&gt;, ArgAmount::LessThan(2), args)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::expression_type(&amp;amp;args[0]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Type::Name | Type::Procedure | Type::Quasiquote | Type::Unquote =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Ok&lt;/span&gt;(vec![args[0].clone()])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        _ =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Ok&lt;/span&gt;(vec![]),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This function checks if our amount of arguments for &lt;code&gt;if&lt;/code&gt; is valid, and then checks the type of the first one.
If it is either &lt;code&gt;Name&lt;/code&gt;, &lt;code&gt;Procedure&lt;/code&gt;, &lt;code&gt;Quasiquote&lt;/code&gt;, or &lt;code&gt;Unquote&lt;/code&gt; it wraps it to the vector and returns, otherwise it returns an empty vector.&lt;/p&gt;
&lt;p&gt;The result of that function will be put into &lt;code&gt;args_to_eval&lt;/code&gt; variable, which we later check for emptiness, and if it&amp;rsquo;s not empty we push everything from it to the stack and go to the next iteration.
So in the case of &lt;code&gt;if&lt;/code&gt; we should only push the first argument, which is the condition, and evaluate it.
But we will decide later what branch to take, based on this condition.
So to illustrate this:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;stack&lt;/th&gt;
&lt;th&gt;current expression&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EMPTY&lt;/td&gt;
&lt;td&gt;&lt;code&gt;(if (eq 1 2) &amp;quot;what&amp;quot; &amp;quot;ok&amp;quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(if (eq 1 2) &amp;quot;what&amp;quot; &amp;quot;ok&amp;quot;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;if&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(if (eq 1 2) &amp;quot;what&amp;quot; &amp;quot;ok&amp;quot;), if&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;NAME EVALUATION&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(#procedure:if (eq 1 2) &amp;quot;what&amp;quot; &amp;quot;ok&amp;quot;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;(#procedure:if (eq 1 2) &amp;quot;what&amp;quot; &amp;quot;ok&amp;quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(#procedure:if (eq 1 2) &amp;quot;what&amp;quot; &amp;quot;ok&amp;quot;), (eq 1 2)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CONTINUE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(#procedure:if (eq 1 2) &amp;quot;what&amp;quot; &amp;quot;ok&amp;quot;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;(eq 1 2)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(#procedure:if (eq 1 2) &amp;quot;what&amp;quot; &amp;quot;ok&amp;quot;), eq&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;NAME EVALUATION&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(#procedure:if (#procedure:eq 1 2) &amp;quot;what&amp;quot; &amp;quot;ok&amp;quot;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;(#procedure:eq 1 2)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(#procedure:if #f &amp;quot;what&amp;quot; &amp;quot;ok&amp;quot;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CONTINUE&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This is how our expression transforms to this point.
These &lt;em&gt;CONTINUE&lt;/em&gt;, and &lt;em&gt;NAME EVALUATION&lt;/em&gt; are used to omit some things that would make this table somewhat longer.
Now we have this expression, and we again call &lt;code&gt;pre_if&lt;/code&gt; on its arguments, but the first argument no longer belongs to &lt;code&gt;Name&lt;/code&gt;, &lt;code&gt;Procedure&lt;/code&gt;, &lt;code&gt;Quasiquote&lt;/code&gt;, or &lt;code&gt;Unquote&lt;/code&gt;, so we return the empty vector, and thus go further.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;stack&lt;/th&gt;
&lt;th&gt;current expression&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EMPTY&lt;/td&gt;
&lt;td&gt;&lt;code&gt;(#procedure:if #f &amp;quot;what&amp;quot; &amp;quot;ok&amp;quot;)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;quot;ok&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CONTINUE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EMPTY&lt;/td&gt;
&lt;td&gt;END&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;When the stack is empty, means that we&amp;rsquo;ve traversed and reduced our tree fully, and the last popped item is the result, which in this case is &lt;code&gt;&amp;quot;ok&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This happens with all &lt;code&gt;pre_&lt;/code&gt; procedures, those filter arguments are based on what special form we have as our procedure.
E.g. for &lt;code&gt;define&lt;/code&gt; we only need to evaluate the second one.
For &lt;code&gt;let&lt;/code&gt; we only need to evaluate each second one, because arguments are going in pairs.
&lt;code&gt;pre_progn&lt;/code&gt; is a bit different in a way that it reverses our arguments, because the order in &lt;code&gt;progn&lt;/code&gt; is a thing that we must follow, and because we put expressions to the stack, we have to reverse those to keep the original order:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;pre_progn&lt;/span&gt;(args: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;[NodePtr]) -&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Result&lt;/span&gt;&amp;lt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Vec&lt;/span&gt;&amp;lt;NodePtr&amp;gt;, EvalError&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::check_argument_count(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;progn&amp;#34;&lt;/span&gt;, ArgAmount::LessThan(1), args)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Ok&lt;/span&gt;(args
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       .iter()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       .rev()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       .cloned()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       .filter(|arg| &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::expression_type(arg) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           Type::Name | Type::Procedure | Type::Quasiquote | Type::Unquote =&amp;gt; &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           _ =&amp;gt; &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       .collect())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;(progn a b c)&lt;/code&gt; without reverse would form this stack: &lt;code&gt;[progn, a, b, c]&lt;/code&gt; which means that &lt;code&gt;c&lt;/code&gt; will evaluate before &lt;code&gt;a&lt;/code&gt;, but if &lt;code&gt;c&lt;/code&gt; depends on &lt;code&gt;a&lt;/code&gt; , we&amp;rsquo;ll get error.
So we need to reverse arguments before we put those in the stack, thus getting this stack: &lt;code&gt;[progn, c, b, a]&lt;/code&gt;.
This way we will evaluate &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;, &lt;code&gt;c&lt;/code&gt;, and then came back to &lt;code&gt;progn&lt;/code&gt;, which will return it&amp;rsquo;s last expression &lt;code&gt;c&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If we got neither of the special forms, and our procedure is not in the list of procedures that do not evaluate arguments at all, we call &lt;code&gt;pre_eval&lt;/code&gt; which is identical to &lt;code&gt;pre_progn&lt;/code&gt; but doesn&amp;rsquo;t reverse argument order.&lt;/p&gt;
&lt;p&gt;So once we&amp;rsquo;ve dealt with our arguments it&amp;rsquo;s time to apply the procedure to those.
For now, I will omit some things until we really need those, so in we call &lt;code&gt;apply&lt;/code&gt; our &lt;code&gt;proc&lt;/code&gt; to &lt;code&gt;args&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a id=&#34;code-snippet--simplified procedure application&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Tree::replace_tree(&amp;amp;expr, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.apply(&amp;amp;proc, &amp;amp;args)?);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;continue&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;&lt;a href=&#34;#code-snippet--simplified procedure application&#34;&gt;Code Snippet 10&lt;/a&gt;:&lt;/span&gt;
  Simplified procedure application call
&lt;/div&gt;
&lt;h2 id=&#34;apply-procedure-to-arguments&#34;&gt;&lt;code&gt;Apply&lt;/code&gt; procedure to arguments&lt;/h2&gt;
&lt;p&gt;Now we&amp;rsquo;ve got to procedure application, and yet again, the first thing we do is check &lt;code&gt;proc&lt;/code&gt; type:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;apply&lt;/span&gt;(&amp;amp;&lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;, proc: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;NodePtr&lt;/span&gt;, args: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;[NodePtr]) -&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Result&lt;/span&gt;&amp;lt;NodePtr, EvalError&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::expression_type(&amp;amp;proc) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// …
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As you can remember, I&amp;rsquo;ve said that if we&amp;rsquo;ve got the wrong pattern, then we will probably catch it.
Here&amp;rsquo;s the place where this happens.
And the first type that is correct for us is…
&lt;code&gt;List&lt;/code&gt;?&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type::List =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::list_get(&amp;amp;proc, &amp;amp;args),
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wait, what?&lt;/p&gt;
&lt;p&gt;Yes, lists are functions.
Because the underlying data structure is a vector, and not a linked list, we actually can get elements from our list pretty fast!
So if we call list as a function and provide an argument of a certain number, we&amp;rsquo;ll get an element located at that index, pretty much as if we were accessing an array in Rust with &lt;code&gt;[]&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&amp;#39;(1 2 3) 0)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;c&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;d&lt;/span&gt;) 1)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Furthermore, if we provide two arguments, we can get sub list of a list, without using &lt;code&gt;car&lt;/code&gt;, &lt;code&gt;cdr&lt;/code&gt;, &lt;code&gt;cons&lt;/code&gt; and recursion at all:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;define&lt;/span&gt; names &amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Adam&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Josh&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Peter&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Steven&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Genry&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (names 1 3)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Josh&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Peter&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Steven&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If we try to access an element beyond the boundaries of a list we&amp;rsquo;ll get an error:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&amp;#39;(1 2 3 4 5 6) 6) &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;; lists are indexed from 0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;;; evaluation error: index 6 is out of bounds of a list of len 6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Because of that &lt;code&gt;length&lt;/code&gt; is also written in terms of accessing internal data representation of a vector and checking its length.&lt;/p&gt;
&lt;p&gt;Our next type is indeed a &lt;code&gt;Pattern&lt;/code&gt;.
I&amp;rsquo;ve mentioned that we&amp;rsquo;re looking for a &lt;code&gt;#procedure:&lt;/code&gt; type pattern so our &lt;code&gt;mathc&lt;/code&gt; arm has a check for it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type::Pattern
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; proc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .borrow()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .to_string()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .starts_with(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;#procedure:&amp;#34;&lt;/span&gt;) =&amp;gt; { &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;/* …  */&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;_ =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Err&lt;/span&gt;(EvalError::WrongApply {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    expr: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::tree_to_string(&amp;amp;proc),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}),
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And if the pattern is not starting with a &lt;code&gt;#procedure:&lt;/code&gt; we drop to the &lt;code&gt;_&lt;/code&gt; (any) pattern, which is an error.&lt;/p&gt;
&lt;p&gt;So what&amp;rsquo;s happening in case we&amp;rsquo;ve got the correct pattern?
Let&amp;rsquo;s see:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; name = proc.borrow().data.data.to_string()[11..].to_owned();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; name.as_ref() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;newline&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::newline(&amp;amp;args),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;read&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::read(&amp;amp;args),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;define&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.define(&amp;amp;args),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;lambda&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::lambda(&amp;amp;args),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;if&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::if_proc(&amp;amp;args),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;cond&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::cond(&amp;amp;args),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;progn&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::progn(&amp;amp;args),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;let&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::let_proc(&amp;amp;args),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;car&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::car(&amp;amp;args),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;cdr&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::cdr(&amp;amp;args),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;cons&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::cons(&amp;amp;args),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;display&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::display(&amp;amp;args),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;eval&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::eval_proc(&amp;amp;args),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;empty?&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::is_empty(&amp;amp;args),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;length&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::length(&amp;amp;args),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;+&amp;#34;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;%&amp;#34;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;remainder&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::math(&amp;amp;name, &amp;amp;args),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&amp;gt;&amp;#34;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&amp;lt;=&amp;#34;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&amp;gt;=&amp;#34;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;=&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::compare(&amp;amp;name, &amp;amp;args),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _ =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Err&lt;/span&gt;(EvalError::UnknownProc { name }),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ah, another &lt;code&gt;match&lt;/code&gt;, that matches the name of the procedure.
These are built-in procedures, that are known to our interpreter and implemented internally.
If we got &lt;code&gt;progn&lt;/code&gt; it calls &lt;code&gt;Self::progn&lt;/code&gt; and passes &lt;code&gt;args&lt;/code&gt; to it.
Then &lt;code&gt;progn&lt;/code&gt; returns an expression.
The same goes for every procedure here.
Each of those returns a compound type of &lt;code&gt;Result&amp;lt;NodePtr, EvalError&amp;gt;&lt;/code&gt;, which either signals about the error, or has a resulting expression.
And if we got a procedure that is not on this list, we get an unknown procedure error.
I will not go into details of each built-in procedure, but generally speaking, each of those takes an array of arguments, checks those to be the correct amount and type, and does something with those.&lt;/p&gt;
&lt;p&gt;Now you&amp;rsquo;ve might think where are user-defined procedures handled?
If this &lt;code&gt;apply&lt;/code&gt; function supports only built-in procedures, what&amp;rsquo;s the point of it?
That&amp;rsquo;s why I said earlier, at the end of the [Evaluation of the &lt;code&gt;Procedure&lt;/code&gt; ](#code-snippet&amp;ndash;simplified procedure application) that we will skip some code, regarding user-defined procedures, because user-defined procedures work kinda differently.
&lt;strong&gt;And&lt;/strong&gt; you may have noticed that the list of built-ins above contains that one procedure, that we can use for defining procedures - &lt;code&gt;lambda&lt;/code&gt;.
Let&amp;rsquo;s look at it!&lt;/p&gt;
&lt;h3 id=&#34;builtin-lambda-procedure&#34;&gt;Builtin &lt;code&gt;lambda&lt;/code&gt; procedure&lt;/h3&gt;
&lt;p&gt;So what &lt;code&gt;lambda&lt;/code&gt; does?
How does it work?
To understand this, we need to look at the syntax for the lambda:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;lambda&lt;/span&gt; (x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;*&lt;/span&gt; x x x))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here&amp;rsquo;s a &lt;code&gt;lambda&lt;/code&gt; that takes one argument &lt;code&gt;x&lt;/code&gt; and multiplies it by itself by calling &lt;code&gt;*&lt;/code&gt; procedure over three arguments of that &lt;code&gt;x&lt;/code&gt;.
This already gives us a lot of information.
For example, not only does &lt;code&gt;lambda&lt;/code&gt; create a procedure, but it also defines a binding for its argument, so it could then be used inside that &lt;code&gt;lambda&lt;/code&gt; by other procedures, such as &lt;code&gt;*&lt;/code&gt; in our case.&lt;/p&gt;
&lt;p&gt;So how do we apply this procedure?
We wrap with parentheses:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;((&lt;span style=&#34;font-weight:bold&#34;&gt;lambda&lt;/span&gt; (x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;*&lt;/span&gt; x x x)) 2)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here&amp;rsquo;s we apply our &lt;code&gt;lambda&lt;/code&gt; to argument of &lt;code&gt;2&lt;/code&gt;, which binds &lt;code&gt;x&lt;/code&gt; to be &lt;code&gt;2&lt;/code&gt;, so when &lt;code&gt;*&lt;/code&gt; is evaluated we &lt;code&gt;lookup&lt;/code&gt; each &lt;code&gt;x&lt;/code&gt;, evaluate it to &lt;code&gt;2&lt;/code&gt; and then apply &lt;code&gt;*&lt;/code&gt; to the list of arguments &lt;code&gt;[2, 2, 2]&lt;/code&gt; thus producing the result of &lt;code&gt;8&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Lambda also can take a variadic amount of arguments, and it is achieved by providing a single argument but without any parentheses:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;lambda&lt;/span&gt; x x)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This lambda will receive any amount of arguments and return those as a list:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; ((&lt;span style=&#34;font-weight:bold&#34;&gt;lambda&lt;/span&gt; x x) 1 2 &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;5&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(1 2 &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;5&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s look at a bit more complex &lt;code&gt;lambda&lt;/code&gt; expression:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;lambda&lt;/span&gt; (x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ((&lt;span style=&#34;font-weight:bold&#34;&gt;lambda&lt;/span&gt; (y) (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;+&lt;/span&gt; x y)) 5))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This example creates a &lt;code&gt;lambda&lt;/code&gt; that takes one argument &lt;code&gt;x&lt;/code&gt; and in its body, it creates another lambda, that takes one argument &lt;code&gt;y&lt;/code&gt;, and sums &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt; in the body, and applies that &lt;code&gt;lambda&lt;/code&gt; to the argument of &lt;code&gt;5&lt;/code&gt;, thus binding &lt;code&gt;y&lt;/code&gt; to &lt;code&gt;5&lt;/code&gt;.
So whenever we call original &lt;code&gt;lambda&lt;/code&gt; and apply it to some number it will add &lt;code&gt;5&lt;/code&gt; to that number.
Not a very practical procedure, but this gives us the idea, that, perhaps, instead of evaluating our second lambda we could simply return it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;lambda&lt;/span&gt; (x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;font-weight:bold&#34;&gt;lambda&lt;/span&gt; (y) (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;+&lt;/span&gt; x y)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So, that&amp;rsquo;s a &lt;code&gt;lambda&lt;/code&gt; that takes one argument &lt;code&gt;x&lt;/code&gt; and returns a &lt;code&gt;lambda&lt;/code&gt; that takes one argument &lt;code&gt;y&lt;/code&gt; that sums up &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt;.
Wait…
If we evaluate this procedure and apply it to some number like &lt;code&gt;5&lt;/code&gt;, we should receive &lt;code&gt;(lambda (y) (+ x y))&lt;/code&gt; as a result, and there&amp;rsquo;s no &lt;code&gt;x&lt;/code&gt; in that definition.
This means that &lt;code&gt;lambda&lt;/code&gt; can grab bindings from the outside world and store those within itself!&lt;/p&gt;
&lt;p&gt;This is called &lt;a href=&#34;https://en.wikipedia.org/wiki/Closure_%28computer_programming%29&#34; target=&#34;_blank&#34;&gt;closure&lt;/a&gt;.
And what it allows us here is to store outside world bindings within our &lt;code&gt;lambda&lt;/code&gt; and reach those even if the original &lt;code&gt;lambda&lt;/code&gt; no longer exists:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (((&lt;span style=&#34;font-weight:bold&#34;&gt;lambda&lt;/span&gt; (x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;font-weight:bold&#34;&gt;lambda&lt;/span&gt; (y)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;+&lt;/span&gt; x y))) 5) 6)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;11
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (((&lt;span style=&#34;font-weight:bold&#34;&gt;lambda&lt;/span&gt; (x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;font-weight:bold&#34;&gt;lambda&lt;/span&gt; (y)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;+&lt;/span&gt; x y))) 5) 10)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;15
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;However, that&amp;rsquo;s not really good way to use such procedures.
What we can do instead is bind the lambda to a name, thus creating a &lt;em&gt;user-defined&lt;/em&gt; procedure:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;define&lt;/span&gt; gen-adder (&lt;span style=&#34;font-weight:bold&#34;&gt;lambda&lt;/span&gt; (x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    (&lt;span style=&#34;font-weight:bold&#34;&gt;lambda&lt;/span&gt; (y) (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;+&lt;/span&gt; x y))))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This gives us &lt;code&gt;gen-adder&lt;/code&gt; procedure (&lt;code&gt;gen&lt;/code&gt; stands for &lt;code&gt;generate&lt;/code&gt;).
Once we call it and pass a parameter, it will return the procedure that adds this parameter to some other parameter:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (gen-adder 5)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#procedure:anonymous
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; ((gen-adder 5) 5)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;10
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This in turn means that we can bind this resulting procedure to the name:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;define&lt;/span&gt; add2 (gen-adder 2))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (add2 40)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;42
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;OK.
Now when we&amp;rsquo;ve hopefully worked this out let&amp;rsquo;s look at the code of the built-in &lt;code&gt;lambda&lt;/code&gt; procedure.
In parts, as usual:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;lambda&lt;/span&gt;(args: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;[NodePtr]) -&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Result&lt;/span&gt;&amp;lt;NodePtr, EvalError&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::check_argument_count(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;lambda&amp;#34;&lt;/span&gt;, ArgAmount::LessThan(2), args)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// …
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As I&amp;rsquo;ve already said, we check the number of arguments, and if there&amp;rsquo;s less than &lt;code&gt;2&lt;/code&gt; that&amp;rsquo;s not a valid &lt;code&gt;lambda&lt;/code&gt; call.
E.g. &lt;code&gt;(lambda (x))&lt;/code&gt; is not a valid lambda definition.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; arg_list = args[0].clone();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; body = args[1..].to_vec();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, we take a pointer to the first argument of the &lt;code&gt;lambda&lt;/code&gt; which will either hold the list of arguments to the function we will produce or one argument that will be represented as a list.
And we take all pointers for body expressions that were passed to the &lt;code&gt;lambda&lt;/code&gt;.
This makes it possible to create procedures with any amount of expressions in the body: &lt;code&gt;(lambda (x) (display x) (newline) (+ x 1))&lt;/code&gt;, this &lt;code&gt;lambda&lt;/code&gt; takes one argument &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;displays&lt;/code&gt; it, prints a &lt;code&gt;newline&lt;/code&gt; then returns the result of &lt;code&gt;x + 1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Next, we check the type of our first argument.
It can only be a &lt;code&gt;Name&lt;/code&gt; or a &lt;code&gt;Procedure&lt;/code&gt;&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;, thus &lt;code&gt;x&lt;/code&gt; or &lt;code&gt;(x)&lt;/code&gt;.
Everything else is not valid type:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::expression_type(&amp;amp;arg_list) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Type::Procedure | Type::Name =&amp;gt; (),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _ =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Err&lt;/span&gt;(EvalError::GeneralError {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            message: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;lambda: wrong argument type&amp;#34;&lt;/span&gt;.to_owned(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If we got the correct argument we can create a new tree that will hold our lambda.
We create a new node that will be our root, and it will be holding a &lt;code&gt;Pattern&lt;/code&gt; of &lt;code&gt;#procedure:anonymous&lt;/code&gt; created with &lt;code&gt;GRData::from_proc_str&lt;/code&gt; function, and w immediately push our argument list to it as the first sub node:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; res = Tree::new(GRData::from_proc_str(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;#procedure:anonymous&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Tree::push_tree(&amp;amp;res, arg_list);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now the body.
Because of the nature of the language, e.g. everything is stored in the tree, we actually need some root node for our body, and we also need to return only the result of the last expression, so &lt;code&gt;progn&lt;/code&gt; looks like the perfect candidate:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; progn = Tree::new(GRData::from_str(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;(&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Tree::push_child(&amp;amp;progn, GRData::from_str(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;#procedure:progn&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We will then put each sub-expression from the body to that &lt;code&gt;progn&lt;/code&gt;, then push the &lt;code&gt;progn&lt;/code&gt; itself to our &lt;code&gt;#procedure:anonymous&lt;/code&gt; as its second argument, and return it as the result:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;for&lt;/span&gt; child &lt;span style=&#34;font-weight:bold&#34;&gt;in&lt;/span&gt; body.iter() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Tree::push_tree(&amp;amp;progn, child.clone());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Tree::push_tree(&amp;amp;res, progn);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Ok&lt;/span&gt;(res)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So our tree for an anonymous function that takes one argument, prints it, prints a newline, and returns the square of it should look like so:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/anonymous-procedure.svg&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;But wait!
There&amp;rsquo;s more.
I&amp;rsquo;ve talked about closures and bindings before, but where do actually those bindings go?
Where do we store those?
How &lt;code&gt;lookup&lt;/code&gt; manage to find out these bindings?
Let&amp;rsquo;s look at this missing part of our &lt;code&gt;lambda&lt;/code&gt; function:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; current = Tree::parent(&amp;amp;body[0]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(p) = current {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; !p.borrow().data.scope.is_empty() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;for&lt;/span&gt; (key, val) &lt;span style=&#34;font-weight:bold&#34;&gt;in&lt;/span&gt; p.borrow().data.scope.iter() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            progn
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .borrow_mut()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .scope
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .insert(key.clone(), val.clone());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    current = Tree::parent(&amp;amp;p);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So what this piece of code does is the creation of closure for our lambda.
It goes to the expression parent, and if it has some bindings, it copies those into the current scope.
Into the &lt;code&gt;progn&lt;/code&gt;.
Into it&amp;rsquo;s &lt;code&gt;(&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So all bindings are being stored in parentheses.
And whenever we go to the parent we immediately can see if it has bindings associated with it.
This piece goes to the first parent, checks, and if there is something, then we&amp;rsquo;re interested in it, and only it.
There&amp;rsquo;s no point to go all the way up.&lt;/p&gt;
&lt;p&gt;This closure is created upon &lt;code&gt;lambda&lt;/code&gt; creation, but that&amp;rsquo;s another closure that is being created upon &lt;code&gt;lambda&lt;/code&gt; application, as well as some other things that happen in there, such as tail call elimination.
So let&amp;rsquo;s look at how we apply our &lt;code&gt;lambda&lt;/code&gt; functions&lt;/p&gt;
&lt;h3 id=&#34;application-of-lambda-procedure&#34;&gt;Application of &lt;code&gt;lambda&lt;/code&gt; procedure&lt;/h3&gt;
&lt;p&gt;Let&amp;rsquo;s first look at the &lt;code&gt;apply_lambda&lt;/code&gt; function signature:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;apply_lambda&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lambda: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;NodePtr&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    args: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;[NodePtr],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tail_call: &lt;span style=&#34;font-weight:bold&#34;&gt;bool&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;) -&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Result&lt;/span&gt;&amp;lt;(&lt;span style=&#34;font-weight:bold&#34;&gt;bool&lt;/span&gt;, NodePtr), EvalError&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// …
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Unlike &lt;code&gt;apply&lt;/code&gt;, this function takes one extra parameter and returns an extra Boolean in the success variant.&lt;/p&gt;
&lt;p&gt;To understand what &lt;code&gt;tail_call&lt;/code&gt; does we have to go back to &lt;code&gt;eval&lt;/code&gt; function, and see a proper invocation of &lt;code&gt;apply&lt;/code&gt; and &lt;code&gt;apply_lambda&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; proc.borrow().data.user_defined_procedure {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(p) = Tree::parent(&amp;amp;expr) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; p.borrow().siblings.last().unwrap() == &amp;amp;expr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &amp;amp;&amp;amp; p.borrow()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .siblings
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .first()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .unwrap()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .borrow()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .to_string()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            == &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;#procedure:progn&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// possible tail call
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; (optimize, res) = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::apply_lambda(&amp;amp;proc, &amp;amp;args, &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; optimize {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// valid tail call
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;                Tree::replace_tree(&amp;amp;p, res);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                stack.pop();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;font-weight:bold&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Tree::replace_tree(&amp;amp;expr, res);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold&#34;&gt;continue&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Tree::replace_tree(&amp;amp;expr, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::apply_lambda(&amp;amp;proc, &amp;amp;args, &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;)?.1);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;font-weight:bold&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Tree::replace_tree(&amp;amp;expr, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.apply(&amp;amp;proc, &amp;amp;args)?);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 11:&lt;/span&gt;
  missing part of &lt;code&gt;eval&lt;/code&gt; function that is responsible for user defined procedures
&lt;/div&gt;
&lt;p&gt;It&amp;rsquo;s big.
Let&amp;rsquo;s dig into it.&lt;/p&gt;
&lt;p&gt;First, we check if our procedure is &lt;code&gt;user_defined_procedure&lt;/code&gt;, as it will allow us to early go for &lt;code&gt;apply&lt;/code&gt;, and still be able to override, say &lt;code&gt;+&lt;/code&gt; to user procedure with the same name, and call &lt;code&gt;apply_lambda&lt;/code&gt; instead.&lt;/p&gt;
&lt;p&gt;If it is &lt;code&gt;user_defined_procedure&lt;/code&gt; we go in and check if it has a parent.
If it is, this is possibly a tail call, but we also have to check that the last expression in our parent is exactly the expression we&amp;rsquo;re going to evaluate and that the first expression in the parent is &lt;code&gt;progn&lt;/code&gt; because this indicates that it is really the last expression.
If this is true, this is a possible tail call, but we can&amp;rsquo;t be sure yet.
We call &lt;code&gt;apply_lambda&lt;/code&gt; with third argument set to &lt;code&gt;true&lt;/code&gt; because the check in &lt;code&gt;apply_lambda&lt;/code&gt; will further tell us if this was a tail call or not.&lt;/p&gt;
&lt;p&gt;So if &lt;code&gt;apply_lambda&lt;/code&gt; returns &lt;code&gt;true&lt;/code&gt; we &lt;code&gt;optimize&lt;/code&gt; our call by replacing the parent with result of the &lt;code&gt;lambda&lt;/code&gt; application and pop our tree traversal stack, then we &lt;code&gt;continue&lt;/code&gt;.
If it was not a tail call, we replace the current expression with the result and &lt;code&gt;continue&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If there was a parent, but the expression was not last, or there was no &lt;code&gt;progn&lt;/code&gt; as the first one we pass &lt;code&gt;false&lt;/code&gt; as the third argument to avoid unnecessary checks for a tail call, and replace the current expression with the result.&lt;/p&gt;
&lt;p&gt;So what exactly &lt;code&gt;apply_lambda&lt;/code&gt; does?
Let&amp;rsquo;s see:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; lambda_args = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::first_expression(&amp;amp;lambda)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; lambda_body = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::rest_expressions(&amp;amp;lambda)?[0].clone();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; can_optimize = tail_call;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This deconstructs the &lt;code&gt;#procedure:anonymous&lt;/code&gt; pattern in the same way how we&amp;rsquo;ve constructed it in the &lt;code&gt;lambda&lt;/code&gt; procedure.
We also create &lt;code&gt;can_optimize&lt;/code&gt; and initialize it with our &lt;code&gt;tail_call&lt;/code&gt; value.&lt;/p&gt;
&lt;p&gt;Next, we have to create a closure, and this is going to be messy.
Here&amp;rsquo;s the code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; tail_call {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(p) = Tree::parent(&amp;amp;Tree::parent(&amp;amp;lambda).unwrap()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; args: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Vec&lt;/span&gt;&amp;lt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;String&lt;/span&gt;&amp;gt; = lambda_args
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .borrow()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .siblings
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .iter()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .map(|a| a.borrow().data.data.to_string())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .collect();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; body = lambda_body.borrow_mut();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;for&lt;/span&gt; (key, val) &lt;span style=&#34;font-weight:bold&#34;&gt;in&lt;/span&gt; p.borrow().data.scope.iter() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; !args.is_empty() &amp;amp;&amp;amp; !args.contains(key) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                can_optimize = &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;font-weight:bold&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                body.data.scope.insert(key.clone(), val.clone());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We only do this if this is a tail call because if it is not, we do not have to create any closures besides those that were created in the &lt;code&gt;lambda&lt;/code&gt; procedure, because &lt;code&gt;lookup&lt;/code&gt; will be able to find bindings in parents.
However, we can&amp;rsquo;t simply create closure and always optimize our call.
That&amp;rsquo;s how we check:&lt;/p&gt;
&lt;p&gt;First, we check if our parent has a parent.
Because at this point we only have sub expressions, we need this extra up the tree.
Then, we create a vector of the string representation of our arguments and take mutable reference to the lambda body.
Then, for each value in the scope of the parent&amp;rsquo;s parent, we do this: if the argument list is not empty, and the argument list contains the key from the parent&amp;rsquo;s scope we can&amp;rsquo;t optimize the tail call.
Because we can lose the original value of that binding, which isn&amp;rsquo;t gonna work when we, say, pass continuations.
If it is not, we put this binding to our &lt;code&gt;lambda&lt;/code&gt; scope.&lt;/p&gt;
&lt;p&gt;So if we can successfully put every binding from the parent expression to our current expression, means we no longer need the parent expression and can optimize it!&lt;/p&gt;
&lt;p&gt;After that, we can deal with the usual lambda application stuff.
First, we have to bind all argument names to respective values, but there&amp;rsquo;s a problem.
Arguments can be in form of a list, or the list itself, so we have to deal with provided arguments differently:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; procedure_name = &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &amp;amp;lambda.borrow().data.data {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Data::&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;String&lt;/span&gt; { data } &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; data.len() &amp;gt; 11 =&amp;gt; data[11..].to_string(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _ =&amp;gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;anonymous&amp;#34;&lt;/span&gt;.to_string(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::expression_type(&amp;amp;lambda_args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// …
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We store the name of our procedure&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt; so we could signal meaningful errors in case there&amp;rsquo;s a wrong argument count or other noise.
Then we check the type of &lt;code&gt;lambda_args&lt;/code&gt;.
It either can be &lt;code&gt;Procedure&lt;/code&gt;&lt;sup id=&#34;fnref1:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; or &lt;code&gt;Name&lt;/code&gt;.
In the case of &lt;code&gt;Procedure&lt;/code&gt; it is simple, because all we have to do is compare array sizes, and if those are the same, go through each array and bind data from one array to data from another, and put it into the scope:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type::Procedure =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::check_argument_count(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;amp;procedure_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ArgAmount::NotEqual(lambda_args.borrow().siblings.len()),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;amp;args,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; lambda_body = lambda_body.borrow_mut();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;for&lt;/span&gt; (key, val) &lt;span style=&#34;font-weight:bold&#34;&gt;in&lt;/span&gt; lambda_args.borrow().siblings.iter().zip(args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        lambda_body
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .scope
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .insert(key.borrow().data.to_string(), val.clone());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 12:&lt;/span&gt;
  Binding each value to each argument of a procedure
&lt;/div&gt;
&lt;p&gt;In case it is &lt;code&gt;Name&lt;/code&gt; we need to create a quoted list with all values from arguments that were passed to our function and bind it to the name:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type::Name =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; quoted_args = Tree::new(GRData::from_str(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;(&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Tree::push_child(&amp;amp;quoted_args, GRData::from_str(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;#procedure:quote&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; list = Tree::push_child(&amp;amp;quoted_args, GRData::from_str(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;(&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;for&lt;/span&gt; c &lt;span style=&#34;font-weight:bold&#34;&gt;in&lt;/span&gt; args.iter() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; res = &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::expression_type(&amp;amp;c) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Type::List | Type::Symbol =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; res = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Self&lt;/span&gt;::rest_expressions(&amp;amp;c)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                res[0].clone()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            _ =&amp;gt; c.clone(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::push_tree(&amp;amp;list, res);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lambda_body
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .borrow_mut()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .scope
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .insert(lambda_args.borrow().data.to_string(), quoted_args);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 13:&lt;/span&gt;
  Constructing a list of argument values and binding it to procedure argument
&lt;/div&gt;
&lt;p&gt;E.g. if we call expression &lt;code&gt;((lambda x x) 1 2 3 4 5)&lt;/code&gt;, this code above will create &lt;code&gt;&#39;(1 2 3 4 5)&lt;/code&gt; and bind it to &lt;code&gt;x&lt;/code&gt;.
Then our procedure will return this &lt;code&gt;x&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In case it was not a &lt;code&gt;Name&lt;/code&gt; or &lt;code&gt;Procedure&lt;/code&gt; we throw error:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;_ =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Err&lt;/span&gt;(EvalError::GeneralError {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        message: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;wrong binding type&amp;#34;&lt;/span&gt;.to_owned(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is pretty much it!
After we&amp;rsquo;ve done all of this &lt;a href=&#34;https://youtu.be/2Gc5cuekQto?t=10&#34; target=&#34;_blank&#34;&gt;our body is ready!&lt;/a&gt; So we return it, as well as information about the possibility of tail call optimization:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Ok&lt;/span&gt;((can_optimize, lambda_body))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You remember that our body is just &lt;code&gt;progn&lt;/code&gt; which contains all expressions, so our &lt;code&gt;eval&lt;/code&gt; receives it and does those ones by one.
So we simply convert all user-defined procedures to primitive procedures that are supported by an interpreter and evaluated.&lt;/p&gt;
&lt;h2 id=&#34;tail-call-elimination-example&#34;&gt;Tail call elimination example&lt;/h2&gt;
&lt;p&gt;So above we&amp;rsquo;ve discussed how tail call elimination works in GRScheme.
Let&amp;rsquo;s illustrate that process using trees for this simple procedure:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;define &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;f&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;lambda &lt;/span&gt;(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;x&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;display &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;x&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;newline&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;f&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;+ &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;x&lt;/span&gt; 1))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;f&lt;/span&gt; 0)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;&#34;&gt;…&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;9578583832728723847384
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;9578583832728723847385
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;9578583832728723847386
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;&#34;&gt;…&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This procedure displays the number we give it, prints a newline, and calls itself with the number increased by 1.
In most languages that have no tail call elimination the biggest number, we can see represents the size of the stack that we can possibly have.
However in Scheme, there&amp;rsquo;s no such limitation, and we can evaluate this procedure in constant space, e.g. the amount of RAM will stay the same.
Let&amp;rsquo;s see how this procedure is represented in our interpreter.&lt;/p&gt;
&lt;p&gt;First, we evaluate &lt;code&gt;lambda&lt;/code&gt; and produce such tree:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/lambda-result.svg&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Then, define changes &lt;code&gt;#procedure:anonymous&lt;/code&gt; to &lt;code&gt;#procedure:f&lt;/code&gt; and binds &lt;code&gt;f&lt;/code&gt; to the value of &lt;code&gt;#procedure:f&lt;/code&gt; in global scope.
Then we apply &lt;code&gt;f&lt;/code&gt; to &lt;code&gt;0&lt;/code&gt; we have this tree:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/apply-f.svg&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;&lt;code&gt;lookup&lt;/code&gt; procedure checks the value of &lt;code&gt;f&lt;/code&gt; and replaces &lt;code&gt;f&lt;/code&gt; with our &lt;code&gt;#procedure:f&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/apply-f-looked-up.svg&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Now we call &lt;code&gt;apply_lambda&lt;/code&gt; where &lt;code&gt;proc&lt;/code&gt; will hold &lt;code&gt;#procedure:f&lt;/code&gt; and &lt;code&gt;args&lt;/code&gt; will hold &lt;code&gt;[0]&lt;/code&gt;.
This binds &lt;code&gt;x&lt;/code&gt; to &lt;code&gt;0&lt;/code&gt; at the scope of the &lt;code&gt;progn&lt;/code&gt;, and gives the evaluator this tree:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/apply-lambda-result.svg&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;To clarify, the &lt;code&gt;Scope&lt;/code&gt; here is not a tree node, but data within the &lt;code&gt;(&lt;/code&gt; node.&lt;/p&gt;
&lt;p&gt;Now evaluator starts the process of evaluating this expression.
It sees &lt;code&gt;progn&lt;/code&gt; and evaluates all its arguments in order.&lt;/p&gt;
&lt;p&gt;First, we evaluate &lt;code&gt;display&lt;/code&gt; and its one and only argument &lt;code&gt;x&lt;/code&gt;.
We &lt;code&gt;lookup&lt;/code&gt; it, and find the value in &lt;code&gt;progn&#39;s&lt;/code&gt; parent &lt;code&gt;(&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/display-looked-up.svg&#34;
         alt=&#34;Figure 11: Application of (f 0)&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 11: &lt;/span&gt;Application of &lt;code&gt;(f 0)&lt;/code&gt;&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Then &lt;code&gt;display&lt;/code&gt; prints &lt;code&gt;0&lt;/code&gt; on screen, and evaluates to &lt;code&gt;#void&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/display-evaluated.svg&#34;
         alt=&#34;Figure 12: Evaluation of (display x)&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 12: &lt;/span&gt;Evaluation of &lt;code&gt;(display x)&lt;/code&gt;&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;After that, we evaluate &lt;code&gt;newline&lt;/code&gt;.
It also prints &lt;code&gt;\n&lt;/code&gt; on the screen, and evaluates to &lt;code&gt;#void&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/newline-evaluated.svg&#34;
         alt=&#34;Figure 13: Evaluation of (newline)&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 13: &lt;/span&gt;Evaluation of &lt;code&gt;(newline)&lt;/code&gt;&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;After that we evaluate &lt;code&gt;f&lt;/code&gt;, but first we need to evaluate its argument &lt;code&gt;(+ x 1)&lt;/code&gt;.
We lookup &lt;code&gt;x&lt;/code&gt; as we did for &lt;code&gt;newline&lt;/code&gt;, and evaluate &lt;code&gt;+&lt;/code&gt; with &lt;code&gt;0&lt;/code&gt; and &lt;code&gt;1&lt;/code&gt; to &lt;code&gt;1&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/sum-evaluated.svg&#34;
         alt=&#34;Figure 14: Evaluation of (&amp;#43; x 1)&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 14: &lt;/span&gt;Evaluation of &lt;code&gt;(+ x 1)&lt;/code&gt;&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Now we are ready to call &lt;code&gt;f&lt;/code&gt;.
Let&amp;rsquo;s immediately apply it to see how it looks:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/next-iteration.svg&#34;
         alt=&#34;Figure 15: Unoptimized call result&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 15: &lt;/span&gt;Unoptimized call result&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;And without tail call optimization each iteration will expand like this.
However, notice that we&amp;rsquo;re evaluating the last expression, and the first one is &lt;code&gt;progn&lt;/code&gt;.
This means, that to this point we&amp;rsquo;ve evaluated everything in this &lt;code&gt;progn&lt;/code&gt; and we can throw it away.
So instead of expanding the last expression, we replace our old &lt;code&gt;progn&lt;/code&gt; with a new one:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-03-22-grscheme-design-part-2/optimized-result.svg&#34;
         alt=&#34;Figure 16: Optimized call result&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 16: &lt;/span&gt;Optimized call result&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;We again apply all expressions in &lt;code&gt;progn&lt;/code&gt;, then call &lt;code&gt;(f 2)&lt;/code&gt; at the end and optimize the tail call.
This process repeats every time and we always use the same amount of space.&lt;/p&gt;
&lt;p&gt;This pretty much sums up how the interpreter works.
All these trees can be viewed as a direct representation of what&amp;rsquo;s going on underneath.&lt;/p&gt;
&lt;h2 id=&#34;quasiquoting-unquoting-and-unquote-splicing&#34;&gt;Quasiquoting, Unquoting, and Unquote Splicing&lt;/h2&gt;
&lt;p&gt;Currently, GRScheme has poor support for these features.
It supports quasiquoting but one thing is not done correctly, and this is due to internal data representation.
I&amp;rsquo;m not sure where to fix this, because it can be fixed in two places.&lt;/p&gt;
&lt;p&gt;To understand this problem let&amp;rsquo;s have two examples of quasiquoting and quoting in the list evaluated in Racket:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;let&lt;/span&gt; ((name1 &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (name2 &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    `(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; ,name1 &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; ,name2))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;let&lt;/span&gt; ((name1 &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (name2 &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;list&lt;/span&gt; &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; name1 &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; name2))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If we evaluate the same expressions in GRScheme, we&amp;rsquo;ll get this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-racket&#34; data-lang=&#34;racket&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;let&lt;/span&gt; (name1 &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        name2 &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    `(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; ,name1 &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; ,name2))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;let&lt;/span&gt; (name1 &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        name2 &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ((&lt;span style=&#34;font-weight:bold&#34;&gt;lambda&lt;/span&gt; x x) &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; name1 &amp;#39;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; name2))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;b&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This happens because &lt;code&gt;unquote&lt;/code&gt; evaluates &lt;code&gt;name1&lt;/code&gt;, and &lt;code&gt;name1&lt;/code&gt; holds &lt;code&gt;&#39;a&lt;/code&gt;.
So it puts &lt;code&gt;&#39;a&lt;/code&gt; to the list.
However when we construct lists with &lt;code&gt;(lambda x x)&lt;/code&gt; or with &lt;code&gt;cons&lt;/code&gt; GRScheme imitates a regular Scheme and removes unnecessary quotes.
I thought that this will work when I started developing GRScheme, but it seems that quasiquoting shatters my dreams here.&lt;/p&gt;
&lt;p&gt;I can fix this in quasiquoting as a hack, but I think that instead, I should remove hacks related to list construction and all &lt;code&gt;car&lt;/code&gt;-&lt;code&gt;cdr&lt;/code&gt; related stuff.
This way it will directly represent the internal data structure and will be much more reliable and consistent.&lt;/p&gt;
&lt;p&gt;The other way I can fix this is to make it work correct, e.g. &lt;code&gt;(quote (a))&lt;/code&gt; will yield &lt;code&gt;(a)&lt;/code&gt;, but this will introduce some other additional checks in the tree, where we have to check if we should evaluate our expression or not.
Maybe I&amp;rsquo;m missing something though, and this can be done without additional checks.
Anyway, I&amp;rsquo;ll leave it for later.
Unquote splicing is not supported at all.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Top level scope, in this case, is empty because we imitate the use of the REPL.
When a file is being parsed its contents are put to &lt;code&gt;progn&lt;/code&gt; procedure, and only the last expression result is returned.
In the case of the REPL if you enter multiple expressions without line breaks it will also be put into the &lt;code&gt;progn&lt;/code&gt; call, however, REPL removes it and evaluates expressions in global scope, thus keeping bindings.
Actually, every parsed expression sequence is wrapped to &lt;code&gt;progn&lt;/code&gt;.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Quasiquote implemented in terms of top-down gathering all valid unquotes and evaluating those bottom-up.
This is not really suitable technique for proper quasiquoting, because splicing is really hard to do this way.
Also because we store symbols in quoted form unquoting a name that holds a symbol will put a symbol in the quoted form to our list.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;&lt;code&gt;Procedure&lt;/code&gt;, in this case, means not a real procedure that we will apply, but a form of data that we expect.
E.g. out of context, this code &lt;code&gt;(x)&lt;/code&gt; is a procedure application, but in the context of a &lt;code&gt;lambda&lt;/code&gt;, it is a list of arguments.
Reusing the same patterns can be misleading, but I think it is better than adding new data structures, as some other languages do.
E.g. in &lt;a href=&#34;https://fennel-lang.org/&#34; target=&#34;_blank&#34;&gt;Fennel&lt;/a&gt; lambdas are created by using square brackets: &lt;code&gt;((lambda [x] (* x x)) 2)&lt;/code&gt; will produce &lt;code&gt;4&lt;/code&gt;, and &lt;code&gt;((lambda (x) (* x x)) 2)&lt;/code&gt; will produce an error: &lt;code&gt;Compile error in &#39;fn&#39; unknown:?: expected vector arg list [a b …]&lt;/code&gt;.
This also applies to some other Lisp derivatives, like in &lt;a href=&#34;https://clojure.org/&#34; target=&#34;_blank&#34;&gt;Clojure&lt;/a&gt;: &lt;code&gt;(fn [x] (* x x))&lt;/code&gt;.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref1:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;&lt;code&gt;define&lt;/code&gt; can detect if we&amp;rsquo;re binding a value or a procedure.
And if we&amp;rsquo;re binding anonymous procedure, &lt;code&gt;define&lt;/code&gt; changes its name to the string representation of the first argument passed to define.
E.g. if we do &lt;code&gt;(define square (lambda (x) (* x x)))&lt;/code&gt;, define will change &lt;code&gt;#procedure:anonymous&lt;/code&gt; to &lt;code&gt;#procedure:square&lt;/code&gt;.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&#34;comment-link&#34;&gt; &lt;a href=&#34;mailto:%61%6e%64%72%65%79%6f%72%73%74%2b%62%6c%6f%67%40%67%6d%61%69%6c%2e%63%6f%6d?subject=Comment: GRScheme Design Part 2 - Evaluation&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Comment via email&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Sun, 22 Mar 2020 12:14:00 +0300</pubDate>
    </item><item>
      <title>GRScheme Design Part 1 - Parsing</title>
      <link>https://andreyor.st/posts/2020-02-25-grscheme-design-part-1/</link>
      <guid>https://andreyor.st/posts/2020-02-25-grscheme-design-part-1/</guid>
      <description>&lt;p&gt;At the end of my &lt;a href=&#34;https://andreyor.st/posts/2020-01-27-on-schemes-dots/#dot-in-grscheme&#34;&gt;previous post&lt;/a&gt;, I mentioned that I will write more about GRScheme - the language that I&amp;rsquo;m working on.
As of this moment, I&amp;rsquo;m rewriting it to be more robust and to fix some design flaws that make it impossible to do such things as tail call elimination.
This series of posts will describe various things I&amp;rsquo;ve done to build a working interpreter and build a language around it.&lt;/p&gt;
&lt;p&gt;But first, let&amp;rsquo;s define what GRScheme is, and what I expect it to be when I finish development:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GRScheme is an interpreted functional language with scheme-like syntax, which uses &lt;a href=&#34;https://en.wikipedia.org/wiki/graph_reduction&#34; target=&#34;_blank&#34;&gt;graph reduction&lt;/a&gt; as a basis for evaluation.&lt;/li&gt;
&lt;li&gt;GRScheme is not a practical programming language built for wide use and is only a self-educational project.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; There are far more comprehensive and reliable lisps out there, so if you are interested in one for some practical use, you have plenty to choose from.
E.g. Arc, Clojure, Common Lisp, GNU Guile, Racket, e.t.c., and GRScheme are not part of this list.
Please keep this in mind.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;The basic process of program execution should be:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-02-25-grscheme-design-part-1/evaluation_process.svg&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Here, Reader is a special unit that reads user input from the REPL or file contents character by character and produces &lt;code&gt;GRScheme-data&lt;/code&gt;, a special data structure that we will be used for evaluation.
The evaluator consumes this data structure and produces the effect by using graph reduction to provide the final result.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s also dashed block, that contains &lt;em&gt;Compiler&lt;/em&gt;, and sub-blocks &lt;em&gt;Macro-expander&lt;/em&gt;, and &lt;em&gt;Optimizer&lt;/em&gt;.
Currently, I already have a working &lt;code&gt;Evaluator&lt;/code&gt; and &lt;code&gt;Reader&lt;/code&gt;, and thinking about a possible way to produce an intermediate result that will speed up evaluation.
There definitively will be &lt;code&gt;macro-expander&lt;/code&gt; at some point, though it doesn&amp;rsquo;t require real compilation to be applied.
But this is gonna wait till the next posts, as I have to figure this out first.&lt;/p&gt;
&lt;p&gt;In this post, I would like to talk about the data structure I use to represent programs because it is an interesting topic in the language, that I&amp;rsquo;m using for writing language core which is the Rust Programming Language.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look at an example program in GRScheme:&lt;/p&gt;
&lt;p&gt;&lt;a id=&#34;code-snippet--arithmetic-expression&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;+ &lt;/span&gt;1 (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;* &lt;/span&gt;2 3 4) (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;/ &lt;/span&gt;9 (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;+ &lt;/span&gt;1 2)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;&lt;a href=&#34;#code-snippet--arithmetic-expression&#34;&gt;Code Snippet 1&lt;/a&gt;:&lt;/span&gt;
  arithmetic expression
&lt;/div&gt;
&lt;p&gt;This is a mathematical expression that can be written as this formula:&lt;/p&gt;
&lt;img src=&#34;https://andreyor.st/ltximg/2020-02-25-grscheme-design-part-1_2598ccb36aa6381ca2c35c093c47ec45fa70f3ba.svg&#34; alt=&#34;\[1+2\cdot3\cdot4+\frac{9}{1+2}\]&#34; class=&#34;org-svg&#34; /&gt;
&lt;p&gt;Which produces such tree:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-02-25-grscheme-design-part-1/formula_tree.svg&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;However, this tree is not presented like this in GRScheme-data format.&lt;/p&gt;
&lt;p&gt;First, this is not a binary tree, and even if it was, we still would need to implement some data structure in Rust that would represent this tree.
So what&amp;rsquo;s the definition of such data structure would be?&lt;/p&gt;
&lt;h2 id=&#34;creating-the-tree-in-rust&#34;&gt;Creating the &lt;code&gt;Tree&lt;/code&gt; in Rust&lt;/h2&gt;
&lt;p&gt;If we will look at most tree definitions we will see that usually, we define some amount of sub-nodes, typically 2, for binary trees, but in our case, that would be a variable amount of &lt;code&gt;siblings&lt;/code&gt;, and a field for data.
For example in Python such &lt;code&gt;Tree&lt;/code&gt; can be defined like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;Tree&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;def&lt;/span&gt; __init__(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;, data = &lt;span style=&#34;font-weight:bold&#34;&gt;None&lt;/span&gt;, siblings = &lt;span style=&#34;font-weight:bold&#34;&gt;None&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.siblings = siblings
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.data = data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; I&amp;rsquo;m not a Python programmer, and I don&amp;rsquo;t know Python, so this may be not the best way to achieve what I&amp;rsquo;m describing, but this works, and similar to most tree representations I&amp;rsquo;ve seen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;And we can set siblings to new &lt;code&gt;Tree&lt;/code&gt;&amp;rsquo;s like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root = Tree(data = 0)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root.siblings = [Tree(data = 1),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 Tree(data = 2)]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There are many ways to declare trees in Rust, each with its own weaknesses and strong points, such as &lt;a href=&#34;https://dev.to/deciduously/no-more-tears-no-more-knots-arena-allocated-trees-in-rust-44k6&#34; target=&#34;_blank&#34;&gt;arena tree&lt;/a&gt;, or &lt;a href=&#34;https://endler.dev/2017/boxes-and-trees/&#34; target=&#34;_blank&#34;&gt;boxed tree&lt;/a&gt;, but I&amp;rsquo;ve decided to go for more or less classic C-like reference counted tree, because arena trees suffer from an expensive remove of items in the tree, and I have not figured out how to manage parents with &lt;code&gt;Box&lt;/code&gt;.
So if we try to translate the Python tree directly to Rust, we will get this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;Tree&lt;/span&gt;&amp;lt;T&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;T&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    siblings: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Vec&lt;/span&gt;&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;impl&lt;/span&gt; &amp;lt;T&amp;gt; Tree&amp;lt;T&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;new&lt;/span&gt;(data: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;T&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;Tree&lt;/span&gt;&amp;lt;T&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            data,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            siblings: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;vec&lt;/span&gt;![],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; root = Tree::new(0);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    root.siblings = vec![
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(1),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(2)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is a generic data structure that can hold any type as &lt;code&gt;T&lt;/code&gt;.
We can create a &lt;code&gt;Tree&lt;/code&gt; of &lt;code&gt;u32&lt;/code&gt;, &lt;code&gt;f64&lt;/code&gt;, &lt;code&gt;String&lt;/code&gt; or any other data just by calling &lt;code&gt;new&lt;/code&gt; with arguments of different types.
For example, calling &lt;code&gt;Tree::new(0)&lt;/code&gt; and &lt;code&gt;Tree::new(&amp;quot;0&amp;quot;)&lt;/code&gt; will create trees of types &lt;code&gt;Tree&amp;lt;i32&amp;gt;&lt;/code&gt;, and &lt;code&gt;Tree&amp;lt;&amp;amp;str&amp;gt;&lt;/code&gt; respectively.
Here we create the tree that holds &lt;code&gt;0&lt;/code&gt; as its root value and has two sub-nodes that hold &lt;code&gt;1&lt;/code&gt; and &lt;code&gt;2&lt;/code&gt; values.
So this is pretty much a tree already!&lt;/p&gt;
&lt;p&gt;Though, this is not very usable, because we can traverse the tree only to the leaves, and can&amp;rsquo;t go back to the root or previous node.
Let&amp;rsquo;s add the parent field to the tree.
In Python it would be like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;Tree&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;def&lt;/span&gt; __init__(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;, data = &lt;span style=&#34;font-weight:bold&#34;&gt;None&lt;/span&gt;, siblings = &lt;span style=&#34;font-weight:bold&#34;&gt;None&lt;/span&gt;, parent = &lt;span style=&#34;font-weight:bold&#34;&gt;None&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.siblings = siblings
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.data = data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.parent = parent
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;def&lt;/span&gt; __str__(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;[data: &lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.data&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;, parent: &lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.parent&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;, siblings: &lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.siblings&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    __repr__ = __str__
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root = Tree(data = 0)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root.siblings = [Tree(data = 1, parent = root),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 Tree(data = 2, parent = root)]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;print&lt;/span&gt;(root)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; I&amp;rsquo;ve also defined a &lt;code&gt;__str__(self)&lt;/code&gt; method that will be useful for printing the whole data structure in a recursive fashion.
This is not required but helps investigate how things are working.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;Running the code above will print this (formatted for more readability):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[ data: 0,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  parent: None,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  siblings: [ [ data: 1,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                parent: [ data: 0,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          parent: None,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          siblings: [...] ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                siblings: None ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              [ data: 2,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                parent: [ data: 0,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          parent: None,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          siblings: [...] ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                siblings: None ] ] ]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can see that &lt;code&gt;0&lt;/code&gt; has no parent, two sub-nodes &lt;code&gt;1&lt;/code&gt; and &lt;code&gt;2&lt;/code&gt; each of which has a parent &lt;code&gt;0&lt;/code&gt; that has &lt;code&gt;[...]&lt;/code&gt; sub-nodes.
This is a recursive data structure, but we only descend it for sake of printing, yet we&amp;rsquo;re able to ascend it from any sub-node to root as well.&lt;/p&gt;
&lt;p&gt;So what should we add in rust in order to achieve the same result?
One could use a reference, but this will fill our code with a lot of &lt;a href=&#34;https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html&#34; target=&#34;_blank&#34;&gt;lifetimes&lt;/a&gt;.
The other way is to use &lt;code&gt;Box&lt;/code&gt; indirection, or reference counting.
If we try to use plain &lt;code&gt;Box&lt;/code&gt; we would fail to specify the correct parent:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// Deriving something in Rust tells the compiler to generate methods for
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// our data structure.  In this case, we derive the `Clone` trait
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// implementation.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#[derive(Clone)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;Tree&lt;/span&gt;&amp;lt;T&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;T&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    parent: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Option&lt;/span&gt;&amp;lt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Box&lt;/span&gt;&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt;&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    siblings: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Vec&lt;/span&gt;&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;impl&lt;/span&gt; &amp;lt;T&amp;gt; Tree&amp;lt;T&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;new&lt;/span&gt;(data: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;T&lt;/span&gt;, parent: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Option&lt;/span&gt;&amp;lt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Box&lt;/span&gt;&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt;&amp;gt;) -&amp;gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;Tree&lt;/span&gt;&amp;lt;T&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            data,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            parent,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            siblings: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;vec&lt;/span&gt;![],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; root = Tree::new(0, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;None&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    root.siblings = vec![
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(1, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Box&lt;/span&gt;::from(root.clone()))),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(2, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Box&lt;/span&gt;::from(root.clone())))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Since we have to specify a type for our parent, and we actually can have no parent (root case), I use &lt;code&gt;Option&lt;/code&gt; type that can either hold a &lt;code&gt;None&lt;/code&gt; or &lt;code&gt;Some(T)&lt;/code&gt;.
Inside &lt;code&gt;Option&lt;/code&gt; we have a &lt;code&gt;Box&lt;/code&gt;, which is a pointer to the heap allocated data, and inside the &lt;code&gt;Box&lt;/code&gt; there&amp;rsquo;s the &lt;code&gt;Tree&amp;lt;T&amp;gt;&lt;/code&gt; itself.&lt;/p&gt;
&lt;p&gt;The problem in this code is that we do &lt;code&gt;clone&lt;/code&gt; of the root and create our &lt;code&gt;Box&lt;/code&gt; pointer out of it.
So if we go to the parent of the node which holds &lt;code&gt;1&lt;/code&gt; we&amp;rsquo;ll arrive at the copy of the &lt;code&gt;root&lt;/code&gt; node which has no sub-nodes.
This problem can be solved if we use the reference counted pointer to the tree instead of the &lt;code&gt;Box&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;use&lt;/span&gt; std::rc::Rc;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#[derive(Clone)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;Tree&lt;/span&gt;&amp;lt;T&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;T&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    parent: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Option&lt;/span&gt;&amp;lt;Rc&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt;&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    siblings: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Vec&lt;/span&gt;&amp;lt;Rc&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt;&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// -- snip --
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; root = Tree::new(0, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;None&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    *root.siblings = vec![
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(1, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(root.clone())),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(2, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(root.clone())),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This looks like it, but there&amp;rsquo;s still a problem.
If we try to run this code, we&amp;rsquo;ll get this error:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;error[E0277]: the size for values of type `[std::rc::Rc&amp;lt;Tree&amp;lt;{integer}&amp;gt;&amp;gt;]` cannot be known at compilation time
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --&amp;gt; src/main.rs:22:5
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;22 |     *root.siblings = &amp;amp;[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   |     ^^^^^^^^^^^^^^ doesn&amp;#39;t have a size known at compile-time
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   = help: the trait `std::marker::Sized` is not implemented for `[std::rc::Rc&amp;lt;Tree&amp;lt;{integer}&amp;gt;&amp;gt;]`
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   = note: to learn more, visit &amp;lt;https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   = note: the left-hand-side of an assignment must have a statically known size
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is an interesting error, and documentation suggests a solution for this, but we can fix this by using a reference.
Using a plain reference in the structure definition will force us to specify lifetime everywhere, and I&amp;rsquo;m not yet good enough with lifetimes, since it&amp;rsquo;s a pretty new concept for me.
Instead, let&amp;rsquo;s use &lt;code&gt;RefCell&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#[derive(Clone)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;Tree&lt;/span&gt;&amp;lt;T&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;T&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    parent: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Option&lt;/span&gt;&amp;lt;Rc&amp;lt;RefCell&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt;&amp;gt;&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    siblings: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Vec&lt;/span&gt;&amp;lt;Rc&amp;lt;RefCell&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt;&amp;gt;&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oh, this compiles!
Let&amp;rsquo;s print our tree!
To do so, we can &lt;code&gt;derive&lt;/code&gt; the &lt;code&gt;Debug&lt;/code&gt; trait implementation for our structure and print it with &lt;code&gt;{:?}&lt;/code&gt; placeholder in the &lt;code&gt;println!&lt;/code&gt; macro.
It works pretty much the same as in Python code, but is generated automatically:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;use&lt;/span&gt; std::cell::RefCell;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;use&lt;/span&gt; std::rc::Rc;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#[derive(Clone, Debug)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;Tree&lt;/span&gt;&amp;lt;T&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;T&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    parent: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Option&lt;/span&gt;&amp;lt;Rc&amp;lt;RefCell&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt;&amp;gt;&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    siblings: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Vec&lt;/span&gt;&amp;lt;Rc&amp;lt;RefCell&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt;&amp;gt;&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// -- snip --
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; root = Tree::new(0, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;None&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    root.borrow_mut().siblings = vec![
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(1, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(root.clone())),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(2, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(root.clone())),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    println!(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;{:?}&amp;#34;&lt;/span&gt;, root);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s run it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Tree { data: 0, parent: None, siblings: [RefCell { value: Tree { data: 1, parent: Some(RefCell { value: Tree { data: 0, parent: None, siblings: [RefCell {value: Tree { data: 1, parent: ...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;!!! gazillion lines !!!
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;... Some(RefCell { value
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;thread &amp;#39;main&amp;#39; has overflowed its stack
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fatal runtime error: stack overflow
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Aborted (core dumped)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Whoa…
This produces a stack overflow on printing.
Because compiler generated &lt;code&gt;Debug&lt;/code&gt; trait implementation is recursive.
But our tree only has two sub-nodes, how could recursion blow the stack?
And why we only see &lt;code&gt;data: 1&lt;/code&gt; then &lt;code&gt;data: 0&lt;/code&gt;, then &lt;code&gt;data: 1&lt;/code&gt; again.
Where&amp;rsquo;s &lt;code&gt;data: 2&lt;/code&gt; node?&lt;/p&gt;
&lt;p&gt;So the problem here is that our recursive code prints the data for the root node, then go into the next recursion step on the &lt;code&gt;1&lt;/code&gt; node, which contains the reference to the root, so recursion goes to the root first, and loops infinitely inside a cycle of two nodes.
These are called cyclic references and those are bad for many reasons.
One of those is that cyclic references will never be freed because their reference counter will never reach zero.
Luckily for us, Rust provides a solution!&lt;/p&gt;
&lt;p&gt;Instead of using &lt;code&gt;Rc&lt;/code&gt; for parent, let&amp;rsquo;s use &lt;code&gt;Weak&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a id=&#34;code-snippet--rust-tree&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;use&lt;/span&gt; std::cell::RefCell;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;use&lt;/span&gt; std::rc::{Rc, Weak};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#[derive(Clone, Debug)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;Tree&lt;/span&gt;&amp;lt;T&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;T&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    parent: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Option&lt;/span&gt;&amp;lt;Weak&amp;lt;RefCell&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt;&amp;gt;&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    siblings: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Vec&lt;/span&gt;&amp;lt;Rc&amp;lt;RefCell&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt;&amp;gt;&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;impl&lt;/span&gt;&amp;lt;T&amp;gt; Tree&amp;lt;T&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;new&lt;/span&gt;(data: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;T&lt;/span&gt;, parent: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Option&lt;/span&gt;&amp;lt;Weak&amp;lt;RefCell&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt;&amp;gt;&amp;gt;) -&amp;gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;Rc&lt;/span&gt;&amp;lt;RefCell&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt;&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Rc::from(RefCell::from(Tree {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            data,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            parent,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            siblings: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;vec&lt;/span&gt;![],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; root = Tree::new(0, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;None&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    root.borrow_mut().siblings = vec![
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(1, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(Rc::downgrade(&amp;amp;root))),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(2, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(Rc::downgrade(&amp;amp;root))),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    println!(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;{:?}&amp;#34;&lt;/span&gt;, root);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;&lt;a href=&#34;#code-snippet--rust-tree&#34;&gt;Code Snippet 2&lt;/a&gt;:&lt;/span&gt;
  &lt;code&gt;Tree&lt;/code&gt; in Rust using &lt;code&gt;Rc&lt;/code&gt; and &lt;code&gt;Weak&lt;/code&gt;
&lt;/div&gt;
&lt;p&gt;Now if we run this code we get the proper tree representation:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;RefCell {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    value: Tree {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        data: 0,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        parent: None,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        siblings: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            RefCell { value:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Tree { data: 1,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       parent: Some((Weak)),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       siblings: [] } },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            RefCell { value:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Tree { data: 2,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       parent: Some((Weak)),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       siblings: [] } }] } }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And it looks almost exactly how we declare it in the &lt;code&gt;main&lt;/code&gt; function, and certainly looks like what we&amp;rsquo;ve got in the Python example!
However, those types are hard to type every time.
We can solve this by using &lt;code&gt;type&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;use&lt;/span&gt; std::cell::RefCell;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;use&lt;/span&gt; std::rc::{Rc, Weak};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;NodePtr&lt;/span&gt;&amp;lt;T&amp;gt; = Rc&amp;lt;RefCell&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt;&amp;gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;WeakNodePtr&lt;/span&gt;&amp;lt;T&amp;gt; = Weak&amp;lt;RefCell&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt;&amp;gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#[derive(Clone, Debug)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;Tree&lt;/span&gt;&amp;lt;T&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;T&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    parent: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Option&lt;/span&gt;&amp;lt;WeakNodePtr&amp;lt;T&amp;gt;&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    siblings: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Vec&lt;/span&gt;&amp;lt;NodePtr&amp;lt;T&amp;gt;&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;impl&lt;/span&gt;&amp;lt;T&amp;gt; Tree&amp;lt;T&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;new&lt;/span&gt;(data: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;T&lt;/span&gt;, parent: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Option&lt;/span&gt;&amp;lt;WeakNodePtr&amp;lt;T&amp;gt;&amp;gt;) -&amp;gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;NodePtr&lt;/span&gt;&amp;lt;T&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Rc::from(RefCell::from(Tree {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            data,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            parent,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            siblings: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;vec&lt;/span&gt;![],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And here&amp;rsquo;s a simple recursive traversal for our tree, that prints it as an S-expression:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;impl&lt;/span&gt;&amp;lt;T&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;ToString&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;for&lt;/span&gt; Tree&amp;lt;T&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;where&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    T: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;ToString&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;to_string&lt;/span&gt;(&amp;amp;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;String&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;where&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        T: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;ToString&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;build_string&lt;/span&gt;&amp;lt;T&amp;gt;(node: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;Rc&lt;/span&gt;&amp;lt;RefCell&amp;lt;Tree&amp;lt;T&amp;gt;&amp;gt;&amp;gt;, string: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;String&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;where&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            T: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;ToString&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; !node.borrow().siblings.is_empty() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                string.push_str(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;(&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            string.push_str(&amp;amp;format!(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;{} &amp;#34;&lt;/span&gt;, node.borrow().data.to_string()));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold&#34;&gt;for&lt;/span&gt; n &lt;span style=&#34;font-weight:bold&#34;&gt;in&lt;/span&gt; node.borrow().siblings.iter() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                build_string(n, string);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            *string = string.trim().to_owned();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; !node.borrow().siblings.is_empty() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                string.push_str(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;)&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            string.push_str(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; string = format!(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;({} &amp;#34;&lt;/span&gt;, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.data.to_string());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;for&lt;/span&gt; c &lt;span style=&#34;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.siblings.iter() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            build_string(c, &amp;amp;&lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; string);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        string = string.trim().to_owned();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        string.push_str(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;)&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        string
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now let&amp;rsquo;s try it.
Remember that &lt;a href=&#34;#code-snippet--arithmetic-expression&#34;&gt;formula&lt;/a&gt; I&amp;rsquo;ve shown before?
Let&amp;rsquo;s convert it to the tree:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; plus = Tree::new(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;+&amp;#34;&lt;/span&gt;, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;None&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    plus.borrow_mut().siblings = vec![
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(Rc::downgrade(&amp;amp;plus))),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(Rc::downgrade(&amp;amp;plus))),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(Rc::downgrade(&amp;amp;plus))),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; mul = plus.borrow().siblings[1].clone();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mul.borrow_mut().siblings = vec![
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;2&amp;#34;&lt;/span&gt;, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(Rc::downgrade(&amp;amp;mul))),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;3&amp;#34;&lt;/span&gt;, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(Rc::downgrade(&amp;amp;mul))),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;4&amp;#34;&lt;/span&gt;, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(Rc::downgrade(&amp;amp;mul))),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; div = plus.borrow().siblings[2].clone();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    div.borrow_mut().siblings = vec![
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;9&amp;#34;&lt;/span&gt;, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(Rc::downgrade(&amp;amp;div))),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;+&amp;#34;&lt;/span&gt;, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(Rc::downgrade(&amp;amp;div))),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; plus1 = div.borrow().siblings[1].clone();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    plus1.borrow_mut().siblings = vec![
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(Rc::downgrade(&amp;amp;plus1))),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Tree::new(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;2&amp;#34;&lt;/span&gt;, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(Rc::downgrade(&amp;amp;plus1))),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    println!(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;{}&amp;#34;&lt;/span&gt;, plus.borrow().to_string());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If we run this code, we&amp;rsquo;ll see this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(+ 1 (* 2 3 4) (/ 9 (+ 1 2)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Which directly represents our example from the beginning.
This gets us to the point where we can use this data structure to represent our tree.
However, making trees in such a way is impractical and tedious.
I&amp;rsquo;ve implemented some more methods for the tree, such as &lt;code&gt;add_child&lt;/code&gt;, &lt;code&gt;parent&lt;/code&gt;, &lt;code&gt;adopt_tree&lt;/code&gt;, &lt;code&gt;replace_tree&lt;/code&gt;, and so forth.
You can check those in the GRScheme source code repository if you want.&lt;/p&gt;
&lt;p&gt;But in order to automate this process so we could specify an expression and get its tree representation we have to write the parser, or so-called &lt;code&gt;reader&lt;/code&gt;, which will read input character by character, analyze it and produce a tree as the result.
&lt;code&gt;Reader&lt;/code&gt; is a crucial part of our interpreter since it serves as a translation unit between the user and the interpreter itself.&lt;/p&gt;
&lt;h2 id=&#34;writing-reader&#34;&gt;Writing &lt;code&gt;reader&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Since our tree is generic we need to define a proper data structure to hold both the data from input and additional information we may need to build the tree correctly.
For that purpose let&amp;rsquo;s create another structure in &lt;code&gt;reader&lt;/code&gt; module:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;GRData&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;String&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Not as big as one might expect, and we could use &lt;code&gt;String&lt;/code&gt; directly in &lt;code&gt;Tree&amp;lt;String&amp;gt;&lt;/code&gt; fashion, but it&amp;rsquo;ll get bigger, I promise.
We&amp;rsquo;ll need some extra data later on, but for now, let&amp;rsquo;s limit ourselves to &lt;code&gt;String&lt;/code&gt; holding field named &lt;code&gt;data&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So, how will we parse text?
First, we need to write a function that will do the text processing:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;parse&lt;/span&gt;(expression: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;str&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Result&lt;/span&gt;&amp;lt;NodePtr&amp;lt;GRData&amp;gt;, ReadError&amp;gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There&amp;rsquo;s a lot going on already.
First, we create a function named &lt;code&gt;parse&lt;/code&gt;, that takes one parameter &lt;code&gt;expression&lt;/code&gt; of type &lt;code&gt;&amp;amp;str&lt;/code&gt; and returns the &lt;code&gt;Result&lt;/code&gt; which can either be &lt;code&gt;NodePtr&amp;lt;GRData&amp;gt;&lt;/code&gt; for our tree, or &lt;code&gt;ReadError&lt;/code&gt;.
&lt;code&gt;Result&lt;/code&gt; is a special type for functions that might fail, so we can store some error information in the &lt;code&gt;Err(T)&lt;/code&gt; field.
If the function succeeds we store the result in &lt;code&gt;Ok(T)&lt;/code&gt;.
So in our case we&amp;rsquo;ll be storing error messages as &lt;code&gt;ReadError&lt;/code&gt;, and use our &lt;code&gt;GRData&lt;/code&gt; for &lt;code&gt;Ok&lt;/code&gt; value.
This is what I like about Rust because with &lt;code&gt;Result&lt;/code&gt; and &lt;code&gt;Option&lt;/code&gt; there&amp;rsquo;s no need for exceptions.
We can carry our error through functions that expect that error and know how to deal with it.
Now let&amp;rsquo;s think about what we&amp;rsquo;ll be parsing.&lt;/p&gt;
&lt;p&gt;The Scheme&amp;rsquo;s syntax is quite simple - mostly everything is enclosed with parentheses, but there are some special cases as well.&lt;/p&gt;
&lt;p&gt;The first one is comments.
Comments are line-wise and written using the &lt;code&gt;;&lt;/code&gt; symbol, so If we&amp;rsquo;re finding that symbol in our input we can skip parsing those.
With some exceptions.&lt;/p&gt;
&lt;p&gt;The other special case is double quote &lt;code&gt;&amp;quot;&lt;/code&gt;.
If we see it in our input it means we&amp;rsquo;re inside the string, and we should put everything as a single piece of information until we meet another &lt;code&gt;&amp;quot;&lt;/code&gt;.
This also includes comments, because those can be part of a string.
However, even with quotes, there&amp;rsquo;s a special case.&lt;/p&gt;
&lt;p&gt;Escaping quotes inside strings can be done with the &lt;code&gt;\&lt;/code&gt; symbol like this: &lt;code&gt;&amp;quot;this \&amp;quot;string\&amp;quot; contains a nested string&amp;quot;&lt;/code&gt;.
So we should keep an eye on this symbol and what&amp;rsquo;s going after it.&lt;/p&gt;
&lt;p&gt;Now on to regular things in Scheme&amp;rsquo;s syntax.&lt;/p&gt;
&lt;p&gt;In my implementation, all parentheses will represent the same thing, e.g. the list boundaries.
However parentheses must match each other, so if the list was started with the &lt;code&gt;(&lt;/code&gt; it must end with &lt;code&gt;)&lt;/code&gt;, and if it was started with &lt;code&gt;[&lt;/code&gt;, or &lt;code&gt;{&lt;/code&gt; it must be ended with &lt;code&gt;]&lt;/code&gt;, or &lt;code&gt;}&lt;/code&gt; respectively.&lt;/p&gt;
&lt;p&gt;Quoting of items is possible with &lt;code&gt;&#39;&lt;/code&gt; and &lt;code&gt;`&lt;/code&gt;, right before the list.
Unquoting can be done with &lt;code&gt;,&lt;/code&gt;, and &lt;code&gt;,@&lt;/code&gt; before the list as well.
These characters can not be used inside words except for strings.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve mentioned &amp;ldquo;word&amp;rdquo; in the previous paragraph.
&lt;code&gt;Word&lt;/code&gt; is a sequence of non-reserved non-white-space characters.
In our case everything that is not a space, tab, newline, semicolon, quote, double-quote, &lt;code&gt;`&lt;/code&gt;, &lt;code&gt;@&lt;/code&gt;, &lt;code&gt;,&lt;/code&gt;, escape character, all kinds of parentheses, and &lt;code&gt;#&lt;/code&gt;, is going to be a valid word.
For the purpose of a more general mechanism, strings are &lt;em&gt;words&lt;/em&gt; as well.
These are valid words in terms of our parser:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;a
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;word
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dashed-word
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;arrowed-&amp;gt;word
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;strings are treated as words&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;slashed/word
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;123
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-=.+_*^&amp;amp;%$!~@
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;These are invalid words:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;paren(inside
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;colon,inside
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;unquote,@splicing-indide
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;semicolon;inside
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;quotes&amp;#39;inside`
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Doing such parsing is nothing really special in Rust.
It&amp;rsquo;s a bunch of logic around iterating over characters.
The interesting part is tree construction.
If you&amp;rsquo;re interested in &lt;code&gt;parse&lt;/code&gt; source, you can look at it &lt;a href=&#34;https://gitlab.com/andreyorst/grscheme/-/blob/1781c53eabe9d0a69db373409decc718142423bd/src/parser.rs#L51&#34; target=&#34;_blank&#34;&gt;here&lt;/a&gt;, though it can be implemented better.&lt;/p&gt;
&lt;p&gt;So the basic idea is that we parse character stream into &lt;em&gt;words&lt;/em&gt; or items, and decide what to do with those.
For example, if we meet &lt;code&gt;(&lt;/code&gt; we should treat it as a new list, and if we meet &lt;code&gt;a&lt;/code&gt; as a &lt;code&gt;name&lt;/code&gt;.
For that purpose, I&amp;rsquo;ve written a function that analyses words and produces tokens.
And this &lt;code&gt;enum&lt;/code&gt; contains all tokens that we will need:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;enum&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;Token&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Value,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Eval,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Apply,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Quote { kind: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&amp;#39;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;str&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Symbol,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;None&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Value&lt;/code&gt; is a token for anything that is essentially a value, e.g. &lt;code&gt;&amp;quot;4&amp;quot;&lt;/code&gt;, &lt;code&gt;42&lt;/code&gt;, but since we&amp;rsquo;re parsing raw character data, names are treated as &lt;code&gt;Values&lt;/code&gt; too.
Don&amp;rsquo;t worry, we will not need this information when we will do the tree evaluation, so it&amp;rsquo;s safe to mix these two.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Eval&lt;/code&gt; is used for &lt;code&gt;(&lt;/code&gt;, &lt;code&gt;{&lt;/code&gt;, and &lt;code&gt;[&lt;/code&gt;, and basically means that we will start new sub-tree here.
&lt;code&gt;Apply&lt;/code&gt; is a matching counterpart, which will say that we must go up to a parent.&lt;/p&gt;
&lt;p&gt;Next is &lt;code&gt;Quote&lt;/code&gt; and it is a bit more interesting because it features this &lt;code&gt;kind: &amp;amp;&#39;static str&lt;/code&gt; thing.
What this essentially means is that we will hold an additional static string with quote kind in this &lt;code&gt;enum&lt;/code&gt; field so we could later distinguish &lt;code&gt;quote&lt;/code&gt; from &lt;code&gt;quasiquote&lt;/code&gt; and friends.
What&amp;rsquo;s also interesting is that we store unwrapped information in the tree, so we convert &lt;code&gt;&#39;a&lt;/code&gt; into &lt;code&gt;(quote a)&lt;/code&gt;, and &lt;code&gt;,a&lt;/code&gt; to &lt;code&gt;(unquote a)&lt;/code&gt; and that&amp;rsquo;s where &lt;code&gt;kind&lt;/code&gt; comes in handy.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Symbol&lt;/code&gt; is used to ascend from special quote variants, I&amp;rsquo;ll talk about it a bit later.&lt;/p&gt;
&lt;p&gt;And the last is &lt;code&gt;None&lt;/code&gt; and it is used as an initial value and never used in the parser anymore.&lt;/p&gt;
&lt;p&gt;Now to the &lt;em&gt;tokenizer&lt;/em&gt; itself:&lt;/p&gt;
&lt;p&gt;&lt;a id=&#34;code-snippet--tokenizer&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;tokenize&lt;/span&gt;(&amp;amp;&lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;, word: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;str&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Result&lt;/span&gt;&amp;lt;Token, ReadError&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; last_token = &amp;amp;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.last_token;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; token = &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; word {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;(&amp;#34;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;[&amp;#34;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;{&amp;#34;&lt;/span&gt; =&amp;gt; Token::Eval,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;)&amp;#34;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;]&amp;#34;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;}&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; last_token {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Token::Quote { .. } =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Err&lt;/span&gt;(ReadError::UnexpectedExpressionEnd {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    line: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.line_num,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    column: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.column_num,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            _ =&amp;gt; Token::Apply,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;,&amp;#34;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;,@&amp;#34;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt; =&amp;gt; Token::Quote {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            kind: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;match&lt;/span&gt; word {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;quote&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;,&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;unquote&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;`&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;quasiquote&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;,@&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;unquote-splicing&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                _ =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Err&lt;/span&gt;(ReadError::InvalidSyntax {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        message: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;format&lt;/span&gt;!(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;unexpected quote type \&amp;#34;{}\&amp;#34;. line: {}, column: {}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            word, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.line_num, &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.column_num
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        ),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;amp;_ =&amp;gt; &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; last_token {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Token::Quote { .. } =&amp;gt; Token::Symbol,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            _ =&amp;gt; Token::Value,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.last_token = token.clone();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Ok&lt;/span&gt;(token)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&amp;rsquo;s pretty simple.
If we receive either of the open parentheses, it&amp;rsquo;s always &lt;code&gt;Eval&lt;/code&gt;.
If we receive any of the close ones, it&amp;rsquo;s always &lt;code&gt;Apply&lt;/code&gt;, unless the last one was &lt;code&gt;Quote&lt;/code&gt;, e.g. &lt;code&gt;&#39;)&lt;/code&gt;, then that&amp;rsquo;s an error.
If we receive any of the quotes then it&amp;rsquo;s &lt;code&gt;Quote&lt;/code&gt;, the error there would never happen, but Rust complains that other patterns are not handled, so it is there.
And everything else is either &lt;code&gt;Value&lt;/code&gt; or &lt;code&gt;Symbol&lt;/code&gt; if the last one was &lt;code&gt;Quote&lt;/code&gt;.
This may not seem enough, but we can actually build a valid program tree out of this information.&lt;/p&gt;
&lt;p&gt;So how do we manage tree structure with our &lt;code&gt;Tree&amp;lt;T&amp;gt;&lt;/code&gt; type?
First, we need to declare some methods to add things to trees in various ways.
The first and the most obvious is &lt;code&gt;add_child&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;impl&lt;/span&gt;&amp;lt;T&amp;gt; Tree&amp;lt;T&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;where&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    T: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Clone&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;new&lt;/span&gt;(data: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;T&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;NodePtr&lt;/span&gt;&amp;lt;T&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Rc::from(RefCell::from(Tree {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            data,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            parent: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;None&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            siblings: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;vec&lt;/span&gt;![],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;add_child&lt;/span&gt;(node: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;NodePtr&lt;/span&gt;&amp;lt;T&amp;gt;, data: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;T&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;NodePtr&lt;/span&gt;&amp;lt;T&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; new_node = Rc::from(RefCell::from(Tree {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            data,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            parent: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(Rc::downgrade(node)),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            siblings: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;vec&lt;/span&gt;![],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        node.borrow_mut().siblings.push(new_node.clone());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        new_node
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can see that something is going on here.
This function takes two arguments - &lt;code&gt;node&lt;/code&gt;, for a node to which we will add a child node, and &lt;code&gt;data&lt;/code&gt;, which holds the data for a new child.
Inside we create &lt;code&gt;new_node&lt;/code&gt; to hold reference counted pointer to our new &lt;code&gt;Tree&lt;/code&gt;, that has &lt;code&gt;Some&lt;/code&gt; parent, no &lt;code&gt;siblings&lt;/code&gt; and our &lt;code&gt;data&lt;/code&gt;.
After that we mutually borrow original &lt;code&gt;node&lt;/code&gt; and &lt;code&gt;push&lt;/code&gt; our &lt;code&gt;new_node&lt;/code&gt; onto its list of sub-nodes.
And in the end, we return the pointer to our &lt;code&gt;new_node&lt;/code&gt; out of our function.
This allows us to build trees in this fashion:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; root = Tree::new(0);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Tree::add_child(&amp;amp;root, 1);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Tree::add_child(&amp;amp;root, 2);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    println!(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;{:?}&amp;#34;&lt;/span&gt;, root);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Which is essentially the same tree as in &lt;a href=&#34;#code-snippet--rust-tree&#34;&gt;previous example&lt;/a&gt; but far more compact.
If we run it produces the same output (again, formatted for readability):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;RefCell {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    value: Tree {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        data: 0,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        parent: None,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        siblings: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            RefCell {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                value: Tree {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    data: 1,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    parent: Some((Weak)),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    siblings: [] } },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            RefCell {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                value: Tree {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    data: 2,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    parent: Some((Weak)),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    siblings: [] } }] } }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This also allows us to select to which node we want to add a child:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; root = Tree::new(0);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; one = Tree::add_child(&amp;amp;root, 1);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Tree::add_child(&amp;amp;one, 2);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    println!(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;{:?}&amp;#34;&lt;/span&gt;, root);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Which yields:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;RefCell {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    value: Tree {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        data: 0,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        parent: None,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        siblings: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            RefCell {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                value: Tree {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    data: 1,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    parent: Some((Weak)),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    siblings: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        RefCell {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            value: Tree {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            data: 2,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            parent: Some((Weak)),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            siblings: [] } }] } }] } }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This means that as long as we keep track of the current node, we can build any tree, and if we can go up when needed, we can build complex trees without recursion in an iterative process.&lt;/p&gt;
&lt;p&gt;So how do we add items that we&amp;rsquo;ve parsed and tokenized to the tree?
First, we need to create the tree, and for that purpose, I would like to use &lt;code&gt;progn&lt;/code&gt; as it is called in Emacs Lisp, or &lt;code&gt;begin&lt;/code&gt; as it is called in Scheme:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;parse&lt;/span&gt;(&amp;amp;&lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;, expression: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;str&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Result&lt;/span&gt;&amp;lt;NodePtr&amp;lt;GRData&amp;gt;, ReadError&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; comment = &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; inside_word = &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; inside_string = &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; unquote = &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; paren_stack = vec![];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; item = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;String&lt;/span&gt;::new();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// we create the root of the tree which holds `(progn
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; tree = Tree::new(GRData::from_str(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;(&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Tree::add_child(&amp;amp;tree, GRData::from_str(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;progn&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// here we save the tree root for later use
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; root = tree.clone();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.line_num = 1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.column_num = 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;for&lt;/span&gt; c &lt;span style=&#34;font-weight:bold&#34;&gt;in&lt;/span&gt; expression.chars() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// parsing characters, producing tokens, constructing the tree
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Ok&lt;/span&gt;(root) &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// after we&amp;#39;ve parsed we return the pointer to the root
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here we can see, that here we are defining some variables to hold parser state, such as that we&amp;rsquo;re inside a comment or string, or that we&amp;rsquo;re currently inside a word, and creating &lt;code&gt;item&lt;/code&gt; for holding our words, and &lt;code&gt;paren_stack&lt;/code&gt; for checking the balance of different parentheses.&lt;/p&gt;
&lt;p&gt;After that, we create our &lt;code&gt;tree&lt;/code&gt;, that holds &lt;code&gt;(&lt;/code&gt;, and immediately add a child that holds &lt;code&gt;progn&lt;/code&gt;.
Then we clone tree pointer to &lt;code&gt;root&lt;/code&gt; and do the parsing in &lt;code&gt;for&lt;/code&gt; loop.
After that, we constructed our tree and return it to the caller.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look at the part of the &lt;code&gt;for&lt;/code&gt; loop code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; !comment &amp;amp;&amp;amp; !inside_string {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; c {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;(&amp;#39;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;[&amp;#39;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;{&amp;#39;&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            paren_stack.push(c);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            item.push(c);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            inside_word = &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// …  see the source for full code if you&amp;#39;re interested
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            inside_string = &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            inside_word = &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;;&amp;#39;&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            comment = &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold&#34;&gt;continue&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;\t&amp;#39;&lt;/span&gt; | &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; =&amp;gt; inside_word = &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        _ =&amp;gt; inside_word = &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; inside_word {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        item.push(c);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; !item.is_empty() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tree = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.add_to_tree(&amp;amp;tree, &amp;amp;item)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        item.clear();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        unquote = &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; inside_string {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    item.push(c);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; c {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;\\&amp;#39;&lt;/span&gt; =&amp;gt; escaped = &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; !escaped {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                inside_string = &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                tree = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.add_to_tree(&amp;amp;tree, &amp;amp;item)?;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                item.clear();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            escaped = &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            escaped = &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.line_num += 1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.column_num = 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        _ =&amp;gt; escaped = &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; comment &amp;amp;&amp;amp; c == &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.line_num += 1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.column_num = 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    comment = &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If we&amp;rsquo;re not in a comment and not inside a string, we do parsing as normal.
We push characters inside &lt;code&gt;item&lt;/code&gt; to form a word until &lt;code&gt;inside_word&lt;/code&gt; becomes false, which happens when we meet some word delimiter, such as white-space.
Once we&amp;rsquo;re no longer inside word and &lt;code&gt;item&lt;/code&gt; is not empty, we do &lt;code&gt;tree = self.add_to_tree(&amp;amp;tree, &amp;amp;item)?&lt;/code&gt;, clear &lt;code&gt;item&lt;/code&gt; and go further.
If we&amp;rsquo;re inside string we&amp;rsquo;re basically waiting for the closing double quote, unless it is escaped with &lt;code&gt;\&lt;/code&gt;.
And if we&amp;rsquo;re inside comment, we simply wait for a newline.&lt;/p&gt;
&lt;p&gt;So what&amp;rsquo;s this &lt;code&gt;self.add_to_tree(&amp;amp;tree, &amp;amp;item)?&lt;/code&gt; does?
Let&amp;rsquo;s see:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;add_to_tree&lt;/span&gt;(&amp;amp;&lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;, node: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;NodePtr&lt;/span&gt;&amp;lt;GRData&amp;gt;, item: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;str&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Result&lt;/span&gt;&amp;lt;NodePtr&amp;lt;GRData&amp;gt;, ReadError&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;match&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.tokenize(item)? {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Token::Quote { kind } =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; eval = Tree::add_child(node, GRData::from(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;(&amp;#34;&lt;/span&gt;, &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Tree::add_child(&amp;amp;eval, GRData::from_str(&amp;amp;kind));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Ok&lt;/span&gt;(eval)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Token::Eval =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Ok&lt;/span&gt;(Tree::add_child(node, GRData::from_str(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;(&amp;#34;&lt;/span&gt;))),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Token::Symbol =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Tree::add_child(node, GRData::from_str(item));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.parent(node)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Token::Apply =&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.parent(node),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        _ =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Tree::add_child(node, GRData::from_str(item));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Ok&lt;/span&gt;(node.clone())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;First, we get a token for the current item, then, depending on the token, we add a sub-tree, or get the parent of a node.
and return the pointer to the tree for later use.
This means, that if the current token was &lt;code&gt;Eval&lt;/code&gt;, we add &lt;code&gt;(&lt;/code&gt; to the tree, and return the pointer to it.
If the current token was &lt;code&gt;Apply&lt;/code&gt; we return the pointer to the parent of the &lt;code&gt;node&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Quote&lt;/code&gt; and &lt;code&gt;Symbol&lt;/code&gt; are bit interesting.
You see, since we unwrap the tree to full form, e.g. &lt;code&gt;&#39;name&lt;/code&gt; is being stored as &lt;code&gt;(quote name)&lt;/code&gt;, we need to define a way of going up without parenthesis.&lt;/p&gt;
&lt;p&gt;The problem here is that when we see this input &lt;code&gt;(quote name)&lt;/code&gt; we have all information needed to build a tree - &lt;code&gt;(&lt;/code&gt; marks the root, &lt;code&gt;quote&lt;/code&gt; is the first child, &lt;code&gt;name&lt;/code&gt; is second, and &lt;code&gt;)&lt;/code&gt; marks that we have to go up.
In the case of &lt;code&gt;&#39;name&lt;/code&gt;, we see &lt;code&gt;&#39;&lt;/code&gt; which we expand to &lt;code&gt;(quote&lt;/code&gt;, but how do we actually go up without &lt;code&gt;)&lt;/code&gt;?
We can&amp;rsquo;t easily wrap the whole expression without implementing a look-ahead parser.
That&amp;rsquo;s when &lt;code&gt;Quote&lt;/code&gt;, and &lt;code&gt;Symbol&lt;/code&gt; tokens are becoming useful.&lt;/p&gt;
&lt;p&gt;When we see &lt;code&gt;&#39;&lt;/code&gt; we mark that our current token is &lt;code&gt;quote&lt;/code&gt;, and generate the &lt;code&gt;(quote-kind&lt;/code&gt; tree.
So for &lt;code&gt;&#39;&lt;/code&gt; it will be &lt;code&gt;(quote&lt;/code&gt;.
for &lt;code&gt;`&lt;/code&gt; - &lt;code&gt;(quasiquote&lt;/code&gt;, and so forth.
Next, when we meet =symbol, it means that we have some name, that must be wrapped with a parenthesis, and we should take one extra up.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s why I&amp;rsquo;ve mentioned that we&amp;rsquo;ll need more info in our &lt;code&gt;GRData&lt;/code&gt; than simply a &lt;code&gt;String&lt;/code&gt; for our value.
&lt;code&gt;GRData&lt;/code&gt; also encodes that current &lt;code&gt;node&lt;/code&gt; should take extra up:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;GRData&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data: &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;String&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    extra_up: &lt;span style=&#34;font-weight:bold&#34;&gt;bool&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And that &lt;code&gt;GRData::from(&amp;quot;(&amp;quot;, true)&lt;/code&gt; method&amp;rsquo;s second &lt;code&gt;true&lt;/code&gt; parameter is written to this &lt;code&gt;extra_up&lt;/code&gt; field.
You can see that when we finish our work with &lt;code&gt;Symbol&lt;/code&gt; we call &lt;code&gt;self.parent(node)&lt;/code&gt;, which actually checks if we need to take that extra one up, which is stored in its parent:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;parent&lt;/span&gt;(&amp;amp;&lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;, node: &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;NodePtr&lt;/span&gt;&amp;lt;GRData&amp;gt;) -&amp;gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Result&lt;/span&gt;&amp;lt;NodePtr&amp;lt;GRData&amp;gt;, ReadError&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; current = node.clone();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Some&lt;/span&gt;(parent) = Tree::parent(&amp;amp;current) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; parent.borrow().data.extra_up {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            current = parent;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            current.borrow_mut().data.extra_up = &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;font-weight:bold&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Ok&lt;/span&gt;(parent);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;Err&lt;/span&gt;(ReadError::UnexpectedExpressionEnd {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        line: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.line_num,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        column: &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;self&lt;/span&gt;.column_num,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This way it works both for lists and symbols because the quote&amp;rsquo;s parenthesis always has this extra up.
Because of this we do not actually need a look-ahead parser, and can correctly wrap all different cases of quote short-hands with appropriate parentheses.
E.g. &lt;code&gt;`(a ,b &#39;c)&lt;/code&gt; transforms into &lt;code&gt;(quasiquote (a (unquote b) (quote c)))&lt;/code&gt;, thus making shorthand for various quotes just a syntax sugar.&lt;/p&gt;
&lt;p&gt;To sum this up, let&amp;rsquo;s see how the interpreter sees this expression (over-complicated for observation reasons):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;define &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;list&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;lambda &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;x&lt;/span&gt; `(,@&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;x&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Assuming that &lt;code&gt;Current&lt;/code&gt; is a pointer to current &lt;code&gt;Node&lt;/code&gt;, and &lt;code&gt;Tree&lt;/code&gt; is holding &lt;code&gt;(&lt;/code&gt;, and that we always operating on &lt;code&gt;Current&lt;/code&gt;, when getting parent, or adding new nodes, we can view what&amp;rsquo;s happening as this table:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Token&lt;/th&gt;
&lt;th&gt;Action To Perform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Apply&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;add &lt;code&gt;Tree&lt;/code&gt;, &lt;code&gt;Current&lt;/code&gt; ← &lt;code&gt;Tree&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;define&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Value&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;add &lt;code&gt;define&lt;/code&gt; to &lt;code&gt;Current&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Value&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;add &lt;code&gt;list&lt;/code&gt; to &lt;code&gt;Current&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Apply&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;add &lt;code&gt;Tree&lt;/code&gt;, &lt;code&gt;Current&lt;/code&gt; ← &lt;code&gt;Tree&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lambda&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Value&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;add &lt;code&gt;lambda&lt;/code&gt; to &lt;code&gt;Current&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Value&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;add &lt;code&gt;x&lt;/code&gt; to &lt;code&gt;Current&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;`&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Quote&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;add &lt;code&gt;Tree&lt;/code&gt;, &lt;code&gt;Current&lt;/code&gt; ← &lt;code&gt;Tree&lt;/code&gt;, add &lt;code&gt;quasiquote&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Apply&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;add &lt;code&gt;Tree&lt;/code&gt;, &lt;code&gt;Current&lt;/code&gt; ← &lt;code&gt;Tree&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;,@&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Quote&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;add &lt;code&gt;Tree&lt;/code&gt;, &lt;code&gt;Current&lt;/code&gt; ← &lt;code&gt;Tree&lt;/code&gt;, add &lt;code&gt;unquote-splicing&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Value&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;add &lt;code&gt;x&lt;/code&gt; to &lt;code&gt;Current&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Apply&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;get &lt;code&gt;Parent&lt;/code&gt;, &lt;code&gt;Current&lt;/code&gt; ← &lt;code&gt;Parent&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Apply&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;get &lt;code&gt;Parent&lt;/code&gt;, &lt;code&gt;Current&lt;/code&gt; ← &lt;code&gt;Parent&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Apply&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;get &lt;code&gt;Parent&lt;/code&gt;, &lt;code&gt;Current&lt;/code&gt; ← &lt;code&gt;Parent&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;END&lt;/td&gt;
&lt;td&gt;END&lt;/td&gt;
&lt;td&gt;END&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;You can notice that we do not have the final &lt;code&gt;)&lt;/code&gt; here, because the first &lt;code&gt;(&lt;/code&gt; was not the part of the tree.
Yes, since the &lt;code&gt;parse&lt;/code&gt; function wraps expressions with &lt;code&gt;progn&lt;/code&gt; we could close it in the very end, but actually, we don&amp;rsquo;t have to.
Because we do not store &lt;code&gt;)&lt;/code&gt; in a tree at all, those only serve as a marker that we should get the parent of the current expression, and only &lt;code&gt;(&lt;/code&gt; is part of the tree.
To illustrate:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-02-25-grscheme-design-part-1/resulting-tree.svg&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;The expression above can be simplified down to &lt;code&gt;(define list (lambda x x))&lt;/code&gt;, but I wanted to show how we deal with different quotes, while also having an expression that works as builtin &lt;code&gt;list&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This conducts how &lt;code&gt;reader&lt;/code&gt; is done in GRScheme, though I did not go into much depth and details, noting only important parts.
For instance, our &lt;code&gt;GRData&lt;/code&gt; will grow further when we will be discussing evaluation.
All code can be found in &lt;a href=&#34;https://gitlab.com/andreyorst/grscheme&#34; target=&#34;_blank&#34;&gt;GRScheme source repository&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;pairs-in-grscheme&#34;&gt;Pairs in GRScheme&lt;/h2&gt;
&lt;p&gt;Although I want to point out some thoughts about &lt;em&gt;cons-cells&lt;/em&gt; and this data structure, we&amp;rsquo;ve been talking about.
Because the resulting underlying data structure of GRScheme is a tree (which hopefully will evolve into a graph), and not a binary tree there is only one possibility of having pairs, or cons-cells, which is emulation through syntax.&lt;/p&gt;
&lt;p&gt;The first version of GRScheme supported this via the dot syntax, which is a usual syntax for pairs in Scheme: &lt;code&gt;&#39;(1 . 2)&lt;/code&gt;.
This was fully covered in &lt;a href=&#34;https://andreyor.st/posts/2020-01-27-on-schemes-dots/&#34;&gt;previous post&lt;/a&gt; in detail, so here I would only say, that I&amp;rsquo;ve decided to drop pairs in favor of direct equality of code and underlying data structures because that&amp;rsquo;s what we love about Lisp (or at least I do).&lt;/p&gt;
&lt;p&gt;This also means that there&amp;rsquo;s no real need for &lt;code&gt;cons&lt;/code&gt;, because the underlying data structure is a tree of a vector of trees, and not a singly-linked list, which means that we &lt;em&gt;can&lt;/em&gt; push trees to any side of the vector, and iterate over those without &lt;code&gt;car&lt;/code&gt; and &lt;code&gt;cdr&lt;/code&gt;.
These procedures are still very usable, but their behavior can be altered to a certain extent to match the data structure a bit better.&lt;/p&gt;
&lt;p&gt;For example &lt;code&gt;cons&lt;/code&gt; will work as in Clojure, concatenating leaf with the tree, producing a new tree:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;cons &lt;/span&gt;&amp;#39;(1) &amp;#39;(2 3))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;((1) 2 3)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;However if &lt;code&gt;cons&lt;/code&gt; is used to produce a pair, an error is signaled:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;cons &lt;/span&gt;1 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;; error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In complement to &lt;code&gt;cons&lt;/code&gt; an &lt;code&gt;append&lt;/code&gt; tree may be added:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;append &lt;/span&gt;&amp;#39;(1) &amp;#39;(2 3))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(1 (2 3))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;append &lt;/span&gt;&amp;#39;(1) 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(1 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;append &lt;/span&gt;1 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;; error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;car&lt;/code&gt; and &lt;code&gt;cdr&lt;/code&gt; will remain, but can be described through another procedures, such as &lt;code&gt;get&lt;/code&gt; and &lt;code&gt;slice&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;car &lt;/span&gt;&amp;#39;(1 2 3 4))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;cdr &lt;/span&gt;&amp;#39;(1 2 3 4))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(2 3 4)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;get&lt;/span&gt; 2 &amp;#39;(1 2 3 4))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;slice&lt;/span&gt; 1 2 &amp;#39;(1 2 3 4))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(2 3)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Where &lt;code&gt;car&lt;/code&gt; may be a shorthand for &lt;code&gt;(get 0 list)&lt;/code&gt; and &lt;code&gt;cdr&lt;/code&gt; is &lt;code&gt;(slice 1 -1 list)&lt;/code&gt; or something like that (I&amp;rsquo;m not sure about &lt;code&gt;-1&lt;/code&gt; part).&lt;/p&gt;
&lt;p&gt;In the next post, I will write more about procedures, and their application to this data structure, which will touch on such topics, as scope, closures, lambdas, and iterative tree traversal.&lt;/p&gt;
&lt;div class=&#34;comment-link&#34;&gt; &lt;a href=&#34;mailto:%61%6e%64%72%65%79%6f%72%73%74%2b%62%6c%6f%67%40%67%6d%61%69%6c%2e%63%6f%6d?subject=Comment: GRScheme Design Part 1 - Parsing&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Comment via email&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 25 Feb 2020 18:02:00 +0300</pubDate>
    </item><item>
      <title>On Scheme&#39;s Dots</title>
      <link>https://andreyor.st/posts/2020-01-27-on-schemes-dots/</link>
      <guid>https://andreyor.st/posts/2020-01-27-on-schemes-dots/</guid>
      <description>&lt;p&gt;This is the first public post that I wrote because I&amp;rsquo;ve finally thought that I&amp;rsquo;m clever enough to do so.
Yet I must mention that I have never actually studied &lt;a href=&#34;https://en.wikipedia.org/wiki/Programming_language_theory&#34; target=&#34;_blank&#34;&gt;Programming Language Theory (PLT)&lt;/a&gt;, so I&amp;rsquo;m not a specialist on the topic I gonna talk about here.&lt;/p&gt;
&lt;p&gt;Year ago I decided that I should expand my knowledge in programming languages, and software development in general.
I&amp;rsquo;ve already programmed for several years in C for bare metal, and in C++, as well as used some scripting languages, like Awk and Perl.
But all these languages are mostly imperative styles, so I wanted something different.&lt;/p&gt;
&lt;p&gt;I had a friend talk about Lisp, and he showed me &lt;a href=&#34;http://www.paulgraham.com/avg.html&#34; target=&#34;_blank&#34;&gt;this post by Paul Graham&lt;/a&gt; and I was inspired by the things that it describes.
I&amp;rsquo;ve become interested in Lisp, so I got my digital copy of &lt;a href=&#34;https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book.html&#34; target=&#34;_blank&#34;&gt;SICP&lt;/a&gt; and started reading it.&lt;/p&gt;
&lt;p&gt;That was a year ago.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve just finished chapter one.&lt;/p&gt;
&lt;p&gt;Not that I&amp;rsquo;m stupid or something, but some exercises there are brutal.
I remember that I set 3 days on one task where you have to complete two missing lines.
It may not be that hard for others but certainly was very hard for me.
So it took me a full year to go through the first chapter, but that only thing already changed how I look at the code today.&lt;/p&gt;
&lt;p&gt;Additionally to SICP, I&amp;rsquo;ve studied Rust by reading &lt;a href=&#34;https://doc.rust-lang.org/book/&#34; target=&#34;_blank&#34;&gt;TRPL&lt;/a&gt;.
Because I wanted to learn both Rust and Scheme, I&amp;rsquo;ve decided that it will be a great exercise to write my own Scheme in Rust!
Except, I&amp;rsquo;ve only finished the first chapter of SICP, and I don&amp;rsquo;t know how language works.
And, actually, I don&amp;rsquo;t know anything about language design.&lt;/p&gt;
&lt;p&gt;So how do you write a language in Rust, when you never studied PLT, and only programmed in C, barely know Rust, only toyed with different interpreted languages, finished the first chapter of SICP, and wrote some very basic scripts in Scheme during it?&lt;/p&gt;
&lt;p&gt;Well, that&amp;rsquo;s a good question, I guess.
You may think that I decided to read about Scheme and Lisp, something &lt;a href=&#34;http://www-formal.stanford.edu/jmc/recursive.pdf&#34; target=&#34;_blank&#34;&gt;like this&lt;/a&gt;, but no, actually I&amp;rsquo;ve decided that I&amp;rsquo;ll just throw some code to the Scheme REPL and see how it behaves.&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s where the fun started.&lt;/p&gt;
&lt;h2 id=&#34;reverse-engineering-scheme&#34;&gt;Reverse-Engineering Scheme&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m not a qualified reverse engineer, and this doesn&amp;rsquo;t actually have that much with real reverse engineering.
I called it this way because the process of defining rules by behavior observation is somewhat related to reverse-engineering process, but does not go as deep as real reverse engineering does.
I&amp;rsquo;ve taken two languages, one was &lt;a href=&#34;https://www.gnu.org/software/guile/&#34; target=&#34;_blank&#34;&gt;GNU Guile&lt;/a&gt;, which implements &lt;a href=&#34;https://schemers.org/Documents/Standards/R5RS/&#34; target=&#34;_blank&#34;&gt;R5RS standard&lt;/a&gt;, and the other was &lt;a href=&#34;https://racket-lang.org/&#34; target=&#34;_blank&#34;&gt;Racket&lt;/a&gt;, which is not strictly a Scheme, but a Programming-Language Programming Language, and started throwing different code in theirs REPLs.
The observed behavior of such a concept as the dot is what motivated me to write this post.&lt;/p&gt;
&lt;p&gt;The good thing about Scheme, and actually one of the main reasons why it is so powerful, is that it is very homoiconic, and code directly represents the underlying data structure, which is a list.
Lisp itself stands for List Processor, and I never gave this enough thought until I started working on an implementation of a language.
You take most of the information for granted (or at least I do) when it is about something you do not interact with too often.&lt;/p&gt;
&lt;p&gt;So what is a list in Scheme?
Well, anything that is enclosed inside parentheses.
And we know that most everything is enclosed with parentheses in Lisp, so what&amp;rsquo;s the point of this information?
Why everything should be a list anyway?&lt;/p&gt;
&lt;p&gt;Because lists are easy to manipulate.&lt;/p&gt;
&lt;p&gt;We need to know that Scheme has &lt;em&gt;two main&lt;/em&gt; data structures: list and atom.
Lists consist of atoms or other lists and can be destructed into individual atoms, and atoms can be combined into lists.
For example, digits like &lt;code&gt;1&lt;/code&gt;, &lt;code&gt;2&lt;/code&gt;, &lt;code&gt;3&lt;/code&gt;, are atoms.
The list of these digits is represented as &lt;code&gt;&#39;(1 2 3)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In Scheme, there are three primitive procedures that work with lists: &lt;code&gt;cons&lt;/code&gt;, &lt;code&gt;car&lt;/code&gt;, and &lt;code&gt;cdr&lt;/code&gt;.
Names may be &lt;a href=&#34;https://en.wikipedia.org/wiki/CAR_and_CDR#Etymology&#34; target=&#34;_blank&#34;&gt;not very representative&lt;/a&gt;, but that are historical names (and Lisp has a very long history) so just accept it for now.
What do these procedures do?
&lt;code&gt;cons&lt;/code&gt; stands for construction, and it is used to construct lists.
Here&amp;rsquo;s what you will see if you start Racket REPL and input this code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;cons &lt;/span&gt;1 &amp;#39;(2 3))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(1 2 3)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: I&amp;rsquo;ll be using Racket&amp;rsquo;s REPL format to represent things in this post because Racket&amp;rsquo;s default REPL is minimal and only consists of &lt;code&gt;&amp;gt;&lt;/code&gt; character for prompt and output is typically on the next line, compared to Guile&amp;rsquo;s REPL which is more busy looking with all of its additional info.
The Guile was taken as reference language though.
But in terms of this text, Guile and Racket behave the same.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;&lt;code&gt;car&lt;/code&gt; retrieves the first element of the list and &lt;code&gt;cdr&lt;/code&gt; returns all elements of the list after the first one:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;car &lt;/span&gt;&amp;#39;(1 2 3))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;cdr &lt;/span&gt;&amp;#39;(1 2 3))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(2 3)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Combined with recursion and a functional style of programming we can traverse the list by taking out the first element, modifying it, and creating new lists, leaving the rest of the list for the next iteration.
That&amp;rsquo;s may sound like a basic thing, but it is a really powerful concept because everything in Scheme is a list.&lt;/p&gt;
&lt;p&gt;But I&amp;rsquo;ve actually lied to you.
&lt;code&gt;cons&lt;/code&gt;, &lt;code&gt;car&lt;/code&gt;, and &lt;code&gt;cdr&lt;/code&gt; doesn&amp;rsquo;t work with lists.
Those work with &lt;em&gt;pairs&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Like, what?
What is a &lt;em&gt;pair&lt;/em&gt;?
Previously I&amp;rsquo;ve said everything is a list or atom, and now I say that there&amp;rsquo;s something other than that?
Well, yes, &lt;em&gt;pair&lt;/em&gt; is a pair of atoms, it is written as a list, but values are separated by the dot: &lt;code&gt;(1 . 2)&lt;/code&gt;.
Pair is not a list, but a more fundamental thing - a &lt;em&gt;cons cell&lt;/em&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;cons &lt;/span&gt;1 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(1 . 2)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And lists actually consist of pairs.&lt;/p&gt;
&lt;p&gt;If you have ever written a linked list in C or some language that has pointers, you know that any list consists of nodes.
Node stores information and a pointer to the next node.
If there&amp;rsquo;s no node after the node it stores a pointer to a special location.
It may point to itself, or to &lt;code&gt;void&lt;/code&gt; or somewhere else, so you could distinguish the end of the list and stop traversing it.
How many nodes does a linked list have to have to be called a list?
The answer is one, but without a pointer, to the next special node you can&amp;rsquo;t use it, so actually, a minimal list consists of two elements: the element with the data and the empty node or void.
So that thing also can be called a pair.&lt;/p&gt;
&lt;p&gt;Well, at least this can be thought that way.
And this actually aligns with what happens in Scheme!
Look:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;cons &lt;/span&gt;1 &amp;#39;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(1)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Because lists are essentially nested pairs, the last pair in the list has &lt;code&gt;&#39;()&lt;/code&gt; (empty list) as its second atom.
We can nest &lt;code&gt;cons&lt;/code&gt; to produce longer lists:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;cons &lt;/span&gt;1 (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;cons &lt;/span&gt;2 (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;cons &lt;/span&gt;3 &amp;#39;())))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(1 2 3)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Why does this work?
Because, given that &lt;code&gt;cons&lt;/code&gt; produces a pair, if we evaluate the code ourselves, we will get this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(1 . (2 . (3 . ())))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s explain why &lt;code&gt;&#39;(1 . (2 . (3 . ())))&lt;/code&gt; evaluates to &lt;code&gt;&#39;(1 2 3)&lt;/code&gt;.
My observations lead me to think that dot has two &lt;em&gt;rules&lt;/em&gt;.
The rules are as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Dot must be the second to last element in the list,&lt;/li&gt;
&lt;li&gt;Dot can be removed if after the dot comes an open parenthesis, alongside with open parenthesis and matching closing parenthesis.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Because &lt;code&gt;(cons 3 &#39;())&lt;/code&gt; produces a pair of dot separated values, and the first one is &lt;code&gt;3&lt;/code&gt;, and the other is &lt;code&gt;&#39;()&lt;/code&gt; we get the &lt;code&gt;&#39;(3 . ())&lt;/code&gt; result (because of how &lt;code&gt;quote&lt;/code&gt; works we remove &lt;code&gt;&#39;&lt;/code&gt; from &lt;code&gt;&#39;()&lt;/code&gt; and get &lt;code&gt;()&lt;/code&gt; in the resulting pair).
Now let&amp;rsquo;s apply the dot&amp;rsquo;s second rule to this code.
First let&amp;rsquo;s remove dot in the most nested example: &lt;code&gt;&#39;(3 . ())&lt;/code&gt; becomes &lt;code&gt;&#39;(3)&lt;/code&gt;, so now we have &lt;code&gt;&#39;(1 . (2 . (3)))&lt;/code&gt;.
We can repeat this to &lt;code&gt;(2 . (3)&lt;/code&gt;, producing &lt;code&gt;(2 3)&lt;/code&gt;.
Repeating this the last dot produces the simple list: &lt;code&gt;&#39;(1 2 3)&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The rules above may not be an actual thing though, because the dot is just syntax on top of the internal data structure, and it&amp;rsquo;s not stored in the list, but we&amp;rsquo;ll talk about it later.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;So why does &lt;code&gt;car&lt;/code&gt; and &lt;code&gt;cdr&lt;/code&gt; work on lists, if those are actually working on pairs?
Because &lt;code&gt;car&lt;/code&gt; removes the element before the first dot, and &lt;code&gt;cdr&lt;/code&gt; returns everything after it!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;car &lt;/span&gt;&amp;#39;(1 . (2 . (3 . ()))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1 &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;;; 1 is before the `. (2 . (3 . ()))&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;cdr &lt;/span&gt;&amp;#39;(1 . (2 . (3 . ()))))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(2 . (3 . ())) &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;; or &amp;#39;(2 3) for short&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So every time we see something like &lt;code&gt;(a b c)&lt;/code&gt;, the interpreter actually sees &lt;code&gt;(a . (b . (c . ())))&lt;/code&gt;.
That&amp;rsquo;s why &lt;code&gt;car&lt;/code&gt; and &lt;code&gt;cdr&lt;/code&gt; work both with pairs and lists.
Because lists consist of pairs!
And that&amp;rsquo;s really beautiful.&lt;/p&gt;
&lt;h3 id=&#34;and-then-i-saw-pure-beauty&#34;&gt;And then I saw pure beauty&lt;/h3&gt;
&lt;p&gt;Yet, before I fully understood what I saw, I thought that my beautiful observation is not correct at all.
But first, we need to know how to define procedures (functions) in Scheme:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;define &lt;/span&gt;(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;sum&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;b&lt;/span&gt;) (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;+ &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;b&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This constructs a procedure &lt;code&gt;sum&lt;/code&gt; that accepts two arguments &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt; and produces the sum of those as a result with the following body: &lt;code&gt;(+ a b)&lt;/code&gt;.
We can call this procedure this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;sum&lt;/span&gt; 1 3)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Because I was figuring out the rules behind the dot, which I&amp;rsquo;ve stated before, I was wondering what would happen if I use a dot in this syntax, like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;define &lt;/span&gt;(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;foo&lt;/span&gt; . &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;bar&lt;/span&gt;) &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;bar&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Not only this did not produce any errors, but this also works in a strange way:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;foo&lt;/span&gt; 22)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(22)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And at first glance, this looks like nonsense (well at least to me, remember, I didn&amp;rsquo;t finish SICP yet) and I expected it to fail because dot seem to be in the wrong place but it worked just fine.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;What the hell?&amp;rdquo; - I&amp;rsquo;ve thought.
I&amp;rsquo;ve tried to pass two arguments to the function and it still worked:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;foo&lt;/span&gt; 1 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(1 2)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;At this point, I was thinking that everything I thought I understand is wrong, but after some long thinking process, I understood this and was shocked at how beautiful this thing is.&lt;/p&gt;
&lt;p&gt;So what&amp;rsquo;s the problem here?
I&amp;rsquo;ve shown you the syntax for defining &lt;code&gt;sum&lt;/code&gt; procedure: &lt;code&gt;(define (sum a b) (+ a b)&lt;/code&gt;, but what&amp;rsquo;s actually going underneath is that anonymous procedure with arguments &lt;code&gt;(a b)&lt;/code&gt; is being bound to the name &lt;code&gt;sum&lt;/code&gt; like so:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;define &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;sum&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;lambda &lt;/span&gt;(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;b&lt;/span&gt;) (&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;+a&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;b&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can write all our procedures this way, but it is tedious to do.
So previous form with parentheses around &lt;code&gt;sum a b&lt;/code&gt; is a shorthand for this form.&lt;/p&gt;
&lt;p&gt;So what&amp;rsquo;s happening when we put the dot into the function definition?
To understand this we have to understand why everything is a list, and why we need primitive operations on lists.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The following part of this post mostly relies on what I&amp;rsquo;ve already done with my own implementation of the scheme-like language and how it works, but I think that the real scheme works somewhat similarly.
I will write more about my language later in this post and in the following post that is yet to come.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;To convert procedure from form &lt;code&gt;(define (foo bar) bar)&lt;/code&gt; to &lt;code&gt;(define foo (lambda (bar) bar))&lt;/code&gt; we need to know two things: procedure&amp;rsquo;s name, to put after &lt;code&gt;define&lt;/code&gt; and it&amp;rsquo;s arguments to put into &lt;code&gt;lambda&lt;/code&gt;.
So we &lt;code&gt;car&lt;/code&gt; the list &lt;code&gt;(foo bar)&lt;/code&gt; and receive &lt;code&gt;foo&lt;/code&gt;.
Now we need the argument list and we &lt;code&gt;cdr&lt;/code&gt; the &lt;code&gt;(foo bar)&lt;/code&gt;, and get &lt;code&gt;(bar)&lt;/code&gt;.
Now we can put &lt;code&gt;foo&lt;/code&gt; after &lt;code&gt;define&lt;/code&gt; and &lt;code&gt;(bar)&lt;/code&gt; after lambda: &lt;code&gt;(define foo (lambda (bar) bar)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;What will happen if we &lt;code&gt;cdr&lt;/code&gt; the list which has a dot?&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;cdr &lt;/span&gt;&amp;#39;(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;foo&lt;/span&gt; . &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;bar&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;bar&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This means that we getting &lt;code&gt;bar&lt;/code&gt; without parentheses around it.
So doing all previous steps for &lt;code&gt;(define (foo . bar) bar)&lt;/code&gt; expression gives us &lt;code&gt;(define foo (lambda bar bar))&lt;/code&gt; where &lt;code&gt;lambda&lt;/code&gt; has no parentheses around it&amp;rsquo;s argument.
Let&amp;rsquo;s try to use such a form of lambda directly:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-scheme&#34; data-lang=&#34;scheme&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; ((&lt;span style=&#34;font-weight:bold&#34;&gt;lambda &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;x&lt;/span&gt;) 1)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(1)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;&amp;gt;&lt;/span&gt; ((&lt;span style=&#34;font-weight:bold&#34;&gt;lambda &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;x&lt;/span&gt;) 1 2)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(1 2)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is a procedure with variable argument count!
Why?
Let&amp;rsquo;s &lt;code&gt;car&lt;/code&gt; and &lt;code&gt;cdr&lt;/code&gt; this code!&lt;/p&gt;
&lt;p&gt;First we evaluate &lt;code&gt;(lambda x x)&lt;/code&gt;, which provides &lt;code&gt;#&amp;lt;procedure&amp;gt;&lt;/code&gt; in Racket:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(#procedure 1)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we can &lt;code&gt;car&lt;/code&gt; what we will apply, and &lt;code&gt;cdr&lt;/code&gt; it&amp;rsquo;s arguments:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(car (#procedure 1))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#procedure
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(cdr (#procedure 1))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#39;(1)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So the arguments of the function are &lt;code&gt;&#39;(1)&lt;/code&gt;.
Let&amp;rsquo;s recap what our lambda does.
It was defined as &lt;code&gt;(lambda x x)&lt;/code&gt;, which means that it takes 1 thing and returns it immediately.
The thing it takes is this &lt;code&gt;&#39;(1)&lt;/code&gt;, that&amp;rsquo;s why we receive &lt;code&gt;&#39;(1)&lt;/code&gt; if we call this lambda with &lt;code&gt;1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Doing the same for &lt;code&gt;((lambda x x) 1 2)&lt;/code&gt; provides &lt;code&gt;&#39;(1 2)&lt;/code&gt; as applied argument.&lt;/p&gt;
&lt;p&gt;Why this doesn&amp;rsquo;t work for lambdas which have their argument in the parentheses?
My guess is that it is because we provide a list of a certain length, and since we&amp;rsquo;re passing a list, the items in one list get bound to the items in another, in the lambda body.&lt;/p&gt;
&lt;p&gt;OK, let&amp;rsquo;s recap what we know about Scheme so far:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;del&gt;Everything is a &lt;em&gt;list&lt;/em&gt;;&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;Scratch that, everything is a &lt;em&gt;pair&lt;/em&gt;, and every list is a sequence of nested pairs, ending with an empty list;&lt;/li&gt;
&lt;li&gt;pair is a &lt;em&gt;cons cell&lt;/em&gt;, which uses a dot to separate elements;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;car&lt;/code&gt; and &lt;code&gt;cdr&lt;/code&gt; use dot to decide what to take out of the cons cell.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;applying-the-concepts-above-in-the-interpreter-dot&#34;&gt;Applying the Concepts Above In the Interpreter.&lt;/h3&gt;
&lt;p&gt;When I started writing this post I had no idea that I still will be writing it after I&amp;rsquo;ll have a working interpreter prototype.
It is located &lt;a href=&#34;https://gitlab.com/andreyorst/grscheme&#34; target=&#34;_blank&#34;&gt;here&lt;/a&gt;, and it uses the concepts developed above to evaluate the code.
It&amp;rsquo;s not very good though.&lt;/p&gt;
&lt;p&gt;The whole language is implemented around these base functions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;parse&lt;/code&gt; - parses text into GRScheme data structure,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eval&lt;/code&gt; - which is recursively traverses the tree,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;apply&lt;/code&gt; - which applies the procedure to the tree,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_first_subexpression&lt;/code&gt; - which takes first subtree from current tree,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_rest_subexpression&lt;/code&gt; - which takes the rest subtrees as a tree.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other functions in evaluator source code provide builtin facilities like &lt;code&gt;car&lt;/code&gt;, &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;lambda&lt;/code&gt;, &lt;code&gt;define&lt;/code&gt; etc.&lt;/p&gt;
&lt;p&gt;The first thing I have to say is that GRScheme doesn&amp;rsquo;t have such a thing as a dot.
It is emulated to behave the same way as in a real Scheme.
I suppose that regular Scheme does not have a dot either but in another sense.&lt;/p&gt;
&lt;p&gt;After parsing the code we receive a tree structure that has nodes with data, and the tree directly represents the original code.
This allows me to think about the Scheme code in a very native way, because it is already a tree, and it actually simplifies parsing a lot.
I store parentheses as tree items, atoms are also tree items, but typically only parentheses have child nodes.
This allows later traversing algorithms to check if the current node is a procedure call by just checking if the current node is an open parenthesis.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;get_first_subexpression&lt;/code&gt; and &lt;code&gt;get_rest_subexpression&lt;/code&gt; functions are not exactly &lt;code&gt;car&lt;/code&gt; and &lt;code&gt;cdr&lt;/code&gt; as it may seem, but a more general ones that operate directly on the program AST.
But because the dot is emulated in my implementation those currently also check for the &lt;code&gt;.&lt;/code&gt; in the tree.
If it is presented, &lt;code&gt;get_rest_subexpression&lt;/code&gt; returns the subtrees without it.&lt;/p&gt;
&lt;p&gt;This allows us to destruct pairs and lists with these two functions, but we can&amp;rsquo;t use those directly.
Instead &lt;code&gt;car&lt;/code&gt; and &lt;code&gt;cdr&lt;/code&gt; are implemented in terms of these functions, also applying quoting on the result, but that&amp;rsquo;s a topic for a different post.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve mentioned that dot is emulated in my implementation of the interpreter.
What this means is that I store the dot directly inside the tree as a node.
Let&amp;rsquo;s have a look at how &lt;code&gt;&#39;(a . b)&lt;/code&gt; looks in my language&amp;rsquo;s data structure:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-01-27-on-schemes-dots/pair_in_grscheme.svg&#34;
         alt=&#34;Figure 1: &amp;#39;(a . b) Pair representation in GRScheme&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 1: &lt;/span&gt;&lt;code&gt;&#39;(a . b)&lt;/code&gt; Pair representation in GRScheme&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: because I write quoted lists in the short form, there is a possibility of misunderstanding why the tree in the figures doesn&amp;rsquo;t directly match the input, e.g. has more parentheses.
For instance &lt;code&gt;&#39;(a . b)&lt;/code&gt; is actually &lt;code&gt;(quote (a . b))&lt;/code&gt; and it is represented in the tree this way.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;We have a tree, with a root node holding &lt;code&gt;(&lt;/code&gt; value, which has two nodes: &lt;code&gt;quote&lt;/code&gt; and open parenthesis.
This second &lt;code&gt;(&lt;/code&gt; has three nodes, which are &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;.&lt;/code&gt;, and &lt;code&gt;b&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In a real Scheme, this isn&amp;rsquo;t stored this way.
Because pair is really a pair in Scheme, the cons cell actually stores two pointers to the data like this:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-01-27-on-schemes-dots/pair_in_scheme.svg&#34;
         alt=&#34;Figure 2: &amp;#39;(a . b) Pair in Scheme&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 2: &lt;/span&gt;&lt;code&gt;&#39;(a . b)&lt;/code&gt; Pair in Scheme&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The lists are a bit different.
In my implementation, the structure to which I parse the source code is a tree with any amount of child nodes per node, as seen in the pair example above That&amp;rsquo;s how &lt;code&gt;&#39;(1 2 3)&lt;/code&gt; list is stored in my implementation:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-01-27-on-schemes-dots/list_in_grscheme.svg&#34;
         alt=&#34;Figure 3: &amp;#39;(1 2 3) List in GRScheme&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 3: &lt;/span&gt;&lt;code&gt;&#39;(1 2 3)&lt;/code&gt; List in GRScheme&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;This is a tree, which is similar to the pair one, except instead of the dot we have &lt;code&gt;2&lt;/code&gt;.
Let&amp;rsquo;s write list as a sequence of pairs &lt;code&gt;&#39;(1 . (2 . (3 . ())))&lt;/code&gt; and see how it will be stored in my implementation:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-01-27-on-schemes-dots/dotted_list_in_grscheme.svg&#34;
         alt=&#34;Figure 4: Dotted list in GRScheme&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 4: &lt;/span&gt;Dotted list in GRScheme&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;We can see, that each subtree has exactly three nodes in it.
However in a real scheme, it&amp;rsquo;s two nodes per tree, and the very same sequence of nested pairs is stored like this:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-01-27-on-schemes-dots/list_in_scheme.svg&#34;
         alt=&#34;Figure 5: &amp;#39;(1 2 3) List in Scheme&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 5: &lt;/span&gt;&lt;code&gt;&#39;(1 2 3)&lt;/code&gt; List in Scheme&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Because any list can be written as a sequence of pairs, we can see that any list in a real scheme is actually a binary tree.
Not in the case of my language though.&lt;/p&gt;
&lt;p&gt;The parser that I&amp;rsquo;ve written for GRScheme knows how to deal with dots, thanks to the dot rules I&amp;rsquo;ve described above, and these two constructions are parsed to exactly the same form:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-01-27-on-schemes-dots/different_representations.svg&#34;
         alt=&#34;Figure 6: Both notations in GRScheme&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 6: &lt;/span&gt;Both notations in GRScheme&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;And lists that don&amp;rsquo;t end with empty list, like &lt;code&gt;&#39;(1 2 . 3)&lt;/code&gt; and &lt;code&gt;&#39;(1 . (2 . 3))&lt;/code&gt; are parsed like this:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-01-27-on-schemes-dots/no_empty_grscheme.svg&#34;
         alt=&#34;Figure 7: List with pair at the end in GRScheme&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 7: &lt;/span&gt;List with pair at the end in GRScheme&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Which, in a real Scheme, will look like this:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-01-27-on-schemes-dots/no_empty_scheme.svg&#34;
         alt=&#34;Figure 8: List with pair at the end in Scheme&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 8: &lt;/span&gt;List with pair at the end in Scheme&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;So in the case of &lt;code&gt;car&lt;/code&gt; in a real Scheme, we get &lt;code&gt;1&lt;/code&gt;, and in the case of &lt;code&gt;cdr&lt;/code&gt;, we get the subtree &lt;code&gt;&#39;(2 . 3)&lt;/code&gt; when we apply it to this list and &lt;code&gt;3&lt;/code&gt; when we apply it again to the previous result.
This works the same way in my implementation, because we analyze the tree when we do &lt;code&gt;cdr&lt;/code&gt; to see if there&amp;rsquo;s a dot in the second position, which may not be optimal, but works.&lt;/p&gt;
&lt;h2 id=&#34;dot-in-grscheme&#34;&gt;Dot in GRScheme&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve thought about dots during this post, and I think it is a very beautiful syntax solution to describe binary trees that do not end with a null pointer.
However, this also means that dots are actually needed only for that case.
Though we can emulate dots by storing those inside a tree directly, I don&amp;rsquo;t think that this is a good idea to do so.&lt;/p&gt;
&lt;p&gt;Because the underlying structure in GRScheme is a graph, and not a binary tree, I think pairs are also meaningless, because they describe a particular tree case in Schemes, and in GRScheme we do not have this case.
So one major difference from the real Scheme is that in GRScheme there are no &lt;em&gt;cons cells&lt;/em&gt;, and some algorithms may depend on extracting the second element from the cons cell directly.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve thought that it may be good to have a special procedure for that case, named along with &lt;code&gt;car&lt;/code&gt; and &lt;code&gt;cdr&lt;/code&gt; - Contents of Cons cell Representation.
&lt;code&gt;ccr&lt;/code&gt; should return the second element directly if it is the last element in the list, and return the rest of the list otherwise.
This way it will work mostly the same as &lt;code&gt;cdr&lt;/code&gt; but &lt;code&gt;cdr&lt;/code&gt; always returns the list.
I&amp;rsquo;m not sure how good this solution is, because this may be ambiguous when to use such a procedure, so there&amp;rsquo;s another procedure that may be used instead, which is &lt;code&gt;cadr&lt;/code&gt;, which always takes the second element from the list.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m planning to write a second post about GRScheme diving more deeply into the details behind the language model I&amp;rsquo;ve developed.
The current implementation is slightly wrong and has many problems, so I have to fix those first.&lt;/p&gt;
&lt;div class=&#34;comment-link&#34;&gt; &lt;a href=&#34;mailto:%61%6e%64%72%65%79%6f%72%73%74%2b%62%6c%6f%67%40%67%6d%61%69%6c%2e%63%6f%6d?subject=Comment: On Scheme&#39;s Dots&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Comment via email&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 27 Jan 2020 13:22:00 +0300</pubDate>
    </item>
  </channel>
</rss>
