<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Ankit Gadiya</title>
    <subtitle>My little corner of the Internet 🙌</subtitle>
    <link rel="self" type="application/atom+xml" href="https://ankit.earth/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://ankit.earth"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-01-01T19:55:02+00:00</updated>
    <id>https://ankit.earth/atom.xml</id>
    <entry xml:lang="en">
        <title>1767277502</title>
        <published>2026-01-01T19:55:02+00:00</published>
        <updated>2026-01-01T19:55:02+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/status/1767277502/"/>
        <id>https://ankit.earth/status/1767277502/</id>
        
        <content type="html" xml:base="https://ankit.earth/status/1767277502/">&lt;p&gt;Happy New Year 🎉&lt;&#x2F;p&gt;
&lt;p&gt;New year, new instance. I&#x27;m changing the base domain for my single-user
GoToSocial instance (by migration). If it worked, you shouldn&#x27;t notice it.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;social.argp.in&quot;&gt;social.argp.in&lt;&#x2F;a&gt; -&amp;gt; &lt;a href=&quot;https:&#x2F;&#x2F;social.argp.org&quot;&gt;social.argp.org&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>My Emacs Presentation Stack</title>
        <published>2025-11-30T00:00:00+00:00</published>
        <updated>2025-12-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/blog/my-emacs-presentation-stack/"/>
        <id>https://ankit.earth/blog/my-emacs-presentation-stack/</id>
        
        <content type="html" xml:base="https://ankit.earth/blog/my-emacs-presentation-stack/">&lt;p&gt;&lt;em&gt;This is my (last minute) submission for &lt;a href=&quot;https:&#x2F;&#x2F;donaldh.wtf&#x2F;2025&#x2F;10&#x2F;emacs-carnival-2025-11-an-ode-to-org-babel&#x2F;&quot;&gt;Emacs Carnival 2025-11 — An Ode to Org
Babel&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;When I need to do presentations at work, I naturally reach for Emacs. My
presentations include diagrams, code snippets and running small shell blocks. I
found that Org Mode with Babel is the perfect fit. In this post, I&#x27;ll describe
my presentation stack based on Org mode.&lt;&#x2F;p&gt;
&lt;p&gt;Here is a quick demo video:&lt;&#x2F;p&gt;
&lt;video controls preload=&quot;metadata&quot; width=&quot;800&quot;&gt;
  &lt;source src=&quot;&#x2F;videos&#x2F;emacs-presentation-demo.mp4&quot; type=&quot;video&#x2F;mp4&quot;&gt;
  Your browser does not support the video tag.
