<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Flip Everything!</title>
    <link href="http://flippac.org/atom.xml" rel="self" />
    <link href="http://flippac.org" />
    <id>http://flippac.org/atom.xml</id>
    <author>
        <name>Philippa Cowderoy</name>
        
        <email>flippa@flippac.org</email>
        
    </author>
    <updated>2025-01-19T00:00:00Z</updated>
    <entry>
    <title>Information Aware Type Systems and Telescopic Constraint Trees</title>
    <link href="http://flippac.org/posts/Information%20Aware%20Type%20Systems%20and%20Telescopic%20Constraint%20Trees.html" />
    <id>http://flippac.org/posts/Information%20Aware%20Type%20Systems%20and%20Telescopic%20Constraint%20Trees.html</id>
    <published>2025-01-19T00:00:00Z</published>
    <updated>2025-01-19T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article>
    <section class="header">
        
        
        Posted on January 19, 2025
        
        
        
    </section>
    <section class="header">
    
    <a href="/archive.html#tags">Tags:</a> <a href="/tags/information%20awareness.html" rel="tag">information awareness (1)</a>, <a href="/tags/msfp2020.html" rel="tag">msfp2020 (1)</a>, <a href="/tags/talks.html" rel="tag">talks (1)</a>, <a href="/tags/telescopic%20constraint%20trees.html" rel="tag">telescopic constraint trees (1)</a>
    
    </section>
    <section>
        <p>I recently managed to get my MSFP2020 extended abstract uploaded to the arXiv (don’t worry, link to follow!). It took me this long because I finally need to cite it – which is to say, because everything’s taking me this long. But it’s about time I blogged at least a little about it and upped some related things into my own space.</p>
