4 ms·
In real Lisp code you'd likely indent it something like this: (% (- (+ (* x 2) 1) 3) x) This makes the structure c
by _dain_ 3y ago
In real Lisp code you'd likely indent it something like this:
(%
(-
(+ (* x 2)
1)
3)
x)
This makes the structure clearer, although it's still wasteful of space, and you still have to read it "inside-out". The thread macro version would be:
(-> x
(* 2)
(+ 1)
(- 3)
(% x))
It's more compact, there's no ambiguity about order-of-operations, and we can read it in order, as a list of instructions:
"take x, times it by 2, add one, subtract 3, take modulus with the original x".
It's pretty much how you'd type it into a calculator.
EDIT: care to explain the downvote?
- andsoitis 3y ago> In real Lisp code you'd likely indent it something like this: Not only would that not be idiomatic, the operator for modulus in Common LISP is mod not %. and the brackets you and the parent used in the s-expr are around the wrong groups of symbols. So you're more likely to see: (mod (* (+ 1 x) (- 2 3)) x) or maybe with some limited indentation, such as: (mod (* (+ 1 x) (- 2 3)) x)
- _dain_ 3y agoNobody said it had to be Common Lisp. I'm going by the notation the grandparent commenter used. My point was that indentation can clarify the structure of nested sexps vs putting them on one line. And that is actually what people do. "mod" vs "%" hasn't the least to do with it. This isn't even really about arithmetic; those are just at-hand examples the GP commenter chose. Could just as well have been (foo (bar (baz (bax x 2) "hello") "world") "!") >the brackets you and the parent used in the s-expr are around the wrong groups of symbols No they're not. Yours is wrong. Multiplication has higher priority than addition so the order of evaluation begins with (x * 2) not (1 + x).
- andsoitis 3y ago> No they're not. Yours is wrong. Multiplication has higher priority than addition so the order of evaluation begins with (x * 2) not (1 + x). OK, I shouldn't have gone that far. FWIW, modulus has the same operator precedence as multiplication and division. So really, it is more like: (- (+ 1 (* x 2)) (mod 3 x)) or using the increment function: (- (1+ (* x 2)) (mod 3 x))
- nkh 3y agoFor what it's worth (speaking only for myself), I could not live without the threading macros (-> and ->>) in Clojure. Below is an example of some very involved ETL work I just did. For me this is very readable, and I understand if others have other preferences. (defn run-analysis [path] ;load data from converted arrow file (let [data (load-data path)] (-> data ;; Calc a Weeknumber, Ad_Channel, and filter Ad_Channel for retail add-columns ;; Agg data by DC, Store, WeekNum, Item and sum qty and count lines rolled-ds ;; Now Agg again, this time counting the weeks and re-sum qty and lines roll-again))) ;;Run the whole thing (time (run-analysis arrow-path)) This code processes 27 million lines in 75 seconds (shout out to https://techascent.github.io/tech.ml.dataset/100-walkthrough.html https://techascent.github.io/tech.ml.dataset/100-walkthrough... library)
- lispm 3y agoIf such an expression gets indented at all, it would be more like this: (% (- (+ (* x 2) 1) 3) x)
- ziml77 3y agoInterestingly the second form is just infix notation where every operator has the same precedence and thus is evaluated left to right. That says to me that it's not infix notation that's inherently weird but instead it's the operator precedence rules of mathemetical infixes that are weird.