Babel 7.5
babeljs.io
babeljs.io
I wonder if there is a way to revive the proposal...
let newScore = fetch(url)
|> await #
|> #.json()
|> await #
|> #.ID; let newScore = (await (await fetch(url)).json()).ID
and no, a myriad of intermediate variables is not always a nice alternative. This syntax gives a clear view of what happens to the data without having to untangle deeps expressions. I like it. let newScore = fetch(url)
|> await
|> r => r.json()
|> await
|> obj => obj.ID; let newScore = await fetch(url)
.then(r => r.json())
.then(obj => obj.ID)
I think another problem is that these are just examples that aren't necessarily representative of real-life use cases but more just try to show all the different ways of using the syntax in one small chunk. // helper for method calls in pipes
const _ = new Proxy({}, {get(_i, c) { return (...args) => e => e[c](...args)}})
document
.querySelectorAll('.requestedIds')
|> Array.from
|> _.map(el => fetch(`//address/${el.value}`))
|> Promise.all
|> await
|> _.map(re => re.json())
|> Object.fromEntries
|> processResponse
In this case, there is both methods and function calls, which complicates reading quite a bit. Converted to pipes, it's simply from top to bottom.It seems to me like the bind operator would've made the extra complexity unnecessary.
That being said, can't you abuse the promise syntax to get something very similar right now? Since `.then` will wrap a non-promise return value in a promise, this would do the same as your example:
Promise.resolve(document.querySelectorAll('.requestedIds'))
.then(p => Array.from(p))
.then(p => p.map(el => fetch(`//address/${el.value}`)))
.then(p => Promise.all(p))
.then(p => p.map(re => re.json())
.then(p => Object.fromEntries(p))
.then(p => processResponse(p))
But funnily enough, as I went to go write out that example, I realized that I have no idea what the hell is being passed into the `_.map` functions... Even me being lazy and using `p` as the variable name for each pipe, the version that writes it out is massively easier to understand in my opinion.I'm curious how others read it.
So you could read the expression above as "fetch url, then await it, then get its json then await it, then get its ID"
Although I don't know why a syntax needs to be verbally legible, seems like an odd requirement to me.
Programming languages typically opt for either verbal legibility or having their symbols represent some understood structural / visual cue (like an arrow, for example). There's nothing about the character "#" that indicates the directionality of the operation visually, so I assumed there was some verbal mapping that I wasn't familiar with. ("Hash", "pound", "number", etc).
Typically programming languages are used to communicate procedures in ways that would allow human people with a similar set of cultural references to understand what is going on by reading it. Having verbal legibility allows people who know the language to explain very quickly to new people what is meant by a given symbol. Otherwise why #? It could be any symbol.
Communicating meaning for humans might not be the intent for javascript moving forward, given where WASM and transpilation is headed, so :shrug:
Debugging is an issue though. I commonly find myself splitting up the pipes into section in order to inspect the results and find exceptions. Breakpoints and stepping through code is probably the features I most often struggle with.
This is clear as day, and I haven't even read the proposal...
That's also hoping your code map files and your browser work well together, which is often not the case. Transpiled code is always a pain to debug at one point or another.
And that's just one line, a code back "full of those" will let you do the dance again and again. A very slow dance at that, cause babel is not the fastest horse in town.
Finally I'll pray your intern doesn't have to do it. But we all have teams full of good programmers right ?
The pipeline proposal has multiple syntaxes right now that the community is trying to pick from and discuss.
The chances that the F#-style syntax will be chosen AND will make it to the language proper unchanged is VERY low in my opinion.
And if the community goes in a different direction, it's unlikely that the F# style will be maintained for all that long because it's still such an early stage proposal.
Well working Codemods are difficult to make in many cases, and unless someone is paying for it, I don't think there will be many calls for one to translate between the syntaxes unless the proposal gains a lot of usage without settling on one.