Rethinking Syntax: Binding by Adjacency

(github.com)

27 points | by owlstuffing 2 days ago ago

7 comments

  • layer8 20 minutes ago

    The drawback is that building an AST now requires a symbol table and resolving imports, possibly performing type inference and whatnot. It constitutes a higher barrier for various types of tooling. You really want your programming language to avoid becoming context-sensitive in that way.

    It’s similar for the human reader: The examples are only intelligible to the reader incidentally, due to the names used and some natural-text conventions. In the general case, you have a seemingly random token sequence where you have no idea what binds to what, without looking up the type definitions, or having an IDE present the expression in some structured way again.

    Furthermore, in typical code you don’t have the case of constant values so often. You’ll rather have things like:

        nextYear thisMonth.previous() lastDayOf(thisMonth.previous())
        Integer.parse(speedInput) m/s
        startPos to (startPos + length - 1)
  • owlstuffing 2 days ago

    What if these were real, type-safe expressions in Java:

        2025 July 19   // → LocalDate  
        300M m/s       // → Velocity  
        1 to 10        // → Range<Int>  
        Schedule Alice Tues 3pm  // → CalendarEvent
    
    That's the idea behind binding expressions — a compiler plugin I built to explore what it would mean if adjacency had operator semantics. It lets adjacent expressions bind based on their static types, forming new expressions through type-directed resolution.

    Details here: https://github.com/manifold-systems/manifold/blob/master/doc...

  • evanb 2 hours ago

    Mathematica has Infix [0], which expresses the adjacency with a ~ (because Mathematica reserves pure blankspace for multiplication). But it works fine to do eg. `"hello"~StringJoin~" world"`; I was always surprised we could only have the predefined operators in many other languages and we couldn't define our own.

    This seems like a great attempt. I would be worried about how much parsing and backtracking might be required to infer the infix precedence in a totally general system (like garden-path sentences[1]) or actually ambiguous parse trees (which is cured by adopting some rule like right precedence and parens, but what rule you pick makes some 'natural language' constructions work over others).

    [0] https://reference.wolfram.com/language/ref/Infix.html

    [1] https://en.wikipedia.org/wiki/Garden-path_sentence

    • nxobject 4 minutes ago

      Similarly, Agda has a well-typed mixfix operator syntax – you define a function like (_foo_bar_baz) and can automatically write "X foo Y bar Z baz". It does mean that the operator parser has to be extensible at runtime, but it's not a huge cost for a dependently-typed language.

  • jnpnj an hour ago

    Sorry for this sounds absurd, but with diffusion language models, who generate text non-linearly (from the few that I get, they relate terms without a simpler order), I wonder if new syntactic ideas will come up.

  • ape4 an hour ago

    Maybe with a Java string templates:

        var myDate = MAGIC"2025 July 19"
  • measurablefunc an hour ago

    Congratulations, you reinvented yet another stack language.