&lt;&#x2F;video&gt;
&lt;h2 id=&quot;base-org-mode&quot;&gt;Base — Org mode&lt;&#x2F;h2&gt;
&lt;p&gt;I like to plan my presentations using outlines. It is easy to structure the
presentation into sections and sub-sections. Outlines also let me easily
reorganize parts of the presentation. I don&#x27;t think outlines are standard
features in common presentation software. But Emacs comes with a great outline
package, &lt;a href=&quot;https:&#x2F;&#x2F;orgmode.org&quot;&gt;Org Mode&lt;&#x2F;a&gt;. This is a subset of my configuration
to make the presentations pretty.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#0f1419;color:#bfbab0;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; org
&lt;&#x2F;span&gt;&lt;span&gt;  :hook
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;;; Lets me use serif for text and monospace for code snippets.
&lt;&#x2F;span&gt;&lt;span&gt;  (org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode . variable&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;pitch&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode)
&lt;&#x2F;span&gt;&lt;span&gt;  :custom
&lt;&#x2F;span&gt;&lt;span&gt;  (org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;hide&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;emphasis&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;markers &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;  (org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;pretty&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;entities &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;  (org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;ellipsis &lt;&#x2F;span&gt;&lt;span style=&quot;color:#c2d94c;&quot;&gt;&amp;quot;…&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;  (org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;src&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;fontify&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;natively &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;  (org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;src&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;tab&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;acts&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;natively &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;  (org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;src&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;preserve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;indentation &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span&gt;))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I start with an empty Org mode file and write the outline for my presentation
using Org mode headings. Each heading (and sub-heading) becomes a slide title. I
use the &lt;a href=&quot;https:&#x2F;&#x2F;protesilaos.com&#x2F;emacs&#x2F;logos&quot;&gt;Logos&lt;&#x2F;a&gt; package to &lt;em&gt;present&lt;&#x2F;em&gt; the
Org file as slides. Logos uses Outline headings as page endings, and uses
narrowing to only show the content under that heading. Logos in turn integrates
with the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rnkn&#x2F;olivetti&quot;&gt;Olivetti&lt;&#x2F;a&gt; package to center the
content on the screen. This is the glue code to make it all work together.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#0f1419;color:#bfbab0;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; logos
&lt;&#x2F;span&gt;&lt;span&gt;  :ensure &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;t
&lt;&#x2F;span&gt;&lt;span&gt;  :init
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;;; Always expand the current Heading.
&lt;&#x2F;span&gt;&lt;span&gt;  (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff7733;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffb454;&quot;&gt;arg-reveal-entry &lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;	&lt;&#x2F;span&gt;&lt;span style=&quot;color:#c2d94c;&quot;&gt;&amp;quot;Reveal Org or Outline entry.&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;	(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff7733;&quot;&gt;cond
&lt;&#x2F;span&gt;&lt;span&gt;	 ((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;and &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;eq&lt;&#x2F;span&gt;&lt;span&gt; major&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode &amp;#39;org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode)
&lt;&#x2F;span&gt;&lt;span&gt;           (org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;at&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;heading&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;p))
&lt;&#x2F;span&gt;&lt;span&gt;      (org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;show&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;entry))
&lt;&#x2F;span&gt;&lt;span&gt;	 ((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;or &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;eq&lt;&#x2F;span&gt;&lt;span&gt; major&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode &amp;#39;outline&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode)
&lt;&#x2F;span&gt;&lt;span&gt;          (bound&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-and-&lt;&#x2F;span&gt;&lt;span&gt;true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;p outline&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;minor&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode))
&lt;&#x2F;span&gt;&lt;span&gt;      (outline&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;show&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;entry))))
&lt;&#x2F;span&gt;&lt;span&gt;  :custom
&lt;&#x2F;span&gt;&lt;span&gt;  (logos&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;outlines&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;are&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;pages &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;  (logos&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;olivetti &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;  :hook
&lt;&#x2F;span&gt;&lt;span&gt;  (logos&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;page&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;motion . arg&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;reveal&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;entry)
&lt;&#x2F;span&gt;&lt;span&gt;  :bind
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;;; Binds Logos functions for Page motions.
&lt;&#x2F;span&gt;&lt;span&gt;  (:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span&gt; org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;map
&lt;&#x2F;span&gt;&lt;span&gt;		([remap forward&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;page] . logos&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;forward&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;page&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;dwim)
&lt;&#x2F;span&gt;&lt;span&gt;		([remap backward&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;page] . logos&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;backward&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;page&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;dwim))
&lt;&#x2F;span&gt;&lt;span&gt;  :config
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;;; Disable distracting elements during Focus mode.
&lt;&#x2F;span&gt;&lt;span&gt;  (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;setq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;default logos&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;hide&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;line &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;t
&lt;&#x2F;span&gt;&lt;span&gt;				logos&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;hide&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;header&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;line &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span&gt;))
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; olivetti
&lt;&#x2F;span&gt;&lt;span&gt;  :ensure &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;t
&lt;&#x2F;span&gt;&lt;span&gt;  :config
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;;; Fancy mode uses margins and fringes to create vertical
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;;; blocks on either sides of the content.
&lt;&#x2F;span&gt;&lt;span&gt;  (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;setq&lt;&#x2F;span&gt;&lt;span&gt; olivetti&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;style &amp;#39;fancy)
&lt;&#x2F;span&gt;&lt;span&gt;  (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;setq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;default olivetti&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;width &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;0.4&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;  (add&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;hook &amp;#39;olivetti&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;on&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;hook
&lt;&#x2F;span&gt;&lt;span&gt;			(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;			  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;;; Disable Line numbers.
&lt;&#x2F;span&gt;&lt;span&gt;			  (display&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;numbers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;			  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;;; Disable Buffer boundaries.
&lt;&#x2F;span&gt;&lt;span&gt;			  (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;setq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;local indicate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;boundaries &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span&gt;)))
&lt;&#x2F;span&gt;&lt;span&gt;  (add&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;hook &amp;#39;olivetti&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;off&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;hook
&lt;&#x2F;span&gt;&lt;span&gt;			(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;lambda &lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;			  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;;; Enable Line numbers.
&lt;&#x2F;span&gt;&lt;span&gt;			  (display&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;line&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;numbers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;			  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;;; Restores Buffer boundaries.
&lt;&#x2F;span&gt;&lt;span&gt;			  (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;setq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;local indicate&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;buffer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;boundaries &amp;#39;left))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I have the &lt;code&gt;arg-start-presentation&lt;&#x2F;code&gt; and &lt;code&gt;arg-stop-presentation&lt;&#x2F;code&gt; commands to
toggle the presentation mode. In presentation mode, &lt;code&gt;logos-focus-mode&lt;&#x2F;code&gt; is
toggled with the current heading expanded. It also minimizes other elements of
the Emacs frame like Tab-bar, and Menu-bar. To move between the slides, I use
the Emacs page motion keybindings: Forward &lt;kbd&gt;C-x ]&lt;&#x2F;kbd&gt;, and Backward
&lt;kbd&gt;C-x [&lt;&#x2F;kbd&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#0f1419;color:#bfbab0;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff7733;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffb454;&quot;&gt;arg-start-presentation &lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#c2d94c;&quot;&gt;&amp;quot;Start Presentation - Configures Frame, Style, etc.&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;  (interactive)
&lt;&#x2F;span&gt;&lt;span&gt;  (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff7733;&quot;&gt;when &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;eq&lt;&#x2F;span&gt;&lt;span&gt; major&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode &amp;#39;org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode)
&lt;&#x2F;span&gt;&lt;span&gt;    (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;setq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;local arg&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;presentation &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;    (logos&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;focus&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;    (logos&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;narrow&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;dwim)
&lt;&#x2F;span&gt;&lt;span&gt;    (org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;fold&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;show&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;entry)
&lt;&#x2F;span&gt;&lt;span&gt;    (toggle&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;frame&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;tab&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;bar (selected&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;frame))
&lt;&#x2F;span&gt;&lt;span&gt;    (menu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;bar&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)))
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff7733;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffb454;&quot;&gt;arg-stop-presentation &lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#c2d94c;&quot;&gt;&amp;quot;Stop Presentation - Reverts Frame, Style, etc.&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;  (interactive)
&lt;&#x2F;span&gt;&lt;span&gt;  (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff7733;&quot;&gt;cond &lt;&#x2F;span&gt;&lt;span&gt;((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;not &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;eq&lt;&#x2F;span&gt;&lt;span&gt; major&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode &amp;#39;org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode))
&lt;&#x2F;span&gt;&lt;span&gt;         (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;error &lt;&#x2F;span&gt;&lt;span style=&quot;color:#c2d94c;&quot;&gt;&amp;quot;This command only works in Org buffers.&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;))
&lt;&#x2F;span&gt;&lt;span&gt;        ((&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;not&lt;&#x2F;span&gt;&lt;span&gt; arg&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;presentation)
&lt;&#x2F;span&gt;&lt;span&gt;         (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;error &lt;&#x2F;span&gt;&lt;span style=&quot;color:#c2d94c;&quot;&gt;&amp;quot;Not presenting right now.&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;))
&lt;&#x2F;span&gt;&lt;span&gt;        (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;t &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;progn
&lt;&#x2F;span&gt;&lt;span&gt;             (logos&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;focus&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;             (widen)
&lt;&#x2F;span&gt;&lt;span&gt;             (toggle&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;frame&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;tab&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;bar (selected&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;frame))
&lt;&#x2F;span&gt;&lt;span&gt;             (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;setq&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;local arg&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;presentation &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;             (menu&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;bar&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;mode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)))))
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This setup is inspired by &lt;a href=&quot;https:&#x2F;&#x2F;systemcrafters.net&#x2F;emacs-tips&#x2F;presentations-with-org-present&#x2F;&quot;&gt;System Crafter&#x27;s Presentation
style&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;magic-org-babel&quot;&gt;Magic — Org Babel&lt;&#x2F;h2&gt;
&lt;p&gt;Org mode comes with built-in support for literate programming, Org Babel. If
you&#x27;re familiar with Jupyter Notebooks, Org Babel is a bit like that but in my
opinion, Babel is more powerful and extensible. It supports most common
languages out of the box such as Python, shell, and SQL, and it can be extended
to work with almost any language using simple Emacs lisp functions. It also
supports using multiple languages in the same file.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;diagrams&quot;&gt;Diagrams&lt;&#x2F;h3&gt;
&lt;p&gt;To add diagrams to my presentations, I like to use &lt;a href=&quot;https:&#x2F;&#x2F;pikchr.org&quot;&gt;Pikchr&lt;&#x2F;a&gt;.
It is a special purpose markup language for diagrams. Org mode allows me to
define diagrams in-line right next to the slide content using code blocks.&lt;&#x2F;p&gt;
&lt;p&gt;Using Org Babel, I can compile the diagram using &lt;kbd&gt;C-c C-c&lt;&#x2F;kbd&gt;. The
generated SVG is placed directly in the buffer using the &lt;code&gt;RESULTS&lt;&#x2F;code&gt; block. Org
mode can optionally render the SVG in-line as well using &lt;kbd&gt;C-c C-x C-v&lt;&#x2F;kbd&gt;
or &lt;kbd&gt;M-x org-toggle-inline-images&lt;&#x2F;kbd&gt;. Updating the diagrams is also
straightforward: I can edit the code block and recompile the diagram to update
the SVG. There is no hassle of exporting and importing the diagrams repeatedly.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;org&quot; style=&quot;background-color:#0f1419;color:#bfbab0;&quot; class=&quot;language-org &quot;&gt;&lt;code class=&quot;language-org&quot; data-lang=&quot;org&quot;&gt;&lt;span&gt;#+begin_src pikchr :file hello.svg
&lt;&#x2F;span&gt;&lt;span&gt;box &amp;quot;Hello!&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;#+end_src
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;#+RESULTS:
&lt;&#x2F;span&gt;&lt;span&gt;[[file:hello.svg]]
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;shell-execution&quot;&gt;Shell Execution&lt;&#x2F;h3&gt;
&lt;p&gt;If I have to present some shell commands, I add the Shell code blocks. Org Babel
supports tons of options for shell. Some options that I use are:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:results&lt;&#x2F;code&gt; – How the result is parsed. If the output is tabular, Org mode can
display it as a table, otherwise verbatim.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;:async&lt;&#x2F;code&gt; – If the command takes time, run it asynchronously without blocking
Emacs.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;:dir&lt;&#x2F;code&gt; – Sets the default directory for the Shell block.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;For live demos, I add the shell blocks directly in my slide content. During the
presentation, I can simply execute the block using &lt;kbd&gt;C-c C-c&lt;&#x2F;kbd&gt;. This
helps me focus on my content, saves time and I can avoid embarrassing typos.&lt;&#x2F;p&gt;
&lt;p&gt;In case of pre-recorded commands, I execute the commands beforehand. Similar to
diagrams, Org mode places the output of the command in the &lt;code&gt;RESULTS&lt;&#x2F;code&gt; block. This
is convenient when the commands require external setup, or take longer to run.
Here is an example from my last presentation.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;org&quot; style=&quot;background-color:#0f1419;color:#bfbab0;&quot; class=&quot;language-org &quot;&gt;&lt;code class=&quot;language-org&quot; data-lang=&quot;org&quot;&gt;&lt;span&gt;#+begin_src shell :results output
&lt;&#x2F;span&gt;&lt;span&gt;docker images --format &amp;quot;{{.Size}}\t{{.Repository}}&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;#+end_src
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;#+RESULTS:
&lt;&#x2F;span&gt;&lt;span&gt;: 8.31MB    alpine
&lt;&#x2F;span&gt;&lt;span&gt;: 120MB     debian
&lt;&#x2F;span&gt;&lt;span&gt;: 2.33GB    ros
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;version-control&quot;&gt;Version Control&lt;&#x2F;h2&gt;
&lt;p&gt;Because Org mode uses plain text format, I can version control my presentations.
It is one of those features that you&#x27;ll appreciate when you use it. I put all my
presentations along with the SVG artifacts in a single Git repository. A nice
little bonus is that Github and Forgejo can also render Org markup. So I have a
webpage complete with table of contents for my slides for free!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Church Booleans</title>
        <published>2025-11-24T00:00:00+00:00</published>
        <updated>2025-11-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/blog/church-booleans/"/>
        <id>https://ankit.earth/blog/church-booleans/</id>
        
        <content type="html" xml:base="https://ankit.earth/blog/church-booleans/">&lt;p&gt;In the last post, I covered the basics of &lt;a href=&quot;&#x2F;blog&#x2F;lambda-calculus&#x2F;&quot;&gt;Lambda
calculus&lt;&#x2F;a&gt; and its lack of built-in data types. Church
encoding defines a way to represent data types as pure functions. In this post,
I&#x27;ll explore church booleans and control flow, and implement them using Python.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;booleans-as-functions&quot;&gt;Booleans as functions&lt;&#x2F;h2&gt;
&lt;p&gt;Booleans are plain functions that take two arguments.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;true&lt;&#x2F;code&gt; always returns the first argument,&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;false&lt;&#x2F;code&gt; always returns the second argument.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre style=&quot;background-color:#0f1419;color:#bfbab0;&quot;&gt;&lt;code&gt;&lt;span&gt;𝛌a.𝛌b a   # True
&lt;&#x2F;span&gt;&lt;span&gt;𝛌a.𝛌b b   # False
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In Python, I can define these two functions for booleans.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; style=&quot;background-color:#0f1419;color:#bfbab0;&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span style=&quot;color:#ff7733;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffb454;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bfbab0cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;b&lt;&#x2F;span&gt;&lt;span&gt;):
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff7733;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span&gt;a
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff7733;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffb454;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bfbab0cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;b&lt;&#x2F;span&gt;&lt;span&gt;):
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff7733;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span&gt;b
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffb454;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bfbab0cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;)  &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;# -&amp;gt; 1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffb454;&quot;&gt;false&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bfbab0cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;# -&amp;gt; 2
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To understand why this works more clearly we&#x27;ll look at control flow.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;control-flow-constructs-in-python&quot;&gt;Control flow constructs in Python&lt;&#x2F;h2&gt;
&lt;p&gt;In Python, &lt;code&gt;if&lt;&#x2F;code&gt; is a special language construct that looks like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; style=&quot;background-color:#0f1419;color:#bfbab0;&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span style=&quot;color:#ff7733;&quot;&gt;if &lt;&#x2F;span&gt;&lt;span&gt;TRUE:
&lt;&#x2F;span&gt;&lt;span&gt;  BRANCH &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff7733;&quot;&gt;else&lt;&#x2F;span&gt;&lt;span&gt;:
&lt;&#x2F;span&gt;&lt;span&gt;  BRANCH &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;2
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Why can&#x27;t it be a function? I&#x27;ll try to define &lt;code&gt;if&lt;&#x2F;code&gt; as a function using the
boolean functions.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; style=&quot;background-color:#0f1419;color:#bfbab0;&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span style=&quot;color:#ff7733;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffb454;&quot;&gt;bad_if&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;bool_func&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bfbab0cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;b1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bfbab0cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;b2&lt;&#x2F;span&gt;&lt;span&gt;):
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff7733;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffb454;&quot;&gt;bool_func&lt;&#x2F;span&gt;&lt;span&gt;(b1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bfbab0cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;b2)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If the implementation is correct, it must evaluate exactly one branch. To check
this, I&#x27;ll call the &lt;code&gt;bad_if&lt;&#x2F;code&gt; function with two branches.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python-console&quot; style=&quot;background-color:#0f1419;color:#bfbab0;&quot; class=&quot;language-python-console &quot;&gt;&lt;code class=&quot;language-python-console&quot; data-lang=&quot;python-console&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; bad_if(false, 2+2, 2-2)
&lt;&#x2F;span&gt;&lt;span&gt;0
&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; bad_if(true, 2+2, 2-2)
&lt;&#x2F;span&gt;&lt;span&gt;4
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;At first glance it looks correct. But we need to make sure that Python isn&#x27;t
evaluating both branches. I&#x27;ll call &lt;code&gt;bad_if&lt;&#x2F;code&gt; with two &lt;code&gt;print&lt;&#x2F;code&gt; statements
instead.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; style=&quot;background-color:#0f1419;color:#bfbab0;&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffb454;&quot;&gt;bad_if&lt;&#x2F;span&gt;&lt;span&gt;(true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bfbab0cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#c2d94c;&quot;&gt;&amp;quot;Branch 1&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bfbab0cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#c2d94c;&quot;&gt;&amp;quot;Branch 2&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;))
&lt;&#x2F;span&gt;&lt;span&gt;Branch &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;1
&lt;&#x2F;span&gt;&lt;span&gt;Branch &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;2
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This shows that Python did actually evaluate both branches. This happens because
Python eagerly evaluates the arguments before the function call. It then passes
the value of the evaluation to the function. So the &lt;code&gt;bad_if&lt;&#x2F;code&gt; call is equivalent
to this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; style=&quot;background-color:#0f1419;color:#bfbab0;&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span&gt;b1 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#c2d94c;&quot;&gt;&amp;quot;Branch 1&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)   &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;# -&amp;gt; None
&lt;&#x2F;span&gt;&lt;span&gt;b2 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#c2d94c;&quot;&gt;&amp;quot;Branch 2&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)   &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;# -&amp;gt; None
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffb454;&quot;&gt;bad_if&lt;&#x2F;span&gt;&lt;span&gt;(true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bfbab0cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;b1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bfbab0cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;b2)     &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;# -&amp;gt; None
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Because of the eager evaluation, Python needs a special syntax for control flow
to avoid accidentally evaluating both branches.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conditionals-in-lambda-calculus&quot;&gt;Conditionals in Lambda Calculus&lt;&#x2F;h2&gt;
&lt;p&gt;In contrast to Python&#x27;s eager evaluation, Lambda calculus only evaluates the
arguments when
&lt;a href=&quot;&#x2F;blog&#x2F;lambda-calculus&#x2F;#function-application-and-b-reduction&quot;&gt;β-reduction&lt;&#x2F;a&gt;
requires the value. So a function call similar to &lt;code&gt;bad_if&lt;&#x2F;code&gt; behaves very
differently in Lambda calculus.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; style=&quot;background-color:#0f1419;color:#bfbab0;&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span style=&quot;color:#ffb454;&quot;&gt;bad_if&lt;&#x2F;span&gt;&lt;span&gt;(true&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bfbab0cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#c2d94c;&quot;&gt;&amp;quot;Branch 1&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bfbab0cc;&quot;&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#c2d94c;&quot;&gt;&amp;quot;Branch 2&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;))
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffb454;&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#c2d94c;&quot;&gt;&amp;quot;Branch 1&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bfbab0cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#c2d94c;&quot;&gt;&amp;quot;Branch 2&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;))   &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;# Reduce bad_if
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#c2d94c;&quot;&gt;&amp;quot;Branch 1&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)                            &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;# Reduce true, returns first argument.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Because of lazy evaluation, if the argument is not used then it will not be
evaluated. So, we can define &lt;code&gt;if&lt;&#x2F;code&gt; as a pure function in Lambda calculus.&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#0f1419;color:#bfbab0;&quot;&gt;&lt;code&gt;&lt;span&gt;𝛌f.𝛌a.𝛌b (f a b)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To force lazy evaluation in Python, we can wrap the branches in a &lt;strong&gt;Lambda&lt;&#x2F;strong&gt;. We
can then call the functions returned by the boolean function.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; style=&quot;background-color:#0f1419;color:#bfbab0;&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span style=&quot;color:#ff7733;&quot;&gt;def &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffb454;&quot;&gt;good_if&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;bool_func&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bfbab0cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;b1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bfbab0cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;b2&lt;&#x2F;span&gt;&lt;span&gt;):
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;font-style:italic;color:#5c6773;&quot;&gt;# Notice we are calling the result from bool_func.
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff7733;&quot;&gt;return &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffb454;&quot;&gt;bool_func&lt;&#x2F;span&gt;&lt;span&gt;(b1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bfbab0cc;&quot;&gt;, &lt;&#x2F;span&gt;&lt;span&gt;b2)()
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I&#x27;ll call the &lt;code&gt;good_if&lt;&#x2F;code&gt; with two branch lambdas. We can see that it correctly
evaluates exactly one branch.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python-console&quot; style=&quot;background-color:#0f1419;color:#bfbab0;&quot; class=&quot;language-python-console &quot;&gt;&lt;code class=&quot;language-python-console&quot; data-lang=&quot;python-console&quot;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; good_if(true, lambda: print(&amp;quot;branch 1&amp;quot;), lambda: print(&amp;quot;branch 2&amp;quot;))
&lt;&#x2F;span&gt;&lt;span&gt;branch 1
&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; good_if(false, lambda: print(&amp;quot;branch 1&amp;quot;), lambda: print(&amp;quot;branch 2&amp;quot;))
&lt;&#x2F;span&gt;&lt;span&gt;branch 2
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Church encoding shows how expressive Lambda calculus can be, and how
higher-level constructs can be built from regular functions. There&#x27;s much more
to explore in future posts.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Lambda Calculus</title>
        <published>2025-11-17T00:00:00+00:00</published>
        <updated>2025-11-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/blog/lambda-calculus/"/>
        <id>https://ankit.earth/blog/lambda-calculus/</id>
        
        <content type="html" xml:base="https://ankit.earth/blog/lambda-calculus/">&lt;p&gt;Many modern programming languages trace their roots back to Lisp, which in turn
