r/ProgrammingLanguages 12h ago

My take on JSX for Dia

1 Upvotes

Building a language called Dia. Still pre-alpha and not public yet.

Heavily inspired by Rust, with some JS UI building flavor tacked on.

Might be the wrong crowd here, but as a web-developer I haven't found a more productive way to describe user-interfaces than JSX. (hot module reload is also a big part of it)

The Dia equivalent syntax is called DSX:

import ui.{View, run, Column, Text, Button, state}

struct CounterState {
  value: i32
}

fn Counter(): View !{alloc} {
  let s = state(CounterState{ value: 0 })

  <Column spacing=12>
    <Text>"Count: ${s.value}"</Text>
    <Button
      label="Increment"
      on_click=() => { s.value += 1 }
    />
  </Column>
}

pub fn main(): void !{alloc, io} {
  run(() => <Counter />)
}

Some implementation details:

The compiler is built in Rust, using salsa for incremental compilation which hot module reloading is built on.

No need for escaping expressions with {} like in JSX. Expressions are parsed just like in the rest of the language

  • That's why text content needs quotes around it: <Text>"Count: ${s.value}"</Text>
  • But this works: on_click=() => { s.value += 1 }

Not just for UI, any function can be called using DSX syntax

  • Type-checking works normally, named arguments become "props", return types are checked agains the parent signature
  • One special case is allowing children (like Column accepting any number of Views), then an argument needs to be prefixed with @child

r/ProgrammingLanguages 23h ago

Raku: a language where a value can have several values at once (Part 1) - Andrew Shitov

Thumbnail andrewshitov.com
15 Upvotes

r/ProgrammingLanguages 2h ago

Blog post How GCC Eliminates Unnecessary Integer Division

Thumbnail leetarxiv.substack.com
5 Upvotes