One of my guilty pleasures is to rewrite trivial functions to be statements free.
Since I’d be too self-conscious to put those in a PR, I keep those mostly to myself.
For example, here’s an XPath wrapper:
const $$$ = (q,d=document,x=d.evaluate(q,d),a=[],n=x.iterateNext()) => n ? (a.push(n), $$$(q,d,x,a)) : a;
Which you can use as
$$$("//*[contains(@class, 'post-')]//*[text()[contains(.,'fedilink')]]/../../..")
to get an array of matching nodes.If I was paid to write this, it’d probably look like this instead:
function queryAllXPath(query, doc = document) { const array = []; const result = doc.evaluate(query, doc); let node= result.iterateNext(); while (node) { array.push(node); n = result.iterateNext(); } return array; }
Seriously boring stuff.
Anyway, since var/let/const are statements, I have no choice but to use optional parameters instead, and since loops are statements as well, recursion saves the day.
Would my quality of life improve if the lambda body could be written as
=> if n then a.push(n), $$$(q,d,x,a) else a
? Obviously, yes.Reminds me when my I did all my homework using list comprehension, ternary operations, and lambda expressions because it was boring. Here’s an example
def task03( matrix ): print((new_matrix := [[ (y if y != 0 else ( temp := sum([r[j] for r in matrix[0:i]] + x[j:]), zeros_sum := (zeros_sum if 'zeros_sum' in locals() else 0) + temp)[0] ) for j,y in enumerate(x)] for i,x in enumerate(matrix)], '\n'.join( [ ' '.join([str(new_matrix[o][p]) for p in range(0 if len(matrix[0]) <= 20 else len(matrix[0])-20, len(matrix[0]))]) for o in range(0 if len(matrix) <= 20 else len(matrix)-20, len(matrix)) ] ) + '\n' + str(zeros_sum) )[1] )
you monster
The whole idea of expressions is very nice, and I can’t imagine using ternary expressions anywhere after learning Rust.
Also implicit returns ❤️
I never got to like implicit anything.
Not even returns. Ever.
I like using if expressions in kotlin, but secretly sometimes I miss ternaries
Having some experience with both Python and JS/TS, I don’t have much preference about ternaries or expressions. Although I always break lines for ternary statements.
const testStuff = condition ? outcome(1) : outcome(2);
Having everything on the same line ruins readability for me.
personally I prefer
const testStuff = condition ? outcome(1) : outcome(2);
Also works fine and is better than inlining it all. I’m just more used to ending the lines with the symbols - instead of starting the next line with them like your example - because it’s the same parttern I use for other stuff, like (curly) brackets.
For a long time I hated ternaries, partially due to my experience with them in PHP (Who thought left-associative ternaries was a good idea? seriously?).
OpenSCAD made me love them again. It’s purely functional so you’re encouraged to use nested ternaries.
and then you have lua
local result = condition and a or b
I’m not complaining, although it gets a little confusing when one of the results is falsey. Which is a rarity since only
false
andnil
are falsey in lua.Still less intuitive than Kotlin’s if expressions.
Swift just got this (for switch statements too), and my god is it great.