<h2 id="history-and-ideas">History and Ideas</h2>
<p>It’s been a long trip (…a decade and counting so far) and it’s far from over, but once upon a time I read the first paper on <em>information effects</em><a href="#fn1" class="footnote-ref" id="fnref1" role="doc-noteref"><sup>1</sup></a>, had an idea that matched some of my existing ones and have found myself feeling increasingly obligated to drag it across the line as I keep seeing more things come of it.</p>
<p>Perhaps the key idea of my own is: the information, in the Shannon sense, created by an [abstract] interpreter is the <em>meaning</em> of the program it interprets. Typecheckers very much included. But it’s also fair to say that as an effectful (effect-oriented?) hacker I’m further opinionated about how to exploit that!</p>
<p>The major things I’ve actually talked about so far are <em>information aware type systems</em> – a constraint-based way to present type systems that allows for careful accounting of information flow – and <em>telescopic constraint trees</em>, a representation of typechecking problems that is to some extent <em>necessary</em> for handling sufficiently dependent types. I can derive the trees (and the rules for them) from Information Aware rules, or even the typing rules from rules for building trees! While I definitely can’t do it mechanically, I can even have a go at reverse-engineering a type system from an example program and a worked example of typechecking it. And hopefully, if the work makes sense to you then you’ll be able to as well.</p>
<p>Telescopic constraint trees themselves aren’t new (as mentioned in the acknowledgements, Conor McBride got there first and they’ve spent a long time as folklore). The relationship between my presentation of them and my presentation of typing rules is new, and because it’s not fixed to one type system I’ve found myself in the awkward position of <em>having</em> to name a piece of folklore. There’s a good tutorial paper about applying the folklore to Hindley-Milner mentioned in the acknowledgements section, and I’ve cheerfully stolen the approach to generalisation (and the sequencing it requires) from it.</p>
<p>I’ve had a lot of fun with this, and I have some other old ideas to resurrect and throw through some of this machinery as well. Recently though I’ve been working on a collection of related logic languages (one of which I’m calling Nooblog<a href="#fn2" class="footnote-ref" id="fnref2" role="doc-noteref"><sup>2</sup></a>), with the goal of building the metalanguage for information aware type systems (and other related problems: elaboration needs some extra tricks for example).</p>
<h2 id="material">Material</h2>
<p>Here’s my MSFP2020 material, variously from arXiv, my own site and YouTube:</p>
<ul>
<li><a href="https://arxiv.org/abs/2412.16206">MSFP2020 Extended Abstract – Information Aware Type Systems and Telescopic Constraint Trees</a></li>
<li><a href="/downloads/slides/MSFP2020.pdf">Slides</a></li>
<li><a href="https://www.youtube.com/watch?v=JzfdjMgEKzs">Talk Video</a></li>
</ul>
<p>While I’m here, I’ll add some alternative bits and pieces, some older and some newer:</p>
<ul>
<li><a href="/downloads/slides/IDM2021.pdf">Idris Developer’s Meeting 2021</a> mostly focuses on telescopic constraint trees including discussion of substructural languages and an observation about Quantitative Type Theory that Conor McBride and I had separately and got round to discussing in 2016</li>
<li><a href="/downloads/slides/SPLSOct2019.pdf">SPLS October 2019 – Telescopic Constraint Trees</a> is an earlier talk that contains some discussion of structural rules for telescopic constraint trees themselves, and of what happens when we discover a local metavariable actually needs a more global scope</li>
<li><a href="/downloads/slides/Kent2021.pdf">Information Aware Type Systems and Telescopic Constraint Trees [Extended Mix]</a> has a worked solution (complete with some deliberately arbitrary choices) of a telescopic constraint tree problem</li>
</ul>
<p>Several of these slides mention a Twitter account that I have since deleted. Email addresses should still be good, and contact details are on this site’s <a href="/about.html">About</a> page.</p>
<h2 id="acknowledgements">Acknowledgements</h2>
<p>Finally, I should make some acknowledgements that I haven’t had room for elsewhere:</p>
<ul>
<li>First of all, Conor McBride, not just for the discussion and filling me in on the history, or even for having developed a telescopic constraint tree for Epigram 1, but also for the amount of personal support and encouragement they’ve given me over the years.
<ul>
<li>On which note, Adam Gundry also deserves a mention for the conversation in 2012 when he was still Conor’s PhD student! Adam, Conor and James McKinna’s Type Inference in Context is an excellent paper for anyone who wants to read a slightly more conventional take on this using Hindley-Milner as a minimal motivating system.</li>
</ul></li>
<li>Everybody who has reinvented telescopic constraint trees, and especially everybody who tried to get there when dependent types had provided the motivation but no answer was available. I have a story to tell about this (and the inevitability of it), and some year I’ll get it into a suitable state for a wide audience: those who don’t want to wait should consider that I build the trees by isomorphism and ask themselves what happens if a language is capable of reifying metavariable binders.</li>
<li>Edwin Brady for plenty of useful chat and encouragement to give my first SPLS talk of 2019 (the part where I dual-wielded a microphone and the stick for pulling the screen shades down to point at the screen is not, technically, his fault).</li>
<li>Chris Martens for helping me get started on the citation trail for something akin to the notion of moding I’m using. Also their online class on Twelf at the start of last year, which I should still post about!</li>
<li>The MSP101 group and everybody who’s been part of it over the years for variously hosting and putting up with me.</li>
<li>Sam Lindley for encouraging me to submit to MSFP2020 after the announcement at SPLS October 2019.
<ul>
<li>Both Sam and Max [New], Freelance Programme Chairs, as well as my reviewers and my shepherd Stephanie Balzer.</li>
</ul></li>
<li>Paolo Giarrusso for helping me refine my material for people who think less like me.</li>
<li>Dominic Orchard for his enthusiasm and cheerleading.</li>
<li>Clarissa Littler for discussion and support.</li>
<li>My ex AJ for supporting and otherwise putting up with me during my 2019/early 2020 burst of activity.</li>
<li>Everybody who’s ever put up with me producing an iPad with some slides loaded and asking “would you like to hear about my work?”, however much context they did or didn’t have!</li>
</ul>
<section id="footnotes" class="footnotes footnotes-end-of-document" role="doc-endnotes">
<hr />
<ol>
<li id="fn1"><p>Information Effects by James and Sabry<a href="#fnref1" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn2"><p>It sure ain’t Pro<a href="#fnref2" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
</ol>
</section>
    </section>
    <section>
        <div class="feed">
            Feeds:
            <span class="feed"><a href="/rss.xml"><img src="/images/feed-icon.svg"><span>RSS</span></a></span>
            <span class="feed"><a href="/atom.xml"><img src="/images/feed-icon.svg">Atom</a></span>
        </div>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>Clockwise is not the Only Mode</title>
    <link href="http://flippac.org/posts/Clockwise%20is%20not%20the%20Only%20Mode.html" />
    <id>http://flippac.org/posts/Clockwise%20is%20not%20the%20Only%20Mode.html</id>
    <published>2021-12-15T00:00:00Z</published>
    <updated>2021-12-15T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article>
    <section class="header">
        
        
        Posted on December 15, 2021
        
        
        
    </section>
    <section class="header">
    
    <a href="/archive.html#tags">Tags:</a> <a href="/tags/logic%20programming.html" rel="tag">logic programming (1)</a>, <a href="/tags/modes.html" rel="tag">modes (1)</a>, <a href="/tags/type%20systems.html" rel="tag">type systems (1)</a>
    
    </section>
    <section>
        <p>There’s a common piece of advice when people learn to read typing rules: “read them clockwise”. I’m going to explain how to generalise this idea into a useful concept called a mode, but first let’s explain the advice itself!</p>
