How to find out when in a new line in Clojure / Lisp in general?

Here are some sample code:

(deftype Deck52 [suits] :as this DeckOfCards (check-empty [] (Deck52. (apply hash-map (apply concat (remove (-> nil?) (for [[key val] suits] (if (empty? val) nil [key val]))))))) (remove-card [suit card] (assoc suits suit (remove #(= card %) (suit suits)))) (get-card [suit] (let [suitd (suit suits)] [(first suitd) (check-empty (Deck52. (assoc suits suit (rest suitd))))])) (random-card [] (let [suitn (+ 1 (rand-int 4))] (cond (= suitn 1) (get-card this :hearts) (= suitn 2) (get-card this :diamonds) (= suitn 3) (get-card this :clubs) (= suitn 4) (get-card this :spades))))) 

I also posted this code in Gist here if it is easier to read: http://gist.github.com/307425 (nowhere to go).

The main example here is check-empty . I had great difficulty knowing where I should and should not have come back, and I still don’t know if I did it right. He threatens to walk right on the right side of the screen, but the clojure way is to indent, and I guess it should be like that.

So the question is, when did the time come to put a new line in Clojure / Lisp code? Am I doing this rite?

NOTE. I can’t promise that the code I posted works. I did some experiments, and some things can be empty if not broken.

+6
coding-style newline clojure
source share
3 answers

The way you broke the lines is fine. I would make some small changes though.

  • Place the argument vectors on the next line.
  • Use different forms: small -> and ->> helpers, condp, when, ...
  • If necessary, split the line immediately after the function name.

Here is how I would do it. (Disclaimer: my style. Maybe you have different ones. YMMV!)

 (deftype Deck52 [suits] :as this DeckOfCards (check-empty [] (->> (for [[key val] suits] (when-not (empty? val) [key val])) (remove nil?) (apply concat) (apply hash-map) Deck52.)) (remove-card [suit card] (assoc suits suit (remove #(= card %) (suit suits)))) (get-card [suit] (let [suitd (suit suits)] [(first suitd) (->> (rest suitd) (assoc suits suit) Deck52. check-empty)])) (random-card [] (let [suitn (+ 1 (rand-int 4))] (condp = suitn 1 (get-card this :hearts) 2 (get-card this :diamonds) 3 (get-card this :clubs) 4 (get-card this :spades))))) 

Although the following question is not part of your question, I cannot resist:

 (deftype Deck52 [suits] :as this DeckOfCards (check-empty [] (->> suits (remove (comp nil? seq val)) (into {}) Deck52.)) (remove-card [suit card] (update-in suits [suit] #(remove %2 %1) #(= card %))) (get-card [suit] (let [suitd (get suits suit)] [(first suitd) (->> (rest suitd) (assoc suits suit) Deck52. check-empty)])) (random-card [] (case (rand-int 4) 0 (get-card this :hearts) 1 (get-card this :diamonds) 2 (get-card this :clubs) 3 (get-card this :spades)))) 
+7
source share

clojure -mode for Emacs does not necessarily get all padding to the right. I say, I try to keep your lines under 80 characters and be consistent.

+2
source share

when something tries to escape from the right side, I tend to enter it after the first argument for each call. these are just indents for a fixed amount per line.

 (check-empty [] (Deck52. (apply hash-map (apply concat (remove (-> nil?) (for [[key val] suits] (if (empty? val) nil [key val]))))))) 
+1
source share

All Articles