<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/public/default.xsl"?>
<fr:tree xmlns:fr="http://www.forester-notes.org" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:xml="http://www.w3.org/XML/1998/namespace" root="false" base-url="/public/">
  <fr:frontmatter>
    <fr:authors>
      <fr:author>
        <fr:link href="/owen-lynch/" title="Owen Lynch" uri="https://forest.topos.site/owen-lynch/" display-uri="https://forest.topos.site/owen-lynch" type="local">Owen Lynch</fr:link>
      </fr:author>
    </fr:authors>
    <fr:date>
      <fr:year>2025</fr:year>
      <fr:month>3</fr:month>
      <fr:day>26</fr:day>
    </fr:date>
    <fr:uri>https://forest.topos.site/ocl-00CE/</fr:uri>
    <fr:display-uri>https://forest.topos.site/ocl-00CE</fr:display-uri>
    <fr:route>/ocl-00CE/</fr:route>
    <fr:title text="F-expressions">F-expressions</fr:title>
  </fr:frontmatter>
  <fr:mainmatter>
    <html:p>“F-expressions” is my uncreative name for a new <fr:link href="/krishnamurthi-2024-bicameral/" title="Bicameral, Not Homoiconic" uri="https://forest.topos.site/krishnamurthi-2024-bicameral/" display-uri="https://forest.topos.site/krishnamurthi-2024-bicameral" type="local">lower house</fr:link> syntax for programming language experimentation. The “f” stands for “flexible”, “functional”, or any other flattering word starting with “f”. I believe that there have been other things in the past called f-expressions (when you google f-expression you get documentation for django queries), but it doesn't look like it is too overloaded.</html:p>
    <html:p><fr:link href="https://github.com/ToposInstitute/fexplib" type="external">Here</fr:link> is an implemented parser for f-expressions in Rust, and <fr:link href="https://github.com/ToposInstitute/emtt/tree/main/examples" type="external">here</fr:link> are some examples of using f-expressions in a language.</html:p>
    <html:p>Currently, the exact specification for f-expressions is in flux as I incorporate them into various PL experiments, but this document should give an overview of the design principles and motivation behind f-expressions that should remain relatively stable into the future.</html:p>
    <fr:tree show-metadata="false">
      <fr:frontmatter>
        <fr:authors>
          <fr:author>
            <fr:link href="/owen-lynch/" title="Owen Lynch" uri="https://forest.topos.site/owen-lynch/" display-uri="https://forest.topos.site/owen-lynch" type="local">Owen Lynch</fr:link>
          </fr:author>
        </fr:authors>
        <fr:date>
          <fr:year>2025</fr:year>
          <fr:month>3</fr:month>
          <fr:day>26</fr:day>
        </fr:date>
        <fr:uri>https://forest.topos.site/ocl-00CF/</fr:uri>
        <fr:display-uri>https://forest.topos.site/ocl-00CF</fr:display-uri>
        <fr:route>/ocl-00CF/</fr:route>
        <fr:title text="Review of the concept of bicameral syntax">Review of the concept of bicameral syntax</fr:title>
      </fr:frontmatter>
      <fr:mainmatter>
        <html:p>In the <fr:link href="/krishnamurthi-2024-bicameral/" title="Bicameral, Not Homoiconic" uri="https://forest.topos.site/krishnamurthi-2024-bicameral/" display-uri="https://forest.topos.site/krishnamurthi-2024-bicameral" type="local">Bicameral, Not Homoiconic</fr:link> blog post, <fr:link href="/shriram-krishnamurthi/" title="Shriram Krishnamurthi" uri="https://forest.topos.site/shriram-krishnamurthi/" display-uri="https://forest.topos.site/shriram-krishnamurthi" type="local">Shriram Krishnamurthi</fr:link> claims that the power of Lisp lies not in the specific choice of s-expressions (e.g., the parenthetical notation), but rather in the fact that a parser for lisp is split into two parts. The first part, the “lower house” syntax, is just a uniform tree. The second part, the “upper house” syntax, operates on that tree to extract the abstract syntax tree of the actual language that one cares about.</html:p>
        <html:p>For example, in the lower house syntax, <html:code>(defn (f x y) (+ x y))</html:code> doesn't have any special meaning, and is treated the same as <html:code>(nfed (f x y) (+ x y))</html:code> but in the upper house syntax <html:code>(defn (f x y) (+ x y))</html:code> is parsed into the abstract syntax for a function definition, while <html:code>(nfed (f x y) (+ x y))</html:code> is the application of the function <html:code>nfed</html:code> to the arguments <html:code>(f x y)</html:code> and <html:code>(+ x y)</html:code>.</html:p>
        <html:p>One point of having a lower house syntax is that you can re-use the same parser/lexer (or what Krishnamurthi calls reader/scanner) across many languages, which makes developing languages much easier. But another point is that macros in your language can operate on the raw lower-house syntax, which allows adding syntactic constructs which previously did not correspond to any upper-house abstract syntax.</html:p>
        <html:p>Examples of languages with lower house/upper house syntaxes that are <html:em>not</html:em> s-expressions include:</html:p>
        <html:ul><html:li><fr:link href="https://julialang.org/" type="external">Julia</fr:link></html:li>
  <html:li><fr:link href="https://nim-lang.org/" type="external">Nim</fr:link></html:li>
  <html:li><fr:link href="https://rhombus-lang.org/" type="external">Rhombus</fr:link></html:li></html:ul>
      </fr:mainmatter>
    </fr:tree>
    <fr:tree show-metadata="false">
      <fr:frontmatter>
        <fr:authors>
          <fr:author>
            <fr:link href="/owen-lynch/" title="Owen Lynch" uri="https://forest.topos.site/owen-lynch/" display-uri="https://forest.topos.site/owen-lynch" type="local">Owen Lynch</fr:link>
          </fr:author>
        </fr:authors>
        <fr:date>
          <fr:year>2025</fr:year>
          <fr:month>3</fr:month>
          <fr:day>26</fr:day>
        </fr:date>
        <fr:uri>https://forest.topos.site/ocl-00CP/</fr:uri>
        <fr:display-uri>https://forest.topos.site/ocl-00CP</fr:display-uri>
        <fr:route>/ocl-00CP/</fr:route>
        <fr:title text="Some problems with s-expressions">Some problems with s-expressions</fr:title>
      </fr:frontmatter>
      <fr:mainmatter>
        <html:p>While <fr:link href="/krishnamurthi-2024-bicameral/" title="Bicameral, Not Homoiconic" uri="https://forest.topos.site/krishnamurthi-2024-bicameral/" display-uri="https://forest.topos.site/krishnamurthi-2024-bicameral" type="local">bicameral syntax</fr:link> is nice, there are some things that are lacking about the s-expression realization of bicameral syntax.</html:p>
        <html:p>First of all, we have been trained through years of schooling to expect infix operators. Also, precedences for infix operators can save a lot of parentheses: I can write <html:code>a * b + c</html:code> instead of <html:code>(+ (* a b) c)</html:code>.</html:p>
        <html:p>Secondly, having a more varied syntax allows conveying more information in less space. I'd rather have <html:code>[a, b]</html:code> than <html:code>(tuple a b)</html:code>, not in the least because the introduction of commas give another opportunity to reduce parentheses: I can write <html:code>[a + 1, b]</html:code> instead of <html:code>(tuple (+ a 1) b)</html:code>.</html:p>
        <html:p>But finally, and in my opinion most importantly, in s-expression syntax one must always have memorized a big long list of words which “don't behave like normal”. E.g. in order to understand <html:code>(foo a b)</html:code>, one must know whether <html:code>foo</html:code> is a function or a special form or a macro, which requires loading the entire contex of the code into your brain.</html:p>
        <html:p>One of the motivations behind f-expressions is to realize the benefits of s-expressions while still addressing the concerns from above.</html:p>
      </fr:mainmatter>
    </fr:tree>
    <fr:tree show-metadata="false">
      <fr:frontmatter>
        <fr:authors>
          <fr:author>
            <fr:link href="/owen-lynch/" title="Owen Lynch" uri="https://forest.topos.site/owen-lynch/" display-uri="https://forest.topos.site/owen-lynch" type="local">Owen Lynch</fr:link>
          </fr:author>
        </fr:authors>
        <fr:date>
          <fr:year>2025</fr:year>
          <fr:month>3</fr:month>
          <fr:day>26</fr:day>
        </fr:date>
        <fr:uri>https://forest.topos.site/ocl-00CG/</fr:uri>
        <fr:display-uri>https://forest.topos.site/ocl-00CG</fr:display-uri>
        <fr:route>/ocl-00CG/</fr:route>
        <fr:title text="The principles of f-expressions">The principles of f-expressions</fr:title>
      </fr:frontmatter>
      <fr:mainmatter>
        <html:p>F-expressions were designed to be as simple as possible, while still affording more expressivity than s-expressions. Their design is a natural outgrowth of the following principles.</html:p>
        <fr:tree show-metadata="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/owen-lynch/" title="Owen Lynch" uri="https://forest.topos.site/owen-lynch/" display-uri="https://forest.topos.site/owen-lynch" type="local">Owen Lynch</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2025</fr:year>
              <fr:month>3</fr:month>
              <fr:day>26</fr:day>
            </fr:date>
            <fr:uri>https://forest.topos.site/ocl-00CH/</fr:uri>
            <fr:display-uri>https://forest.topos.site/ocl-00CH</fr:display-uri>
            <fr:route>/ocl-00CH/</fr:route>
            <fr:title text="Each syntactic construct means only one thing">Each syntactic construct means only one thing</fr:title>
            <fr:taxon>principle</fr:taxon>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>In many languages, the basic syntactic constructs (parentheses, brackets, etc.) are massively overloaded. For instance, parentheses in python are used for</html:p>
            <html:ul><html:li>Grouping: <html:code>(x + y)</html:code> is the same as <html:code>x + y</html:code></html:li>
  <html:li>Function application: <html:code>f(x)</html:code> is not the same as <html:code>f x</html:code></html:li>
  <html:li>Tuples: <html:code>(x,)</html:code> is not the same as <html:code>(x)</html:code></html:li></html:ul>
            <html:p>In f-expressions, we strive to as much as possible minimize overloading. This is an overarching principle that drives many of the other principles.</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/owen-lynch/" title="Owen Lynch" uri="https://forest.topos.site/owen-lynch/" display-uri="https://forest.topos.site/owen-lynch" type="local">Owen Lynch</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2025</fr:year>
              <fr:month>3</fr:month>
              <fr:day>26</fr:day>
            </fr:date>
            <fr:uri>https://forest.topos.site/ocl-00CJ/</fr:uri>
            <fr:display-uri>https://forest.topos.site/ocl-00CJ</fr:display-uri>
            <fr:route>/ocl-00CJ/</fr:route>
            <fr:title text="Juxtaposition is application">Juxtaposition is application</fr:title>
            <fr:taxon>principle</fr:taxon>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>We support the ML-style version of function application, where <html:code>f x</html:code> is <html:code>f</html:code> applied to <html:code>x</html:code>.</html:p>
            <html:p>This produces the <html:code>App1</html:code> syntax node in <fr:link href="https://github.com/ToposInstitute/fexplib/blob/main/src/types.rs" type="external"><html:code>FExp0</html:code></fr:link>.</html:p>
            <html:p>Incidentally, this is <html:em>also</html:em> how field access works: <html:code>a.x</html:code> is parsed as <html:code>a</html:code> applied to <html:code>.x</html:code> (which is a <fr:link href="/ocl-00CK/" title="Field and tag literals" uri="https://forest.topos.site/ocl-00CK/" display-uri="https://forest.topos.site/ocl-00CK" type="local">field literal</fr:link>). We take this idea from <fr:link href="https://github.com/gwaithimirdain/narya" type="external">narya</fr:link>.</html:p>
            <html:p>In order so that <html:code>f a.x b.x</html:code> parses as <html:code>f (a .x) (b .x)</html:code> instead of <html:code>f a .x b .x</html:code> we say that application without an intervening space binds tighter than application with an intervening space. Similarly, <html:code>f a[1] b[1]</html:code> would parse the same as <html:code>f (a [1]) (b [1])</html:code>.</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/owen-lynch/" title="Owen Lynch" uri="https://forest.topos.site/owen-lynch/" display-uri="https://forest.topos.site/owen-lynch" type="local">Owen Lynch</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2025</fr:year>
              <fr:month>3</fr:month>
              <fr:day>26</fr:day>
            </fr:date>
            <fr:uri>https://forest.topos.site/ocl-00CL/</fr:uri>
            <fr:display-uri>https://forest.topos.site/ocl-00CL</fr:display-uri>
            <fr:route>/ocl-00CL/</fr:route>
            <fr:title text="Customizable binary operators">Customizable binary operators</fr:title>
            <fr:taxon>principle</fr:taxon>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>We support arbitrary binary operators. These have a lower precedence than function application, so <html:code>f x + g x</html:code> is the same as <html:code>(f x) + (g x)</html:code>.</html:p>
            <html:p>Binary operators produce the <html:code>App2</html:code> syntax node in