<p>(As a quick aside, I have some slight quirks in how I write variables in typing rules - <a href="/posts/Typing%20Rules,%20Notation%20and%20Variables.html">this post</a> explains what I do differently and why)</p>
<h2 id="reading-clockwise">Reading Clockwise</h2>
<p>Suppose I want to use this rule:</p>
<p><img src="/images/Clockwise%20Is%20Not%20The%20Only%20Mode/lam.png" /></p>
<p>We can break it down into steps, reading the rule clockwise starting from the bottom-left.</p>
<p><img src="/images/Clockwise%20Is%20Not%20The%20Only%20Mode/clockwise1.png" /></p>
<p>This rule assumes we have some context <span class="math inline"><em>Γ</em></span> and we want to typecheck <span class="math inline"><em>λ</em><em>x</em>.<em>e</em></span>, a lambda with some variable <span class="math inline"><em>x</em></span> and the body <span class="math inline"><em>e</em></span>. Notice that we’ve taken not even a syntactic but a <em>lexical</em> slice out of the rule - <span class="math inline"><em>Γ</em> ⊢ <em>e</em> : <em>τ</em></span> is all one judgment/relation, so <span class="math inline"><em>Γ</em> ⊢ <em>e</em></span> on its own doesn’t really mean anything. It’s the variables <span class="math inline"><em>Γ</em></span> and <span class="math inline"><em>e</em></span> that matter.</p>
<p><img src="/images/Clockwise%20Is%20Not%20The%20Only%20Mode/clockwise2.png" /></p>
<p>To continue, we have to check the conditions above the line hold. In this case, that we can typecheck <span class="math inline"><em>e</em></span> in the context <span class="math inline"><em>Γ</em>, <em>x</em> : <em>τ</em><em>p</em></span> where we have no idea what type <span class="math inline"><em>τ</em><em>p</em></span> is yet but we call the resulting type <span class="math inline"><em>τ</em><em>r</em></span></p>
<p><img src="/images/Clockwise%20Is%20Not%20The%20Only%20Mode/clockwise3.png" /></p>
<p>Finally we get our result type, <span class="math inline"><em>τ</em><em>p</em> → <em>τ</em><em>r</em></span> - and hopefully we found out what <span class="math inline"><em>τ</em><em>p</em></span> is on the way.</p>
<h2 id="clockwise-is-a-mode">Clockwise is a Mode?</h2>
<p>The “clockwise” rule of thumb relies on a simple trick: typechecking is the process of starting with some term (and some assumed context) and figuring out what valid type it has. Slightly informally, if we’re doing type synthesis/inference we don’t know that type yet and if we’re doing type checking then maybe we do, but that part’s less important for a moment.</p>
<p>Usefully, when we make a recursive check like in the <span class="math inline"><em>L</em><em>a</em><em>m</em></span> rule, we have the same situation again - the same parts of the typing relation are input, the same parts are output.</p>
<p>And because most type systems are <em>syntax-directed</em><a href="#fn1" class="footnote-ref" id="fnref1" role="doc-noteref"><sup>1</sup></a>, we can find the rule we need just by looking at the term - letting us write a recursive type checker by simple case analysis.</p>
<h2 id="modes">Modes</h2>
<p>“Clockwise” the way I’ve just described it, complete with that commonality in uses above and below the line? It’s something called a “mode” <a href="#fn2" class="footnote-ref" id="fnref2" role="doc-noteref"><sup>2</sup></a>, and I might write that mode down <span class="math inline"> +  ⊢  +  : −</span>. Here, <span class="math inline">+</span> is a known parameter and <span class="math inline">−</span> is an unknown we’re trying to find out. That doesn’t mean there can’t be any unknowns buried in something <span class="math inline">+</span>, we don’t know what <span class="math inline"><em>τ</em><em>p</em></span> is when we typecheck that lambda body. But we do know that it’s the <span class="math inline"><em>τ</em><em>p</em></span> we introduced in that rule and not an “unknown unknown”!</p>
<p>But there are other modes we can use that <span class="math inline"><em>L</em><em>a</em><em>m</em></span> rule in, so let’s talk about them a bit? Here are some examples:</p>
<table>
<thead>
<tr class="header">
<th>Mode</th>
<th>Use</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><span class="math inline"> +  ⊢  +  : +</span></td>
<td>Type checking</td>
</tr>
<tr class="even">
<td><span class="math inline"> +  ⊢  +  : −</span></td>
<td>Type synthesis</td>
</tr>
<tr class="odd">
<td><span class="math inline"> −  ⊢  +  : +</span></td>
<td>Free variable analysis (checked type)</td>
</tr>
<tr class="even">
<td><span class="math inline"> −  ⊢  +  : −</span></td>
<td>Free variable analysis (synthesised type)</td>
</tr>
<tr class="odd">
<td><span class="math inline"> +  ⊢  −  : +</span></td>
<td>Proof search</td>
</tr>
<tr class="even">
<td></td>
<td>Program synthesis</td>
</tr>
</tbody>
</table>
<p>All of these things can be done with the same rules! As an old logic programming slogan says: “algorithm = logic + control”. Modes declare an important piece of control information without forcing us to detail things with step-by-step instructions.</p>
<p>Another important related concept from logic programming is the relationship between <em>relations</em> and <em>procedures</em>. Typing rules describe [part of] a relation, procedures implement specific ways of using a relation - and different modes often need different procedures to run efficiently.</p>
<p>As we’re talking about type systems in particular, I should also spell out clearly: bidirectional type systems work by limiting which rules can be used at which modes (“checking”, “synthesis”)!</p>
<h2 id="many-notions-of-mode">Many Notions of Mode</h2>
<p>There are many flavours of mode system out there - not least because logic programming has a wide and varied history! Something that is suitable for Prolog might be unsuitable for studying formal logics, because in Prolog a lot comes down to variable instantiation. Something suitable for studying formal logics is likely to be utterly unsuitable for Prolog: it’s turing complete and permits all kinds of things that formal logics normally avoid to have a tractable metatheory.</p>
<p>One extension I’ve found useful is one I call “refinement modes”, by analogy to refinement types. It comes from what you might call the “variable instantiation” side of the family and allows the mode for a particular variable to be “input, and it’s definitely a <span class="math inline">→</span> but I don’t know the parameters”, or “output, and it’s a <span class="math inline">→</span>…”. The Mercury language supports something like this, and I’ve used it in my own work.</p>
<p>Another important concept is <em>ground mode</em> - the mode in which everything is fully known and there are no (meta)variables in the data at all. Something at ground mode doesn’t need any hint of constraint solving, not even first-order unification! This is why it’s so much faster to write a typechecker for simply typed lambda calculus with annotated lambdas than to allow leaving off the type annotations.</p>
<p>Ground mode is also a link between functional and logic programming: functional programming normally works at ground mode. Given the Curry-Howard correspondance, arguably functional programming is 0th order logic programming!</p>
<h2 id="ack">Ack</h2>
<p>Hopefully this has been some help to somebody out there! I’d like to thank a couple of people:</p>
<ul>
<li><a href="https://sites.google.com/ncsu.edu/cmartens">Chris Martens</a> is from a more logic-oriented background than I am, and I’d especially like to thank them for pointing me towards a useful citation trail for my MSFP2020 submission! After a short chase I ended up using these two papers:
<ul>
<li><a href="https://doi.org/10.1007/3-540-56454-3_15">Uday S. Reddy (1993): <em>A typed foundation for directional logic programming</em></a></li>
<li><a href="https://doi.org/10.1007/3-540-61055-3_44">Ekkehard Rohwedder &amp; Frank Pfenning (1996): <em>Mode and termination checking for higher-order logic programs</em></a></li>
</ul></li>
<li>More importantly for this piece, Uma Zalakain let me know a slide or two about modes in my work made a big difference for how she thinks about type systems. It’s easy to lose track of what other people do and don’t know, both as fields expand and as we get older, stop being students and start forgetting where we even learned things. This post is an attempt to make something useful common knowledge, and without Uma’s feedback I wouldn’t have written it.</li>
</ul>
<section id="footnotes" class="footnotes footnotes-end-of-document" role="doc-endnotes">
<hr />
<ol>
<li id="fn1"><p>Each rule covers specific pieces of syntax and each piece of syntax has one rule<a href="#fnref1" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn2"><p>Conor McBride rearranges the rules so that regardless of the mode, information always flows clockwise and we never find new information going counterclockwise. In his systems, clockwise is the direction time flows in.<a href="#fnref2" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
</ol>
</section>
    </section>
    <section>
        <div class="feed">
            Feeds:
            <span class="feed"><a href="/rss.xml"><img src="/images/feed-icon.svg"><span>RSS</span></a></span>
            <span class="feed"><a href="/atom.xml"><img src="/images/feed-icon.svg">Atom</a></span>
        </div>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>Notation and Glyphs</title>
    <link href="http://flippac.org/posts/Notation%20and%20Glyphs.html" />
    <id>http://flippac.org/posts/Notation%20and%20Glyphs.html</id>
    <published>2021-10-07T00:00:00Z</published>
    <updated>2021-10-07T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article>
    <section class="header">
        
        
        Posted on October  7, 2021
        
        
        
    </section>
    <section class="header">
    
    <a href="/archive.html#tags">Tags:</a> <a href="/tags/accessibility.html" rel="tag">accessibility (2)</a>, <a href="/tags/notation.html" rel="tag">notation (2)</a>
    
    </section>
    <section>
        <p>Continuing on from <a href="/posts/Typing%20Rules,%20Notation%20and%20Variables.html">an earlier post</a>, I’ve had to make up my own notation on occasion and I’d like to talk about some things that felt good but are probably mistakes in the long run.</p>
