6 ms·
Best syntax for closures I've ever seen in Scala. Would look something like data.store.book.filter(_.price < 10).map(_.title) Every language should just a
by vbezhenar 3y ago
Best syntax for closures I've ever seen in Scala. Would look something like
data.store.book.filter(_.price < 10).map(_.title)
Every language should just adapt it.
- OskarS 3y agoRaku does a version of that as well, it's sick.
- librasteve 2y agoin Raku, this data.store.book.filter(_.price < 10).map(_.title) would be written as data.store.book.grep(*.price < 10).map(*.title)
- williamcotton 3y agoF# just added this syntax: let possibleNow = people |> List.distinctBy _.Name |> List.groupBy _.Age |> List.map snd |> List.map _.Head.Name |> List.sortBy _.ToString()
- chuckadams 3y agoMeanwhile JS is still struggling to define even version 1.0 of a pipe operator, and the proposal has been bikeshedded into shabby oblivion with a syntax that's worse than just pulling out lodash pipe() or similar. TC39 does not fill me with hope.
- lylejantzi3rd 3y agoI will never understand why people find the need to cram as much "mystery meat" code into one line as humanly possible. It makes it much harder to understand, debug, and optimize.
- williamcotton 3y agoIt cuts out the programerese and makes it easier to read?
- im3w1l 3y agoThe less clutter there is, the more the remaining elements pop.
- lylejantzi3rd 3y agoCramming a bunch of chained commands on a single line doesn't reduce clutter. In fact, it increases it.
- fwlr 3y agoI’m a fan, but let’s go even further. JavaScript has pleasant definitions of functions with filter((x) => x.price < 10) but why can’t we just write filter(x.price < 10) and add a rule to the JS engine that says “when you encounter a ‘syntax error: undeclared identifier x’, rewrite the code to add `(x) => ` in front of where the syntax error occurred, if and only if this rewrite prevents the syntax error”. You might protest that reacting to syntax errors by inserting extra code and checking if the errors go away is an insane strategy, but I would note that JavaScript is actually a semicolon-terminated language in which most developers never write a semicolon, and the JavaScript engine is already using this insane strategy on nearly every line of modern JS to insert a semicolon whenever it encounters a syntax error, so it’s obviously practical.
- tubthumper8 3y agoSome languages do this already but with a designated placeholder, like filter(_.price < 10) That may not work because plain underscore is already a valid identifier but another placeholder could potentially be used and no need for the parser backtracking / function insertion (which I don't like the idea of, there may be cases where an undeclared identifier was a bug and it shouldn't be turned into a function)
- chuckadams 3y agoThe problem with your approach is that `filter(x.price < 10)` is perfectly valid syntax, it's filter with a single boolean arg. You need something else to trigger the magic: change `x` to `it` and you have Kotlin and Groovy's shorthand syntax -- you just can't define a variable called `it` anymore. If you want closure semantics on arbitrary undefined variables, I think I might have to slap you on general principle ;)
- lizmat 3y agoThat's exactly what the Raku Programming Language does. Except that the "x" is represented by "*", so it reads: grep(*.price < 10) This is referred to as "Whatever-currying": https://docs.raku.org/type/Whatever https://docs.raku.org/type/Whatever*
- zzo38computer 3y ago
- exceptione 3y agoKotlin has it instead of _ val numbers = listOf(20, 19, 7, 12) val multiplied = numbers.map { 3 * it } // [ 60, 57, 21, 36 ]
- lizmat 3y agoThe Raku programming language has, with some tweaks: data.store.book.grep(*.price < 10).map(*.title) Although personally I would write that as: data.store.book.map: { .title if .price < 10 } which combines the filter / map into a single operation. https://raku.org https://raku.org