<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Joe Skeen</title>
    <description>The latest articles on DEV Community by Joe Skeen (@joeskeen).</description>
    <link>https://dev.to/joeskeen</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F919357%2F76edb46f-83b5-4db3-86b3-6e38af0dcac1.png</url>
      <title>DEV Community: Joe Skeen</title>
      <link>https://dev.to/joeskeen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joeskeen"/>
    <language>en</language>
    <item>
      <title>ng-noop</title>
      <dc:creator>Joe Skeen</dc:creator>
      <pubDate>Sat, 14 Feb 2026 15:44:28 +0000</pubDate>
      <link>https://dev.to/joeskeen/ng-noop-2ahd</link>
      <guid>https://dev.to/joeskeen/ng-noop-2ahd</guid>
      <description>&lt;p&gt;I built a fully headless Angular platform with zero DOM. All of Angular’s brain without its body. A tiny noop platform you can use as a blueprint for custom runtimes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/joeskeen/ng-noop" rel="noopener noreferrer"&gt;https://github.com/joeskeen/ng-noop&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I can't tell you how long it took to crack this nut. I ended up stepping through the entire Angular bootstrap process to figure out what providers were and were not needed. I hope that someone out there will find this useful if they want to smash Angular together with something that it wasn't designed for.&lt;/p&gt;

</description>
      <category>angular</category>
    </item>
    <item>
      <title>donut.c, but in Pascal</title>
      <dc:creator>Joe Skeen</dc:creator>
      <pubDate>Tue, 17 Oct 2023 23:05:33 +0000</pubDate>
      <link>https://dev.to/joeskeen/donutc-but-in-pascal-17gi</link>
      <guid>https://dev.to/joeskeen/donutc-but-in-pascal-17gi</guid>
      <description>&lt;p&gt;Back in the mid-90s, as an eight-year-old child, I was very interested in computers. My father (also Joe Skeen) was a computer programmer and technician so I was lucky enough to have a computer in my home. Wanting to create cool programs, I started teaching myself Borland Delphi and I created a handful of simple games. Soon afterwards, the Internet started being a thing and I taught myself HTML. As I progressed in my self-education, I'd teach myself PHP, CSS, JS, and other languages before starting college.&lt;/p&gt;

&lt;p&gt;I recently came across &lt;a href="https://www.youtube.com/watch?v=txWCx1ku_2U"&gt;Evan Zhou's Donut Project&lt;/a&gt;, and felt it fitting to contribute code from the language of my personal development origin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing the Code
&lt;/h2&gt;

&lt;p&gt;My first challenge was to get some way of compiling Pascal. Back in the day I would have installed Borland Delphi, but now I'm daily-driving Linux which is not what Delphi was made for. (I'm unsure whether RAD Studio, Delphi's successor, even works on Linux, but felt like too much to try to set up for such a simple project.) I instead opted to develop in an online Pascal compiler.&lt;/p&gt;

&lt;p&gt;The first 10-15 minutes of porting over the original donut.c to Pascal was difficult, as I had to remember all the syntax I had long forgotten. After that, though, it went pretty quickly, with the working Pascal implementation in donut shape within about two hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Final Product
&lt;/h2&gt;

&lt;p&gt;Run this code online: &lt;a href="https://onlinegdb.com/NOnW4xKa4"&gt;https://onlinegdb.com/NOnW4xKa4&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight pascal"&gt;&lt;code&gt;                   &lt;span class="k"&gt;PROGRAM&lt;/span&gt; &lt;span class="n"&gt;Donut&lt;/span&gt;
              &lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;USES&lt;/span&gt; &lt;span class="n"&gt;CRT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;VAR&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;
           &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Single&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;ARRAY&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0..1759&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="k"&gt;OF&lt;/span&gt; &lt;span class="kt"&gt;Single&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;ARRAY&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0..1759&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;OF&lt;/span&gt; &lt;span class="kt"&gt;Char&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;BEGIN&lt;/span&gt;
     &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;clrscr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;WHILE&lt;/span&gt; &lt;span class="nb"&gt;True&lt;/span&gt; &lt;span class="k"&gt;DO&lt;/span&gt; &lt;span class="k"&gt;BEGIN&lt;/span&gt;&lt;span class="c1"&gt;//