<fr:link href="https://github.com/ToposInstitute/fexplib/blob/main/src/types.rs" type="external"><html:code>FExp0</html:code></fr:link>.</html:p>
            <html:p>The f-expression parser is parametrized over a table of precedences and associativities for binary operators, so that a user of the parser can choose how to resolve the ambiguities of code like <html:code>x + y == z</html:code> (we recommend the user to follow established conventions for common binary operators, but this is ultimately a matter for the language designer).</html:p>
            <html:p>In a language based on f-expressions, one may wish some binary operators to be special syntactic constructs, and others to be used as functions. We support this by allowing the user to designate some operators as “keyword operators” and others as “variable operators”.</html:p>
            <html:p>Finally, using <html:code>`</html:code> one can make any binary operator into a normal variable, so that <html:code>`+ 1 2</html:code> is the same as <html:code>1 + 2</html:code>.</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/owen-lynch/" title="Owen Lynch" uri="https://forest.topos.site/owen-lynch/" display-uri="https://forest.topos.site/owen-lynch" type="local">Owen Lynch</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2025</fr:year>
              <fr:month>3</fr:month>
              <fr:day>26</fr:day>
            </fr:date>
            <fr:uri>https://forest.topos.site/ocl-00CI/</fr:uri>
            <fr:display-uri>https://forest.topos.site/ocl-00CI</fr:display-uri>
            <fr:route>/ocl-00CI/</fr:route>
            <fr:title text="Parentheses are used for grouping">Parentheses are used for grouping</fr:title>
            <fr:taxon>principle</fr:taxon>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>The <html:em>only</html:em> use of parentheses is to clarify grouping, so that we can write expressions like <html:code>5 * (2 + 1)</html:code> which is parsed different than <html:code>5 * 2 + 1 = (5 * 2) + 1</html:code>.</html:p>
            <html:p>As a consequence, parentheses never produce a new syntax node, they just change the parsing of existing syntax.</html:p>
            <html:p>Also, parentheses are always idempotent: <html:code>(e)</html:code> always has the same meaning as <html:code>((e))</html:code>.</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/owen-lynch/" title="Owen Lynch" uri="https://forest.topos.site/owen-lynch/" display-uri="https://forest.topos.site/owen-lynch" type="local">Owen Lynch</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2025</fr:year>
              <fr:month>3</fr:month>
              <fr:day>26</fr:day>
            </fr:date>
            <fr:uri>https://forest.topos.site/ocl-00CK/</fr:uri>
            <fr:display-uri>https://forest.topos.site/ocl-00CK</fr:display-uri>
            <fr:route>/ocl-00CK/</fr:route>
            <fr:title text="Field and tag literals">Field and tag literals</fr:title>
            <fr:taxon>principle</fr:taxon>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>In order to support records and tagged unions, we have field <html:code>.x</html:code> and tag <html:code>'cons</html:code> literals, which produce the <html:code>Field</html:code> and <html:code>Tag</html:code> syntax nodes respectively.</html:p>
            <html:p>These work with the application syntax, so field access of a record <html:code>r</html:code> is <html:code>r .x</html:code> and tagged union construction for a linked list would be <html:code>'cons x xs</html:code>.</html:p>
            <html:p>But language designer could choose to enhance the interpretation of these, so <html:code>.x</html:code> on its own could elaborate to <html:code>r ↦ r.x</html:code>, and <html:code>'pumpkin</html:code> could elaborate to an interned symbol type.</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/owen-lynch/" title="Owen Lynch" uri="https://forest.topos.site/owen-lynch/" display-uri="https://forest.topos.site/owen-lynch" type="local">Owen Lynch</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2025</fr:year>
              <fr:month>3</fr:month>
              <fr:day>26</fr:day>
            </fr:date>
            <fr:uri>https://forest.topos.site/ocl-00CM/</fr:uri>
            <fr:display-uri>https://forest.topos.site/ocl-00CM</fr:display-uri>
            <fr:route>/ocl-00CM/</fr:route>
            <fr:title text="Square brackets for tuples">Square brackets for tuples</fr:title>
            <fr:taxon>principle</fr:taxon>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>There are two ways to make lists of syntax nodes in f-expressions: square brackets and <fr:link href="/ocl-00CN/" title="Curly brackets for records and blocks" uri="https://forest.topos.site/ocl-00CN/" display-uri="https://forest.topos.site/ocl-00CN" type="local">curly brackets</fr:link>. Between square brackets, elements must be divided by commas, for instance <html:code>[a, b, c]</html:code>.</html:p>
            <html:p>This corresponds to the <html:code>Tuple</html:code> syntax node in <fr:link href="https://github.com/ToposInstitute/fexplib/blob/main/src/types.rs" type="external"><html:code>FExp0</html:code></fr:link>.</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/owen-lynch/" title="Owen Lynch" uri="https://forest.topos.site/owen-lynch/" display-uri="https://forest.topos.site/owen-lynch" type="local">Owen Lynch</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2025</fr:year>
              <fr:month>3</fr:month>
              <fr:day>26</fr:day>
            </fr:date>
            <fr:uri>https://forest.topos.site/ocl-00CN/</fr:uri>
            <fr:display-uri>https://forest.topos.site/ocl-00CN</fr:display-uri>
            <fr:route>/ocl-00CN/</fr:route>
            <fr:title text="Curly brackets for records and blocks">Curly brackets for records and blocks</fr:title>
            <fr:taxon>principle</fr:taxon>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Curly brackets are the second way to make lists of expressions (the first being <fr:link href="/ocl-00CM/" title="Square brackets for tuples" uri="https://forest.topos.site/ocl-00CM/" display-uri="https://forest.topos.site/ocl-00CM" type="local">square brackets</fr:link>). Between curly brackets, expressions are separated by semicolons. Curly bracket expressions come in two variants: records and blocks.</html:p>
            <html:p>A record has a trailing semicolon, so it looks like <html:code>{a = 1; b = 2;}</html:code>. A block does not have a trailing semicolon, so it looks like <html:code>{a = 1; b = 2; a + b}</html:code>. The intuition is that blocks are syntactic sugar for <html:code>{a = 1; b = 2; ret = a + b; }.ret</html:code>.</html:p>
            <html:p>Thus, curly brackets may be used for both record construction and let bindings.</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/owen-lynch/" title="Owen Lynch" uri="https://forest.topos.site/owen-lynch/" display-uri="https://forest.topos.site/owen-lynch" type="local">Owen Lynch</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2025</fr:year>
              <fr:month>3</fr:month>
              <fr:day>26</fr:day>
            </fr:date>
            <fr:uri>https://forest.topos.site/ocl-00CO/</fr:uri>
            <fr:display-uri>https://forest.topos.site/ocl-00CO</fr:display-uri>
            <fr:route>/ocl-00CO/</fr:route>
            <fr:title text="Primitives and specials">Primitives and specials</fr:title>
            <fr:taxon>principle</fr:taxon>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Following <fr:link href="/ocl-00CP/" title="Some problems with s-expressions" uri="https://forest.topos.site/ocl-00CP/" display-uri="https://forest.topos.site/ocl-00CP" type="local">Some problems with s-expressions</fr:link>, we use a reserved syntax to denote language builtins and special forms.</html:p>
            <html:p>Specifically, words starting with <html:code>@</html:code> like <html:code>@addU32</html:code> are intended to be used for language builtins, which is inspired by <fr:link href="https://ziglang.org/" type="external">zig</fr:link>. These should be like ordinary functions, which follow normal evaluation rules, but just happen to be implemented by the compiler rather than implemented in user code.</html:p>
            <html:p>Words starting with <html:code><![CDATA[%]]></html:code>
