Hey, thanks for trying Loreline! Some answers to your observations:
- Yes, you are right that Loreline’s syntax highlighting is rather important. The syntax is designed with the intent that the language does need only the minimum of markup and symbols as the syntax highlighting do the work of identifying each element.
- Alternatives are on multiple lines, but you can use array_pick() if you want to do a similar operation inside a dialogue:
Today’s menu is ${["salad", "potatoes"].pick()}.
- The callback hell as you mention it is a design choice so that Loreline can be integrated into asynchronous systems by default. On some platforms, that’s a requirement, and that’s also what makes it easy to, say, play animations or anything else in between dialogue lines, when you integrate it within a game engine.
- I agree that passing parameters to beats would be very useful, and in fact I intend to add this later, but I had to draw a line where I stop adding features for the first releases of Loreline. In a future update? For sure 
- Regarding assigning functions and beats as variables, it would be nice. There are already some places (function helpers like has_beat()) where you can reference a beat using a string, but it could definitely be improved. Though, same thing as beat parameters, it would likely land in a future version.
- Not necessarily pre-compiling, but it would also be a good addition to be able to export a single-file package that includes a whole Loreline story indeed.
- Regarding your EDIT2: Mmmmh, state lookup follows the beat hierarchy: if you read a state field from a given beat, it will first try the current scope, and bubble up until top level scope until it finds it (or finds nothing). If you experience a case where it doesn’t behave like that, I’m interested to see it!