builds on ideas from lambda calculus. In this post, I explore the core ideas
of lambda calculus.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-is-lambda-calculus&quot;&gt;What is lambda calculus&lt;&#x2F;h2&gt;
&lt;p&gt;For the longest time, I had the impression that lambda calculus has something to
do with the calculus from high school mathematics. I was wrong, &lt;em&gt;calculus&lt;&#x2F;em&gt; here
simply means to calculate.&lt;&#x2F;p&gt;
&lt;p&gt;Lambda calculus is a system to define any computation. Think of it like an
abstract programming language to express programs. It does so using simple
ideas: variables, functions and their application.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;basic-constructs&quot;&gt;Basic constructs&lt;&#x2F;h2&gt;
&lt;p&gt;Lambda calculus defines two basic constructs. These are sufficient to model any
computation.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Variables&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Variables are symbols that act as identifiers in the computation. Variables
can be free or bound to a function&#x27;s scope (parameter).&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#0f1419;color:#bfbab0;&quot;&gt;&lt;code&gt;&lt;span&gt;x           # x is free
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;But the variables don&#x27;t behave like programming languages. So, you cannot
assign values to them.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Functions&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Functions take arguments and perform some computation. The arguments are
&lt;em&gt;bound&lt;&#x2F;em&gt; variables in the function&#x27;s scope.&lt;&#x2F;p&gt;
&lt;p&gt;This is a simple function that takes one argument &lt;code&gt;x&lt;&#x2F;code&gt; and returns it.&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#0f1419;color:#bfbab0;&quot;&gt;&lt;code&gt;&lt;span&gt;𝛌y. y       # y is bound
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Sidenote: A function can only take a single argument. But multiple arguments
can be simulated by defining nested functions.&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#0f1419;color:#bfbab0;&quot;&gt;&lt;code&gt;&lt;span&gt;𝛌y.𝛌z y
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;function-application-and-b-reduction&quot;&gt;Function application and β-reduction&lt;&#x2F;h2&gt;
&lt;p&gt;Functions are not useful on their own. To use the functions, you can apply them
to arguments. Lambda calculus defines how functions are computed: β-reduction.&lt;&#x2F;p&gt;
&lt;p&gt;β-reduction is a fancy term for repeated substitution. The functions are
computed by progressively substituting bound variables within the function body.&lt;&#x2F;p&gt;
&lt;p&gt;This is a contrived example to visualize β-reduction properly. Here is a nested
function that takes two arguments and by repeated substitution, we get the
result.&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#0f1419;color:#bfbab0;&quot;&gt;&lt;code&gt;&lt;span&gt;(𝛌x.𝛌y. x) A B
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;(𝛌y. A) B        # First reduction for outer function.
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;A                # Second reduction for inner function.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;That&#x27;s it, there is no construct for conditionals, data types, loops etc. But
curiously, it is possible to encode high-level constructs using these basic
ideas. In a future post, I&#x27;ll explore &lt;em&gt;church encodings&lt;&#x2F;em&gt; to encode conditionals
and integers in lambda calculus.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>1763127234</title>
        <published>2025-11-14T19:03:54+00:00</published>
        <updated>2025-11-14T19:03:54+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/status/1763127234/"/>
        <id>https://ankit.earth/status/1763127234/</id>
        
        <content type="html" xml:base="https://ankit.earth/status/1763127234/">&lt;p&gt;I use the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;marcinkoziej&#x2F;org-pomodoro&quot;&gt;org-pomodoro&lt;&#x2F;a&gt; package