&lt;/span&gt;    &lt;span class="n"&gt;FillChar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;SizeOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="n"&gt;FillChar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;SizeOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;
   &lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="s"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;WHILE&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="m"&gt;6.28&lt;/span&gt; &lt;span class="k"&gt;DO&lt;/span&gt; &lt;span class="k"&gt;BEGIN&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;WHILE&lt;/span&gt;
  &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="m"&gt;6.28&lt;/span&gt; &lt;span class="k"&gt;DO&lt;/span&gt; &lt;span class="k"&gt;BEGIN&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;             &lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;
 &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;                 &lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;/(&lt;/span&gt;                     &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;
 &lt;span class="p"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;                     &lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;                     &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="n"&gt;Trunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;40&lt;/span&gt;&lt;span class="p"&gt;+&lt;/span&gt;
 &lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;*(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;                     &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;Trunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;*(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;                     &lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;
 &lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="n"&gt;Trunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;*((&lt;/span&gt;                 &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;)*&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;
  &lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="k"&gt;IF&lt;/span&gt;             &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;
   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="k"&gt;BEGIN&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;]:=&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;]:=&lt;/span&gt;&lt;span class="s"&gt;'.,-~:;=!*#$@'&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;ELSE&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;
     &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;]:=&lt;/span&gt;&lt;span class="s"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="m"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="m"&gt;0.07&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;END&lt;/span&gt;
      &lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;gotoxy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="m"&gt;1760&lt;/span&gt; &lt;span class="k"&gt;DO&lt;/span&gt; &lt;span class="k"&gt;BEGIN&lt;/span&gt;
        &lt;span class="k"&gt;IF&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="k"&gt;MOD&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="k"&gt;writeln&lt;/span&gt; &lt;span class="k"&gt;ELSE&lt;/span&gt;
           &lt;span class="k"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="m"&gt;0.04&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
               &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;:=&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="m"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;Delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="cm"&gt;{
                   }&lt;/span&gt;&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="c1"&gt;//
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I hope you enjoy this and take a look at all the other &lt;a href="https://github.com/EvanZhouDev/TheDonutProject"&gt;Donut Project submissions&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>pascal</category>
      <category>delphi</category>
      <category>donut</category>
    </item>
    <item>
      <title>🍩.🍇 (donut.c, but Emojicode)</title>
      <dc:creator>Joe Skeen</dc:creator>
      <pubDate>Tue, 17 Oct 2023 20:00:55 +0000</pubDate>
      <link>https://dev.to/joeskeen/-donutc-but-emojicode-50k3</link>
      <guid>https://dev.to/joeskeen/-donutc-but-emojicode-50k3</guid>
      <description>&lt;p&gt;Inspired by &lt;a href="https://www.youtube.com/@evanzhoudev"&gt;the work of Evan Zhou&lt;/a&gt;, I determined that the world needed a &lt;code&gt;donut.c&lt;/code&gt; variant with A LOT more sprinkles... thus &lt;code&gt;🍩.🍇&lt;/code&gt; was born.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;🍩.🍇&lt;/code&gt; is written in &lt;a href="https://www.emojicode.org/"&gt;Emojicode&lt;/a&gt;, a language that makes as much use of emoji as possible. I have used Emojicode for several years to solve &lt;a href="https://adventofcode.com/2023/about"&gt;Advent of Code&lt;/a&gt; coding challenges and have found it simultaneously frustrating and delightful to code in. Naturally porting &lt;code&gt;donut.c&lt;/code&gt; to Emojicode was an enticing idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coding Difficulties
&lt;/h2&gt;

&lt;p&gt;It took me about 6 hours to port the original C code to Emojicode, as I ran into some snags along the way:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/emojicode/emojicode/issues/217"&gt;Compiler bug&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;In theory, these two lines from the original &lt;code&gt;donut.c&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x1b&lt;/span&gt;&lt;span class="s"&gt;[2J"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x1b&lt;/span&gt;&lt;span class="s"&gt;[H"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;should translate to the following Emojicode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;😀🔤❌e[2J🔤❗
😀🔤❌e[H🔤❗
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unfortunately the compiler complains about an unrecognized escape sequence. Thus, I wasn't able to include these lines (which clear the terminal and move the cursor to the top of the terminal). So if you run my program, it will just keep drawing more and more lines without clearing them. You need to size the terminal just right to avoid seeing more than one frame at once.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shaping the code as a 🍩
&lt;/h3&gt;

&lt;p&gt;Once the code was translated from C and working, the next challenge was to get the code shaped like a donut. Although Emojicode is not whitespace-sensitive, I discovered immediately that it wouldn't be as simple as putting line breaks every N characters.&lt;/p&gt;

&lt;p&gt;Normally, code displayed in a monospace font has every column line up nicely, regardless of the relative width of the letter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hello
World
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But emoji aren't compatible with that paradigm.  Emoji apparently are supposed to take up the width of two characters in monospace contexts, but depending on your browser, operating system, device, etc. that will vary. The following two lines contain four normal characters and three emoji characters, but do not line up (at least they don't for me, but maybe they do for you 🤷):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.0➡️🖍️🆕i
↪️22▶️y🤝y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lack of consistency made shaping the code very challenging as I couldn't use any ASCII donut templates to fill it in.&lt;/p&gt;

&lt;p&gt;One more thing that caused a lot of difficulty with shaping the code was the one string literal in the code, used as a gradient for drawing darker and lighter "pixels" of the donut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🔤.,-~:;=!*#$@🔤
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As Emojicode no longer has a string concatenation operator, I was constrained to keep all these characters from spanning multiple lines. This forced all the code above this string to be a certain size, which also determined (to some extent) the size of the code below it.&lt;/p&gt;

&lt;p&gt;In the end, I was able to fit all the code into a donut shape, without adding any superfluous spaces or comments, which surprised me!&lt;/p&gt;

&lt;h2&gt;
  
  
  The final product
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                🏁🍇0.0➡️🖍️🆕A
            0.0➡️🖍️🆕B🔤 🔤➡️_🆕🍨🐚
         💯🍆A 1760❗➡️🖍️🆕z🆕🍨🐚🔡🍆_
        1760❗➡️🖍️🆕b🎶🔤.,-~:;=!*#$@🔤❗
     ➡️L🔁👍🍇🔂n🆕⏩0 1760❗🍇_➡️🐽b n❗0.0
    ➡️🐽z n❗🍉0.0➡️🖍️🆕j🔁j◀️6.28🍇0.0➡️🖍️🆕i🔁
   i◀️6.28🍇📓i❗➡️c📕j❗   ➡️d📓A❗➡️e📓j❗➡️f📕A
  ❗➡️g d➕2➡️h 1.0➗          🤜c✖️h✖️e➕f✖️g➕5🤛
 ➡️D📕i❗➡️l📕B❗➡️m              📓B❗➡️n c✖️h✖️g➖f✖️
 e➡️t🔢40.0➕30.0✖️                D✖️🤜l✖️h✖️m➖t✖️n🤛
 ❗➡️x🔢12.0➕15.0               ✖️D✖️🤜l✖️h✖️n➕t✖️m🤛
  ❗➡️y x➕80✖️y➡️o🔢            8.0✖️🤜🤜f✖️e➖c✖️d✖️g
   🤛✖️m➖c✖️d✖️e➖f✖️g➖       l✖️d✖️n🤛❗➡️N↪️22▶️y🤝y▶️
    0🤝x▶️0🤝80▶️x🤝D▶️🐽z   o❗🍇D➡️🐽z o❗0➡️🖍️🆕
     I↪️N▶️0🍇N➡️🖍️I🍉↪️I▶️🙌📏L❓🍇📏L❓➖1➡️🖍️I
      🍉🐽L I❗➡️🐽b o❗🍉i⬅️➕0.02🍉j⬅️➕0.07
         🍉🔂k🆕⏩0 1761❗🍇 ↪️k🚮80🙌0🍇
           😀_❗🍉🙅🍇👄🐽b k❗❗🍉🍉
             A⬅️➕0.04 B⬅️➕0.02⏲🐇
               🧵 10000 ❗🍉🍉 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To run this: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;follow the &lt;a href="https://www.emojicode.org/docs/guides/install"&gt;Emojicode setup instructions&lt;/a&gt; for your OS&lt;/li&gt;
&lt;li&gt;paste the code into a file (I use the filename &lt;code&gt;🍩.🍇&lt;/code&gt;, but you could use &lt;code&gt;donut.emojic&lt;/code&gt; for the same results)&lt;/li&gt;
&lt;li&gt;compile the code: &lt;code&gt;emojicodec 🍩.🍇&lt;/code&gt; (or &lt;code&gt;emojicodec donut.emojic&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;run the program: &lt;code&gt;./🍩&lt;/code&gt; (or &lt;code&gt;./donut&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hsoALoom--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zqhj1hv3i0kchana014g.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hsoALoom--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zqhj1hv3i0kchana014g.gif" alt="🍩.🍇 at runtime" width="690" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Overall, this was a pretty fun project, and I'm happy with the results. Go join Evan Zhou in his quest to compile a donut code file for as many languages as possible: &lt;a href="https://github.com/EvanZhouDev/TheDonutProject"&gt;https://github.com/EvanZhouDev/TheDonutProject&lt;/a&gt;&lt;/p&gt;

</description>
      <category>donut</category>
      <category>emojicode</category>
      <category>challenge</category>
      <category>esoteric</category>
    </item>
  </channel>
</rss>
