<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>jecs:~/posts</title>
    <link>https://www.jecs.me/posts/index.xml</link>
    <description>Recent content from https://www.jecs.me/posts/</description>
    <language>en-us</language>
    <atom:link href="https://www.jecs.me/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Thoughts on Common Lisp</title>
      <link>https://www.jecs.me/posts/thoughts-on-cl/</link>
      <guid>https://www.jecs.me/posts/thoughts-on-cl/</guid>
      <pubDate>Wed, 19 Jun 2024</pubDate>
      <description>
      &lt;p&gt;&#xA;I&amp;#39;m on a &amp;#34;programming language world tour&amp;#34; to try to find an elegant, expressive, language to replace my usage of C#. Why? For fun. 3 weeks into my Common Lisp (CL) excursion, here is what I think its greatest strength and weakness is.&lt;/p&gt;
      &lt;p&gt;&#xA;I&amp;#39;m on a &amp;#34;programming language world tour&amp;#34; to try to find an elegant, expressive, language to replace my usage of C#. Why? For fun. 3 weeks into my Common Lisp (CL) excursion, here is what I think its greatest strength and weakness is.&lt;/p&gt;&#xA;&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;&#xA;&lt;h2 id=&#34;headline-1&#34;&gt;&#xA;Unmatched Interactivity&#xA;&lt;/h2&gt;&#xA;&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;&#xA;&lt;p&gt;&#xA;The experience of programming with the REPL in CL is truly like no other. I haven&amp;#39;t found another language with a development cycle quite like this.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;While writing Python I often find myself writing several hundred lines of code then testing it all at the same time. Encounter a few errors off the bat, and have to find smaller logical errors as I test the code. Even worse when developing in systems with slow compilation steps, I find myself actively trying to avoid testing my code because it would take too long. Surely if I&amp;#39;m just careful and write it correctly the first time it wouldn&amp;#39;t be a problem…&lt;/p&gt;&#xA;&lt;p&gt;&#xA;With aid from the CL REPL this is never a problem. I find that I&amp;#39;m &lt;strong&gt;always&lt;/strong&gt; able to &lt;em&gt;build up&lt;/em&gt; to my solution. &lt;/p&gt;&#xA;&lt;p&gt;&#xA;Let&amp;#39;s say I&amp;#39;m writing a function to compute the sample variance of a list of numbers. While this is already solved with libraries, let&amp;#39;s try ourselves.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;The formula for variance is $S^{2}=\frac{\sum_{i=1}^{n}\left(x_{i}-\overline{x}\right)^{2}}{n - 1}$&lt;/p&gt;&#xA;&lt;p&gt;&#xA;Here I&amp;#39;ll try to capture the &lt;em&gt;process&lt;/em&gt;, building up to the final solution:&lt;/p&gt;&#xA;&lt;div class=&#34;src src-lisp&#34;&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lisp&#34; data-lang=&#34;lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;;; Task: compute sample variance of a list&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;;; Ok, I&amp;#39;ll let this guy be my test list&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defparameter&lt;/span&gt; &lt;span class=&#34;vg&#34;&gt;*my-list*&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;9.98&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;9.66&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;10.41&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;11.1&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;9.63&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;;; Ok, I need a mean function.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;reduce&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;#&amp;#39;+&lt;/span&gt; &lt;span class=&#34;vg&#34;&gt;*my-list*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;length&lt;/span&gt; &lt;span class=&#34;vg&#34;&gt;*my-list*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;;; =&amp;gt; 10.156&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;;; *I realize that it iterates over the list twice*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;;; rewrite so it only iterates once.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;;; potentially making a few mistakes along the way&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;labels&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;aux&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;lst&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;accum&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;null&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;lst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                 &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;accum&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                 &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;aux&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;cdr&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;lst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;accum&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;car&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;lst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;1+&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;aux&lt;/span&gt; &lt;span class=&#34;vg&#34;&gt;*my-list*&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;;; 10.156, seems right&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;;; wrap this into a function&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defun&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mean&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;lst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;labels&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;aux&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;lst&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;accum&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;null&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;lst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                 &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;accum&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                 &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;aux&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;cdr&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;lst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;accum&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;car&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;lst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;1+&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;aux&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;lst&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;;; write sample variance function&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defun&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;sample-variance&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;lst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;mean&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;mean&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;lst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;labels&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;aux&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;lst&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;accum&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;              &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;null&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;lst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;accum&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;aux&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;cdr&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;lst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;accum&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;expt&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;car&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;lst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mean&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;1+&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;aux&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;lst&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;-1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;;; use this function to perform some other task&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;&#xA;While writing this function I used the REPL dozens of times, to check my work, as I do it. Had my use case/example involved mutable state, I would have been checking my work in the live environment that my application would actually end up running in. Interactivity like this would be invaluable in a large system involving mutable state, you can debug your applications with access to the entire &lt;a href=&#34;https://stackoverflow.com/questions/480083/what-is-a-lisp-image&#34;&gt;lisp image&lt;/a&gt;. It&amp;#39;s hard to convey just how powerful that is, you have to try it!&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;&#xA;&lt;h2 id=&#34;headline-2&#34;&gt;&#xA;Lack of standardized documentation&#xA;&lt;/h2&gt;&#xA;&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;&#xA;&lt;p&gt;&#xA;My biggest gripe with CL is its documentation. I&amp;#39;ve used &lt;a href=&#34;https://slime.common-lisp.dev/&#34;&gt;SLIME&lt;/a&gt; and &lt;a href=&#34;https://github.com/joaotavora/sly&#34;&gt;SLY&lt;/a&gt;, arguably the defacto standard IDE&amp;#39;s for CL, and I have problems with language documentation. I can&amp;#39;t imagine what it&amp;#39;s like if you didn&amp;#39;t use Emacs.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;Common Lisp is not a single language, but rather a &lt;a href=&#34;https://www.lispworks.com/documentation/HyperSpec/Front/index.htm&#34;&gt;specification&lt;/a&gt; from 1996. The specification has many implementations, the most popular of which is &lt;a href=&#34;https://www.sbcl.org/&#34;&gt;SBCL&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;Some implementations may do certain optimizations or little things that others might not, for example SBCL will do a thorough type check given type annotations whereas another implementation might not. This, among other reasons, has created a fragmentation in the CL ecosystem.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;It makes sense to me that there isn&amp;#39;t a good LSP or culture of standardized documentation given the fragmentation. It would be subject to the scrutiny of developers when an issue could simply be an idiosyncrasy of the CL implementation.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;Here is the extent to which I&amp;#39;ve searched for documentation:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Documentation directly in my editor (great!)&lt;/li&gt;&#xA;&lt;li&gt;Find documentation online (most frequently HyperSpec or the project&amp;#39;s Github) &lt;/li&gt;&#xA;&lt;li&gt;Go to definition in editor (occurs more frequently than I&amp;#39;d like)&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;From the perspective of an API user, I found CL&amp;#39;s powerful macro system to be more of a hindrance. More often than I&amp;#39;d like, I find myself learning a brand new domain specific language to perform some action, when it could have been a simple function call. Adding fuel to the fire, a DSL is way more difficult to document than a simple function call.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;I understand the argument &amp;#34;just learn the language&amp;#34;, but my issue isn&amp;#39;t with the language core - rather, I have problems with libraries for which this argument doesn&amp;#39;t apply.&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;&#xA;&lt;h2 id=&#34;headline-3&#34;&gt;&#xA;Conclusion&#xA;&lt;/h2&gt;&#xA;&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;&#xA;&lt;p&gt;&#xA;While I enjoy the highly interactive workflows of Common Lisp, I find the lack of standardized documentation in the ecosystem makes CL difficult to work with.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;I&amp;#39;m sure theres another language with interactivity that comes relatively close to CL. I plan to continue my &amp;#34;programming language world tour&amp;#34; with OCaml.&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;
      </description>
    </item>
    <item>
      <title>Path Tracer</title>
      <link>https://www.jecs.me/posts/path-tracer/</link>
      <guid>https://www.jecs.me/posts/path-tracer/</guid>
      <pubDate>Wed, 20 Sep 2023</pubDate>
      <description>
      &lt;p&gt;&#xA;When I was learning Rust, I made a path tracer as a fun project. This is a brute force path tracer, not meant to produce images in real time, but rather realistic images.&lt;/p&gt;
      &lt;p&gt;&#xA;When I was learning Rust, I made a path tracer as a fun project. This is a brute force path tracer, not meant to produce images in real time, but rather realistic images.&lt;/p&gt;&#xA;&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;&#xA;&lt;h2 id=&#34;headline-1&#34;&gt;&#xA;Description&#xA;&lt;/h2&gt;&#xA;&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;&#xA;&lt;p&gt;&#xA;In university I took a computer graphics course and I really enjoyed it! I wanted to take it to the next level and re-wrote the project in Rust and added some features from the classic &lt;a href=&#34;https://raytracing.github.io/&#34;&gt;Ray Tracing in One Weekend Series&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;a href=&#34;https://github.com/jecars/jrpt&#34;&gt;Github Repository for the path tracer&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;Here are some images that I rendered:&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;./monkey+cornell.png&#34; alt=&#34;./monkey+cornell.png&#34; title=&#34;./monkey+cornell.png&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;./scene.png&#34; alt=&#34;./scene.png&#34; title=&#34;./scene.png&#34; /&gt;&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;
      </description>
    </item>
    <item>
      <title>Pepe&#39;s Bubbles</title>
      <link>https://www.jecs.me/posts/pepesbubbles/</link>
      <guid>https://www.jecs.me/posts/pepesbubbles/</guid>
      <pubDate>Sun, 01 May 2022</pubDate>
      <description>
      &lt;p&gt;&#xA;Pepe&amp;#39;s Bubbles, is a group project during I worked on during schooling. I was the sole backend developer of the project, and I learned much about backend design by working on it.&lt;/p&gt;
      &lt;p&gt;&#xA;Pepe&amp;#39;s Bubbles, is a group project during I worked on during schooling. I was the sole backend developer of the project, and I learned much about backend design by working on it.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;Pepes Bubbles is a online storefront for a fictional Bubble Tea store called &amp;#34;Pepe&amp;#39;s Bubbles&amp;#34; that we made up. The name/theme of the storefront was arbitrary, as the project was mainly to exercise and demonstrate our web-development skills.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;During the development of this project I worked as a the sole back-end developer for our application. I implemented the REST API and GraphQL API with Node.js, and also worked on deployment of our web-app using Dockerized containers running various technologies such as Nginx, MongoDB, Memcached, and Graylog.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;The REST API was mainly for easy third party integrations with things like Google SSO, Paypal, Google Maps, and the GraphQL API was used for the project&amp;#39;s business logic.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;See an extensive description of this project in the project repository.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;a href=&#34;https://github.com/jecars/pepes-bubbles&#34;&gt;Github Repository for Pepe&amp;#39;s Bubbles&lt;/a&gt;&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Learnera</title>
      <link>https://www.jecs.me/posts/learnera/</link>
      <guid>https://www.jecs.me/posts/learnera/</guid>
      <pubDate>Sat, 04 Sep 2021</pubDate>
      <description>
      &lt;p&gt;&#xA;Project Learnera, originally named Project BFS, is a group project during I worked on during schooling.&lt;/p&gt;
      &lt;p&gt;&#xA;Project Learnera, originally named Project BFS, is a group project during I worked on during schooling.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;Project Learnera is a collaboration project with &lt;a href=&#34;https://www.utsc.utoronto.ca/thebridge/&#34;&gt;The Bridge&lt;/a&gt; from &lt;a href=&#34;https://www.utsc.utoronto.ca/&#34;&gt;UTSC&lt;/a&gt;. The goal of the project is to tackle the African Impact Challenge by creating a web platform that combines a community and an E-Learning platform. The goal of the African Impact Challenge is to build the Africa we want to see, by investing in the continent&amp;#39;s aspiring entrepreneurs-to-be. The goal is to enable them to build market-creating innovations, which tackle their country&amp;#39;s biggest challenges with technology.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;We worked on the project from May 2021 to August 2021. The name of our development team was Brute Force Solutions, but we later changed the product name to Learnera.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;Features requested at start of development by the product owner:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Individual profile creations which use the data from the applications/registrations in an automated way, to guide each person’s user journey and recommended actions.&lt;/li&gt;&#xA;&lt;li&gt;Company profile creations with consent-provided access to uploaded information by the founding teams on pitch decks, financials, MCs, founding team, etc.&lt;/li&gt;&#xA;&lt;li&gt;Partner profile creations (investors, service providers, corporations) with relevant information about them.&lt;/li&gt;&#xA;&lt;li&gt;Enabling organic and guided interaction within this community.&lt;/li&gt;&#xA;&lt;li&gt;Virtual pre-recorded content (video/audio and visual) that can be consumed in a self-paced manner.&lt;/li&gt;&#xA;&lt;li&gt;Deliverable completion and submission.&lt;/li&gt;&#xA;&lt;li&gt;Calendar and scheduling features for participants in the incubation program.&lt;/li&gt;&#xA;&lt;li&gt;Video conferencing integration for live workshops/sessions.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/jecars/learnera&#34;&gt;Github Repository for Learnera&lt;/a&gt;&lt;/p&gt;
      </description>
    </item>
    <item>
      <title>Caseware</title>
      <link>https://www.jecs.me/experience/caseware/</link>
      <guid>https://www.jecs.me/experience/caseware/</guid>
      <pubDate>Sat, 09 Jan 2021</pubDate>
      <description>
      A journal and some artifacts from my time working at Caseware.
      &#xA;&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;&#xA;&lt;h2 id=&#34;headline-1&#34;&gt;&#xA;What is this?&#xA;&lt;/h2&gt;&#xA;&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;&#xA;&lt;p&gt;&#xA;This page is a short journaling and contains some artifacts from my time working at Caseware.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;I worked at Caseware, a software solutions company for accounting, auditing, financial, risk and governance professionals from January 2020 to December 2020.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;I worked as a application developer, working on CaseWare&amp;#39;s Audit Template product for their Working Papers application for about 3 months, then I was transferred to CaseWare&amp;#39;s cloud platform team to work on their new Cloud Platform 2.0 product.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;While on CaseWare&amp;#39;s cloud platform team I worked as a full stack developer, working on new stories, and features. We used Java with the Spring Boot framework as our back-end, and Angular as our front-end framework.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;Below are some artifacts from my time working at Caseware,&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;&#xA;&lt;h2 id=&#34;headline-2&#34;&gt;&#xA;Artifact 1&#xA;&lt;/h2&gt;&#xA;&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;./contactUI.jpg&#34; alt=&#34;./contactUI.jpg&#34; title=&#34;./contactUI.jpg&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;I am nearing the end of my 12 month co-op placement at CaseWare International, and I&amp;#39;ve been working hard on delivering the minimum viable product (MVP) for the new cloud product that CaseWare is investing in. As a fullstack developer there are a lot of technologies that I should have some level of understanding and competence in, and having that breadth I found was difficult. Advice that I acted on to try to overcome this difficulty is to try to become the subject matter expert on one area of our architecture. I decided to dive deep into the Angular framework and our front end technologies, and I was able to deliver several features into the product.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;./dlq-architecture.jpg&#34; alt=&#34;./dlq-architecture.jpg&#34; title=&#34;./dlq-architecture.jpg&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;Aside from the front end architecture that I have decided to specialized in, I have also been assigned architecture design tasks. I have presented such designs in meetings with the members of the wider CaseWare team. An example architecture that I have designed is the architecture shown in the first picture. It is a high level design and leaves out some implementation details.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;Now that I am mainly focusing on working on architecture design tasks, and so working on removing tech debt from our product. I am thinking back to the past 4 months of development to see if there&amp;#39;s any instances I wrote code that could be considered tech debt. If I were to participate in the past 4 months of development again, I would try to be more prudent to ensure that the code I am writing would be easy to understand and not have to be changed to remove future tech debt.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;Last updated 12/22/2020&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-2&#34;&gt;&#xA;&lt;h2 id=&#34;headline-3&#34;&gt;&#xA;Artifact 2&#xA;&lt;/h2&gt;&#xA;&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-2&#34;&gt;&#xA;&lt;p&gt;&#xA;I have been on my co-op placement at CaseWare International for 8 months now and a lot has changed in the industry due to Covid-19. Within the company I changed teams as a result of this change and my responsibilities have changed to that of a fullstack developer. The future seems to be cloud computing for CaseWare and I am now working as a part of the Cloud Platform team. CaseWare currently has a working cloud platform accounting solution but it has scalability issues with larger clients, due to this we are developing a new solution and I am a part development for the minimum viable product. Since the product is not yet released there are rules of confidentiality in place and I cannot share much about the product at this time. To solve the scalability issues, we are using a new software architecture described in the first picture. I am working on developing microservices to keep data and perform actions on the abstractions: users and entities. As a fullstack developer I also have to work with the client side, and I am working on UIs like that of the second picture. I am working developing UIs to interact with the server and microservices I am involved with. As a result of my involvements in development in the past several sprints, the team has picked up velocity and we are projected to finish the MVP ahead of schedule. Since my role has changed from that of a software developer to a fullstack developer, the technical stack that I work with has increased in difficulty and required level of understanding drastically. My skills of research and accelerated learning has increased as well. If I could participate in development made in these past 4 months again, I would try to learn one technology to level of competence that I am confident in, instead of trying to learn several technologies at the same time, but at a slower pace. As an onboarding fullstack developer it is common to be overwhelmed trying to learn all the different technologies, and with that change I would have been more confident in myself and that might have resulted in faster learning.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;Last updated 8/31/2020&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-2&#34;&gt;&#xA;&lt;h2 id=&#34;headline-4&#34;&gt;&#xA;Artifact 3&#xA;&lt;/h2&gt;&#xA;&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-2&#34;&gt;&#xA;&lt;p&gt;&#xA;After joining CaseWare International in the final phases of development for a new version of the Audit product, I fixed numerous bugs across several dialog boxes. The team had recently made a huge overhaul to the dialogs and as a result several bugs had been discovered. The screenshots below showcase a few of the dialogs I worked on. I made several UI changes to these dialogs and fixed several logical errors in the code. In my efforts to fix bugs in these dialogs I took advantage of my research skills and was able to identify key information of internal or external documentation which allowed me to complete these assignments in my 2 week time constraints. The end result of my efforts was a product that worked properly after a huge code refactoring and overhaul. After fixing these several issues in time for the set release date of the new Audit product I developed my research and time management skills which will enable me to work more effectively in the future. I also learned new technologies and programming languages while working on these types of bugs. If I could go back in time and fix these same bugs now with the knowledge I now posses, I would try to make my code changes to a minimal level thus easier to read for code reviewers.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;./superdialog.jpg&#34; alt=&#34;./superdialog.jpg&#34; title=&#34;./superdialog.jpg&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;./docprop.jpg&#34; alt=&#34;./docprop.jpg&#34; title=&#34;./docprop.jpg&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;Last updated 4/25/2020&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;
      </description>
    </item>
  </channel>
</rss>