<p>Starting with this piece of smartarsery<a href="#fn1" class="footnote-ref" id="fnref1" role="doc-noteref"><sup>1</sup></a>:</p>
<p><img src="/images/glyphs/dupcon.png" /></p>
<p>For reasons I’ll talk about in another post, the red branching shape in the middle is syntax for a “duplication constraint” - insisting that the context on the left is equal to both the contexts on the right. When it’s used to describe an otherwise-normal typechecker, this amounts to passing the left-hand context twice.</p>
<p>Hence the branch - it’s describing a branch in dataflow! But aside from the accessibility issues around colour-coding and bright red<a href="#fn2" class="footnote-ref" id="fnref2" role="doc-noteref"><sup>2</sup></a> this is a pretty bad idea for anything aside from pen and paper or whiteboard work. Why?</p>
<ul>
<li>I hacked the glyph up in LaTeX with negative hspace and the \langle character - I have no business expecting others to reverse engineer it!</li>
<li>It uses superscripting and subscripting, so the duplicated contexts render smaller and the issues from the previous post crop up again</li>
<li>For whiteboard work it often makes more sense vertically anyway</li>
</ul>
<p>I do have a workaround for the super/subscript issue, I ended up needing this n-ary version anyway:</p>
<p><img src="/images/glyphs/dupconmany.png" /></p>
<p>But for reasons involving quantities I’ve even perpetrated these!:</p>
<p><img src="/images/glyphs/adddupcon.png" /> <img src="/images/glyphs/muldupcon.png" /></p>
<p>I think it’s time I start writing things like <span class="math inline"><em>d</em><em>u</em><em>p</em>(<em>τ</em>)(<em>τ</em>,<em>τ</em>)</span> or <span class="math inline"><em>d</em><em>u</em><em>p</em>(<em>τ</em>){<em>τ</em>, <em>τ</em>, <em>τ</em>}</span> instead.</p>
<section id="footnotes" class="footnotes footnotes-end-of-document" role="doc-endnotes">
<hr />
<ol>
<li id="fn1"><p>It’s called being a smartarse because it makes somebody’s arse smart. Preferably only your own…<a href="#fnref1" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn2"><p>My apologies to anybody reading this who only discovered that in this sentence: I’ve done it in past work but I’ll do better in future. Lack of ambiguity isn’t good enough.<a href="#fnref2" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
</ol>
</section>
    </section>
    <section>
        <div class="feed">
            Feeds:
            <span class="feed"><a href="/rss.xml"><img src="/images/feed-icon.svg"><span>RSS</span></a></span>
            <span class="feed"><a href="/atom.xml"><img src="/images/feed-icon.svg">Atom</a></span>
        </div>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>Typing Rules, Notation and Variables</title>
    <link href="http://flippac.org/posts/Typing%20Rules%2C%20Notation%20and%20Variables.html" />
    <id>http://flippac.org/posts/Typing%20Rules%2C%20Notation%20and%20Variables.html</id>
    <published>2021-09-30T00:00:00Z</published>
    <updated>2021-09-30T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article>
    <section class="header">
        
        
        Posted on September 30, 2021
        
        
        
    </section>
    <section class="header">
    
    <a href="/archive.html#tags">Tags:</a> <a href="/tags/accessibility.html" rel="tag">accessibility (2)</a>, <a href="/tags/notation.html" rel="tag">notation (2)</a>
    
    </section>
    <section>
        <p>I’ve changed a few things since I started giving talks again, I’ve got at least one more change on the way, and I figured it was worth talking about them so other people could see why I’ve made them and to comment on the tensions behind the status quo.</p>
