3 ms·
I'd say because JavaScript is insufficiently expressive. No macros, no arrow (pipe) operator, and the premier way of writing it is 4x as verbose than what I'd c
by balamatom 1y ago
I'd say because JavaScript is insufficiently expressive. No macros, no arrow (pipe) operator, and the premier way of writing it is 4x as verbose than what I'd consider reasonable. D3 is a great library though.
- DanielHB 1y agowhat do you mean by "arrow operator"?
- lionkor 1y agoMaybe overloadable operators like in C++, where -> usually demotes some kind of deeper access into the object or abstraction? Or, the opposite, and abstracted access.
- DanielHB 1y agoThat is what I thought, but that doesn't make sense for a language without pointers According to the other comment it seems he meant the |> pipe operator that is under proposal in js
- amiga386 1y agoProbably a reference to Clojure's arrow operator: https://blog.frankel.ch/learning-clojure/2/ https://blog.frankel.ch/learning-clojure/2/ Something like a(b(c(d(e(7)))))) in Javascript could be written (-> 7 e d c b a) in Clojure?
- balamatom 1y agoBingo.
- deleted 1y ago[deleted]
- TheHeasman 1y agoUh, there are arrow operators in JS. D3.JS in Action Third Edition exclusively uses arrow operators. (Trust me. I don't know jack about JavaScript, I had to get through the MDN docs to understand what they were, and once I did, made a whole lot more sense).
- balamatom 1y agoAnd I know more about JavaScript than I'd like to, so don't trust me.
- tomku 1y agoThe feature the person you're replying to is talking about is not arrow functions (`=>`), but what are called "threading macros" in other languages. In Clojure[1], the main one is named `->` and used as a way to thread a value through a series of functions that take it as a first argument, using the return value from the first function as the first argument to the second, and so on. It allows you to compose a series of plain functions to transform a value instead of (stateful) method chaining or nesting functions. JS does not have a straightforward equivalent. The old and deprecated `with` keyword might seem similar but it's only a surface resemblance as it does not perform the return-value threading that makes the above pattern useful, it was meant for methods that mutate object state. There's a TC39 proposal[2] to add a pipe operator that would accomplish a similar thing to threading macros via an infix operator but it's still a draft. [1]: https://clojure.org/guides/threading_macros https://clojure.org/guides/threading_macros [2]: https://github.com/tc39/proposal-pipeline-operator https://github.com/tc39/proposal-pipeline-operator
- TheHeasman 1y agoI stand corrected. Thanks for pointing that out. Learned something new.