- expression-oriented programming one of the great advances of FP
- expressions plug together like legos, making more malleable programming experience in-the-small
Write in an expression-oriented style, scoping variables as locally as possible:
let x = do {
let tmp = f();
tmp * tmp + 1
};
Use conditional statements as expressions, instead of awkward nested ternaries:
let x = do {
if (foo()) { f() }
else if (bar()) { g() }
else { h() }
};
Especially nice for templating languages like JSX:
return (
<nav>
<Home />
{
do {
if (loggedIn) {
<LogoutButton />
} else {
<LoginButton />
}
}
}
</nav>
)
- key refactoring principles:
do { <expr>; }
equivalent to<expr>
(do { <stmt> };)
equivalent to{ <stmt> }
- this semantic transparency is demonstrated by the semantics:
- Return the result of evaluating Body.
How to avoid either parsing conflict in statement context with do
-while
, or dangling-else type of ambiguity:
do do f(); while (x);
I have several alternatives I intend to explore here.
Is there any activity on this? Or similar proposals elsewhere I could look at or try out?
I need this really badly -- especially when working with JSX.
@streamich A ternary is pretty nice when there's only 2 branches (true or false), but if there's 3-4-5 it quickly becomes completely unreadable and you're forced to make a helper function with
return
to avoid using a temporary variable.One could argue that splitting things into functions is "right" anyway, but I want refactoring into functions/consts a conscious decisions, not something I have to do because of language restrictions. Inline is often easier to read than having to jump back and forth between intermediary helper functions.