like <html:code><![CDATA[%match]]></html:code>
are intended to be used for special forms, which do <html:em>not</html:em> behave like functions and might totally reinterpret syntax. For instance, pattern matching might be implemented like:</html:p>
            <html:code><![CDATA[l %match[
'cons x xs => ...,
'nil => ...
]]]></html:code>
            <html:p>which is <html:em>not</html:em> the application of a function to the arguments <html:code>'cons x xs =&gt; ...</html:code>, <html:code>'nil =&gt; ...</html:code>.</html:p>
          </fr:mainmatter>
        </fr:tree>
      </fr:mainmatter>
    </fr:tree>
  </fr:mainmatter>
  <fr:backmatter>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="References">References</fr:title>
      </fr:frontmatter>
      <fr:mainmatter>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/shriram-krishnamurthi/" title="Shriram Krishnamurthi" uri="https://forest.topos.site/shriram-krishnamurthi/" display-uri="https://forest.topos.site/shriram-krishnamurthi" type="local">Shriram Krishnamurthi</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2024</fr:year>
            </fr:date>
            <fr:uri>https://forest.topos.site/krishnamurthi-2024-bicameral/</fr:uri>
            <fr:display-uri>https://forest.topos.site/krishnamurthi-2024-bicameral</fr:display-uri>
            <fr:route>/krishnamurthi-2024-bicameral/</fr:route>
            <fr:title text="Bicameral, Not Homoiconic">Bicameral, Not Homoiconic</fr:title>
            <fr:taxon>Reference</fr:taxon>
            <fr:meta name="external">https://parentheticallyspeaking.org/articles/bicameral-not-homoiconic/</fr:meta>
          </fr:frontmatter>
          <fr:mainmatter />
        </fr:tree>
      </fr:mainmatter>
    </fr:tree>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="Context">Context</fr:title>
      </fr:frontmatter>
      <fr:mainmatter />
    </fr:tree>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="Backlinks">Backlinks</fr:title>
      </fr:frontmatter>
      <fr:mainmatter />
    </fr:tree>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="Related">Related</fr:title>
      </fr:frontmatter>
      <fr:mainmatter />
    </fr:tree>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="Contributions">Contributions</fr:title>
      </fr:frontmatter>
      <fr:mainmatter />
    </fr:tree>
  </fr:backmatter>
</fr:tree>