for focused sessions at work. But Slack notifications can easily break my flow,
so I added the simple hooks to disable visible notifications on GNOME desktop.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;lisp&quot; style=&quot;background-color:#0f1419;color:#bfbab0;&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff7733;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffb454;&quot;&gt;arg-disable-gnome-notifications &lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;  (shell&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;command &lt;&#x2F;span&gt;&lt;span style=&quot;color:#c2d94c;&quot;&gt;&amp;quot;gsettings set org.gnome.desktop.notifications show-banners false&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;))
&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#ff7733;&quot;&gt;defun &lt;&#x2F;span&gt;&lt;span style=&quot;color:#ffb454;&quot;&gt;arg-enable-gnome-notifications &lt;&#x2F;span&gt;&lt;span&gt;() (shell&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;command &lt;&#x2F;span&gt;&lt;span style=&quot;color:#c2d94c;&quot;&gt;&amp;quot;gsettings set org.gnome.desktop.notifications show-banners true&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;))
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;(add&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;hook &amp;#39;org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;pomodoro&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;started&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;hook &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;#&amp;#39;arg-disable-gnome-notifications&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;(add&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;hook &amp;#39;org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;pomodoro&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;finished&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;hook &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;#&amp;#39;arg-enable-gnome-notifications&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;(add&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;hook &amp;#39;org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;pomodoro&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f07178;&quot;&gt;break&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;finished&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;hook &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;#&amp;#39;arg-enable-gnome-notifications&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;(add&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;hook &amp;#39;org&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;pomodoro&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;killed&lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;hook &lt;&#x2F;span&gt;&lt;span style=&quot;color:#f29718;&quot;&gt;#&amp;#39;arg-enable-gnome-notifications&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>1760213248</title>
        <published>2025-10-12T01:37:28+00:00</published>
        <updated>2025-10-12T01:37:28+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/status/1760213248/"/>
        <id>https://ankit.earth/status/1760213248/</id>
        
        <content type="html" xml:base="https://ankit.earth/status/1760213248/">&lt;p&gt;I found a couple of videos exploring the concept of refractive index — why light
seems to slow down in different mediums.&lt;&#x2F;p&gt;
&lt;p&gt;In the first, the creator reasoned intuitively that light doesn&#x27;t really slow
down. She built a simple home experiment to prove it, but the results showed the
opposite. In the second, she set out to understand why those observations
actually made sense.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=yP1kKN3ghOU&quot;&gt;Does light actually slow down in water?&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=uo3ds0FVpXs&quot;&gt;I don&#x27;t know why light slows down in water&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>1759668366</title>
        <published>2025-10-05T18:16:06+00:00</published>
        <updated>2025-10-05T18:16:06+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/status/1759668366/"/>
        <id>https://ankit.earth/status/1759668366/</id>
        
        <content type="html" xml:base="https://ankit.earth/status/1759668366/">&lt;p&gt;I&#x27;m learning about lambda calculus, the mathematical foundation of Lisp. It
defines an incredibly expressive system. The &lt;em&gt;Church encodings&lt;&#x2F;em&gt; finally clicked
for me.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Real-Time (Co)Maps While Flying</title>
        <published>2025-10-04T00:00:00+00:00</published>
        <updated>2025-10-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/blog/real-time-comaps-while-flying/"/>
        <id>https://ankit.earth/blog/real-time-comaps-while-flying/</id>
        
        <content type="html" xml:base="https://ankit.earth/blog/real-time-comaps-while-flying/">&lt;h2 id=&quot;background&quot;&gt;Background&lt;&#x2F;h2&gt;
&lt;p&gt;On an international flight, I saw that the in-flight entertainment system had a
navigation feature. It shows a map with the source and destination, along with
the plane&#x27;s real-time location. It felt like a moving progress bar and also gave
me a sense of the geography I was flying over. But a lot of budget airlines or
domestic flights don&#x27;t offer an in-flight entertainment system. I can&#x27;t use
Google Maps or Apple Maps because it requires an active internet connection. I
wished this feature were available on all flights. Then I accidentally
discovered that Comaps could do exactly what I&#x27;d been missing.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-is-comaps&quot;&gt;What is Comaps?&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;comaps.app&#x2F;&quot;&gt;Comaps&lt;&#x2F;a&gt; is an open-source navigation app similar to Google
Maps and Apple Maps. The unique thing about it is that it can work completely
offline. It lets you download map data from
&lt;a href=&quot;https:&#x2F;&#x2F;www.openstreetmap.org&#x2F;&quot;&gt;OpenStreetMap&lt;&#x2F;a&gt; for any regions you want. After
downloading the maps, Comaps doesn&#x27;t use the internet at all.&lt;&#x2F;p&gt;
&lt;p&gt;It may sound surprising, it did to me, but GPS navigation doesn&#x27;t need an
internet connection. Smartphones come with built-in GPS modules that can
communicate with the GPS satellites to figure out where you are on Earth.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;use-comaps-for-in-flight-navigation&quot;&gt;Use Comaps for in-flight navigation&lt;&#x2F;h2&gt;
&lt;p&gt;To use Comaps this way, download maps of all the regions on your flight&#x27;s path
before boarding the plane. Then during the flight, switch to airplane mode and
you will still be able to use the map. As the plane moves through the sky, your
pointer will move along with it.&lt;&#x2F;p&gt;
&lt;p&gt;Comaps is better than the in-flight system because the map is interactive.
Zooming in on the cities and spotting landmarks feels way more fun than staring
at a tiny seat-back screen.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>1759417306</title>
        <published>2025-10-02T20:31:46+00:00</published>
        <updated>2025-10-02T20:31:46+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/status/1759417306/"/>
        <id>https://ankit.earth/status/1759417306/</id>
        
        <content type="html" xml:base="https://ankit.earth/status/1759417306/">&lt;p&gt;TIL that in Magit buffers, pressing &lt;kbd&gt;\&lt;&#x2F;kbd&gt; (or &lt;code&gt;M-x evil-collection-magit-toggle-text-mode&lt;&#x2F;code&gt;) activates &lt;code&gt;text-mode&lt;&#x2F;code&gt;. This mode
enables standard visual motions that are unavailable in Magit buffers.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Implement Custom Tramp Method in Emacs</title>
        <published>2023-09-27T00:00:00+00:00</published>
        <updated>2023-09-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/blog/implement-custom-tramp-method-in-emacs/"/>
        <id>https://ankit.earth/blog/implement-custom-tramp-method-in-emacs/</id>
        
        <summary type="html">&lt;p&gt;Emacs supports editing remote files using the Tramp package. Emacs transparently
handles the remote files based on the special path prefixes specified, so the
experience is similar to operating on a local file. Tramp uses a remote shell
underneath to access remote files. In this article, I&#x27;ll talk about how to
extend Tramp to support custom Methods to access remote files.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>XMLRPC</title>
        <published>2021-03-11T00:00:00+00:00</published>
        <updated>2021-03-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/blog/xmlrpc/"/>
        <id>https://ankit.earth/blog/xmlrpc/</id>
        
        <summary type="html">&lt;p&gt;In this article, I&#x27;ll talk about a pretty old RPC Protocol, XMLRPC. It is over
20 years old now and, it is mostly associated in legacy systems. I&#x27;d have never
come across it if it wasn&#x27;t for ROS. ROS 1.x still uses XMLRPC for all of its
communication. So, I decided to read out the protocol specification.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Introduction to ROS</title>
        <published>2021-03-04T00:00:00+00:00</published>
        <updated>2021-03-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/blog/introduction-to-ros/"/>
        <id>https://ankit.earth/blog/introduction-to-ros/</id>
        
        <summary type="html">&lt;p&gt;ROS is an acronym for Robot Operating System, but contrary to the name it is not
an operating system. Instead, ROS is an open-source framework for building
software for Robots. I got introduced to ROS in my current company which is a
Cloud Robotics startup. In this article, I&#x27;ll give a general introduction to ROS
based on what I learned.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Selfhosting</title>
        <published>2021-02-11T00:00:00+00:00</published>
        <updated>2021-02-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/blog/selfhosting/"/>
        <id>https://ankit.earth/blog/selfhosting/</id>
        
        <summary type="html">&lt;p&gt;In this article, I&#x27;ll share my thoughts about Selfhosting.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Bitwarden RS</title>
        <published>2020-09-28T00:00:00+00:00</published>
        <updated>2020-09-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/blog/bitwarden-rs/"/>
        <id>https://ankit.earth/blog/bitwarden-rs/</id>
        
        <summary type="html">&lt;p&gt;I’ve been a happy user of Bitwarden for over a year. In this article, I’ll talk
about an alternate implementation of Bitwarden and my experience with it.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Pitfalls of Gorm: Unique Index</title>
        <published>2020-09-01T00:00:00+00:00</published>
        <updated>2020-09-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/blog/pitfalls-of-gorm-unique-index/"/>
        <id>https://ankit.earth/blog/pitfalls-of-gorm-unique-index/</id>
        
        <summary type="html">&lt;p&gt;Gorm is a popular ORM library in Golang that supports the most commonly used
Relational Databases. In this article, I want to talk about a subtle problem in
the unique index support for Gorm.&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Redlock</title>
        <published>2020-07-06T00:00:00+00:00</published>
        <updated>2020-07-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/blog/redlock/"/>
        <id>https://ankit.earth/blog/redlock/</id>
        
        <summary type="html">&lt;p&gt;Salvatore Sanfilippo described an algorithm using Redis to implement distributed
locking called &lt;em&gt;Redlock&lt;&#x2F;em&gt;. In this article, we will talk about this algorithm.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>The Strange case of Golang&#x27;s Append</title>
        <published>2020-01-02T00:00:00+00:00</published>
        <updated>2020-01-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/blog/the-strange-case-of-golangs-append/"/>
        <id>https://ankit.earth/blog/the-strange-case-of-golangs-append/</id>
        
        <summary type="html">&lt;p&gt;Today while working on a Golang code-base at work, I came across an anomaly, or
at least that&#x27;s what I thought.&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Vanity Imports in Golang</title>
        <published>2019-12-25T00:00:00+00:00</published>
        <updated>2019-12-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/blog/vanity-imports-in-golang/"/>
        <id>https://ankit.earth/blog/vanity-imports-in-golang/</id>
        
        <summary type="html">&lt;p&gt;The imports in Golang are the full path of the package including the domain
name. It is common to host the packages on Github and use it for import as well.
However, there are two problems with it.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Backup SQLite</title>
        <published>2019-12-22T00:00:00+00:00</published>
        <updated>2019-12-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/blog/backup-sqlite/"/>
        <id>https://ankit.earth/blog/backup-sqlite/</id>
        
        <summary type="html">&lt;p&gt;SQLite is one of the most popular embedded relational database. The SQLite
native libraries or language bindings are available for most popular languages.
SQLite files can be accessed either interactively or using shell scripts using
the command-line utility.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Federated Git</title>
        <published>2019-12-17T00:00:00+00:00</published>
        <updated>2019-12-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/blog/federated-git/"/>
        <id>https://ankit.earth/blog/federated-git/</id>
        
        <summary type="html">&lt;p&gt;Git is a Distributed Version Control System or DVCS, created for the Linux
Kernel project. The idea behind a DVCS is that there is no concept of central
repository. Every copy (clone) has all the information. But generally, there is
a central repository that acts as a single source of truth for all the
developers.&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Switched from Pocket to Instapaper</title>
        <published>2019-12-16T00:00:00+00:00</published>
        <updated>2019-12-16T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/blog/switched-from-pocket-to-instapaper/"/>
        <id>https://ankit.earth/blog/switched-from-pocket-to-instapaper/</id>
        
        <summary type="html">&lt;p&gt;I started using Pocket in 2018, and since then, I became one of the top 5% of
there user-base (according to one email I received). But recently, I decided to
switch to Instapaper. I had several reasons for making the move that I&#x27;ll talk
about in this post.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Miniflux</title>
        <published>2019-12-15T00:00:00+00:00</published>
        <updated>2019-12-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Ankit Gadiya
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://ankit.earth/blog/miniflux/"/>
        <id>https://ankit.earth/blog/miniflux/</id>
        
        <summary type="html">&lt;p&gt;I had used multiple Atom&#x2F;Feed Readers in the past, including command-line based
Newsbeuter (and Newsboat), Elfeed as part of Emacs and Reeder on Mac OS. But, my
main problem was that none of them support syncing to my Android phone. There is
also no integration with Instapaper.&lt;&#x2F;p&gt;</summary>
        
    </entry>
</feed>