<p>First of all, I’m extremely glad I let Conor McBride nudge me towards larger fonts on slides! I’ve found myself in a situation where the original speaking room overflowed and I wound up with people watching from a worrying viewing angle that put them at twice the expected viewing distance. So these days my Beamer slides pretty much default to \Large everywhere and so far it’s doing right by me. I figure I need a really good reason to dip into \large for a slide, let alone \normalsize or smaller.</p>
<p>But there’s a related problem that’s all over mathematical papers - superscripts and subscripts. I don’t think it’s too bad if I ask Pandoc to give me, say, <span class="math inline"><em>π</em><sup>2</sup></span> or <span class="math inline"><em>τ</em><sup><em>f</em></sup></span> in the middle of a post rather than some slides, but in most settings the font gets smaller and smaller - <span class="math inline">2<sup>2<sup>2<sup>2</sup></sup></sup></span> is actively uncomfortable.</p>
<p>Superscripts also play into another, more controversial issue in our notation. I used <span class="math inline"><em>τ</em><sup><em>f</em></sup></span> as an example because I often use it for a function’s type. Or at least I did - these days I try to use <span class="math inline"><em>τ</em><em>f</em></span> instead to avoid the scaling problem. But nice as that is when we’re doing a bunch of pen and paper work? It’s still a pain to read, especially for anybody who doesn’t manage to guess that not only is <span class="math inline"><em>τ</em><em>f</em></span> a function type, but <span class="math inline"><em>τ</em><em>p</em></span> is the type of a parameter and <span class="math inline"><em>τ</em><em>r</em></span> is a return or result type! The notation might be strictly formal, but the more intuition we can provide the better.</p>
<p>So what I’m trying to do where I can is use names like <span class="math inline"><em>τ</em><em>f</em><em>u</em><em>n</em><em>c</em><em>t</em><em>i</em><em>o</em><em>n</em></span> or - when I get to name it - <span class="math inline"><em>Γ</em><em>b</em><em>o</em><em>d</em><em>y</em></span>. The names are more informative and the greek letters now have a clear purpose that applied all long.</p>
<p>Surprise! It’s Charles Simonyi’s <a href="https://en.wikipedia.org/wiki/Hungarian_notation">Hungarian Notation</a>!<a href="#fn1" class="footnote-ref" id="fnref1" role="doc-noteref"><sup>1</sup></a> We use <span class="math inline"><em>τ</em></span> and <span class="math inline"><em>Γ</em></span> to indicate the syntactic categories - the meta-level types, if you will - that our schematic variables refer to. If I wanted to wind up a certain kind of E.W. Dijkstra fan I might even compare them to BASIC-style sigils.</p>
<p>So what’s stopping me from doing this everywhere? Well, for one: it’s a pain when we’re writing to fit a page limit on paper. Page limits force us to spatially compress what we’re saying. Even if the variable names fit fine in a column, they might mean it takes an extra line or two to write a typing rule down. When we want to publish papers, the <em>paper</em> gets right in our way.</p>
<p>And okay, my handwriting’s both slow and ugly so if I’m calculating by hand… but I’m not a maths lecturer and I don’t often do that for an audience of more than one or two people. If I need to reproduce my working elsewhere, I’ve got time to typeset it and pick better variable names.</p>
<section id="footnotes" class="footnotes footnotes-end-of-document" role="doc-endnotes">
<hr />
<ol>
<li id="fn1"><p>My apologies to everybody else with windows programming experience<a href="#fnref1" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
</ol>
</section>
    </section>
    <section>
        <div class="feed">
            Feeds:
            <span class="feed"><a href="/rss.xml"><img src="/images/feed-icon.svg"><span>RSS</span></a></span>
            <span class="feed"><a href="/atom.xml"><img src="/images/feed-icon.svg">Atom</a></span>
        </div>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>Hello World</title>
    <link href="http://flippac.org/posts/hello%20world.html" />
    <id>http://flippac.org/posts/hello%20world.html</id>
    <published>2021-09-18T00:00:00Z</published>
    <updated>2021-09-18T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article>
    <section class="header">
        
        
        Posted on September 18, 2021
        
        
        
    </section>
    <section class="header">
    
    <a href="/archive.html#tags">Tags:</a> <a href="/tags/hello%20world.html" rel="tag">hello world (1)</a>, <a href="/tags/meta.html" rel="tag">meta (1)</a>
    
    </section>
    <section>
        <p>Looks like I’ve set myself up a new blog or something.</p>
<p>Or rather: I’ve spent long enough messing around with Hakyll and it’s about time I uploaded the basics so I can actually say “I have a blog”.</p>
<p>I’m happy enough with most of what I’ve bolted on so far - there’s a slightly-more-than-basic tagging system, I’ve got a decent draft facility nobody else’ll ever see, stuff like that. Haven’t given myself automatic LaTeX-to-PNG rendering yet (which I’m sure as hell going to need), but I shouldn’t let that get in the way of a proof of concept, right?</p>
    </section>
    <section>
        <div class="feed">
            Feeds:
            <span class="feed"><a href="/rss.xml"><img src="/images/feed-icon.svg"><span>RSS</span></a></span>
            <span class="feed"><a href="/atom.xml"><img src="/images/feed-icon.svg">Atom</a></span>
        </div>
    </section>
</article>
]]></summary>
</entry>

</feed>
