<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Clojure on zacharyc</title>
    <link>https://www.zacharyc.com/tags/clojure/</link>
    <description>Recent content in Clojure on zacharyc</description>
    <image>
      <title>zacharyc</title>
      <url>https://www.zacharyc.com/papermod-cover.png</url>
      <link>https://www.zacharyc.com/</link>
    </image>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Tue, 21 May 2024 20:30:49 -0400</lastBuildDate>
    <atom:link href="https://www.zacharyc.com/tags/clojure/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Lists vs Vectors in Clojure</title>
      <link>https://www.zacharyc.com/2024/05/21/lists-vs-vectors-in-clojure/</link>
      <pubDate>Tue, 21 May 2024 20:30:49 -0400</pubDate>
      <guid>https://www.zacharyc.com/2024/05/21/lists-vs-vectors-in-clojure/</guid>
      <description>&lt;p&gt;One of the projects I&amp;rsquo;m working on for &lt;a href=&#34;https://gluino.io&#34;&gt;Gluino&lt;/a&gt; has me thinking about data structures again. Data structures are ways of storing data in memory (either program memory or on disk), and the choice can be significant.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m working on a list of requests with scores and values. This list grows dynamically as items enter and leave it. It could contain 0, 1, or many items.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s discuss the implementation of these structures in a more common programming language better to understand the difference between a list and a vector. Simply put, a vector is like an array of memory, whereas a list is more similar to a linked list. Here is some C code creating an array, which is akin to a vector:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>One of the projects I&rsquo;m working on for <a href="https://gluino.io">Gluino</a> has me thinking about data structures again. Data structures are ways of storing data in memory (either program memory or on disk), and the choice can be significant.</p>
<p>I&rsquo;m working on a list of requests with scores and values. This list grows dynamically as items enter and leave it. It could contain 0, 1, or many items.</p>
<p>Let&rsquo;s discuss the implementation of these structures in a more common programming language better to understand the difference between a list and a vector. Simply put, a vector is like an array of memory, whereas a list is more similar to a linked list. Here is some C code creating an array, which is akin to a vector:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">num_array</span><span class="p">[</span><span class="mi">10</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">13</span><span class="p">,</span> <span class="mi">21</span><span class="p">,</span> <span class="mi">34</span><span class="p">,</span> <span class="mi">55</span><span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="c1">// Creates an array of integers accessibly sequentially
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Num at fourth position is: %d&#34;</span><span class="p">,</span> <span class="n">num_array</span><span class="p">[</span><span class="mi">3</span><span class="p">]);</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Each number in the array/vector is stored sequentially. This is great for high-speed access because we don&rsquo;t have to visit any previous elements to get the fourth (0-based index).</p>
<p>The downside of an array/vector comes when you want to add another value to the end of the array. You can&rsquo;t just do that. Something may already be stored in the memory location right after the 10th element. So, to add a new element to an array/vector, you need to create a new array/vector with your item added:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">new_num_array</span><span class="p">[</span><span class="mi">11</span><span class="p">]</span> <span class="o">=</span> <span class="nf">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span> <span class="o">*</span> <span class="mi">11</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nf">memcpy</span><span class="p">(</span><span class="n">new_num_array</span><span class="p">,</span> <span class="n">num_array</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span> <span class="o">*</span> <span class="mi">10</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">new_num_array</span><span class="p">[</span><span class="mi">10</span><span class="p">]</span> <span class="o">=</span> <span class="mi">89</span><span class="p">;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Lists in Clojure are more like a Linked List. Each item in the list has a pointer to the next one (assuming it is singly linked). Here is how one would make a list in C:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="k">struct</span> <span class="n">NumberItem</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">item</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">struct</span> <span class="n">NumberItem</span><span class="o">*</span> <span class="n">next</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="n">twelve</span><span class="p">,</span> <span class="n">twentyFour</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// main func
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">struct</span> <span class="n">NumberItem</span> <span class="o">*</span><span class="n">list</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">twelve</span><span class="p">.</span><span class="n">item</span> <span class="o">=</span> <span class="mi">12</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">twelve</span><span class="p">.</span><span class="n">next</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">twentyFour</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">twentyFour</span><span class="p">.</span><span class="n">item</span> <span class="o">=</span> <span class="mi">24</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">twentyFour</span><span class="p">.</span><span class="n">next</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">list</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">twelve</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;first is %d, and second is %d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">list</span><span class="o">-&gt;</span><span class="n">item</span><span class="p">,</span> <span class="n">list</span><span class="o">-&gt;</span><span class="n">next</span><span class="o">-&gt;</span><span class="n">item</span><span class="p">);</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>What we can see in this code is that items in a list are grouped by pointer. Adding or removing an item is about updating pointers, not reallocating memory.</p>
<h2 id="clojure">Clojure</h2>
<p>Clojure provides an abstraction for these concepts in vectors and lists.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-clojure" data-lang="clojure"><span class="line"><span class="cl"><span class="c1">;; List</span>
</span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">list </span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">;; Vector</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span><span class="p">]</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>The difference is that lists don&rsquo;t guarantee order, but you can add and remove items easily. Vectors, on the other hand, are sets of contiguous memory, and the order is guaranteed, but adding or removing an item requires allocating new space for a newly created vector.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
