Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coding style 一般来说,如何知道何时在Clojure/Lisp中换行?_Coding Style_Clojure_Newline - Fatal编程技术网

Coding style 一般来说,如何知道何时在Clojure/Lisp中换行?

Coding style 一般来说,如何知道何时在Clojure/Lisp中换行?,coding-style,clojure,newline,Coding Style,Clojure,Newline,下面是一些示例代码: (deftype Deck52 [suits] :as this DeckOfCards (check-empty [] (Deck52. (apply hash-map (apply concat (remove (-> nil?) (for [[key val]

下面是一些示例代码:

(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)))))
如果更容易阅读,我也在这里的摘要中发布了这段代码:(不去任何地方)

这里的主要示例是
检查为空
。我很难知道我应该在哪里打回击,不应该在哪里打回击,我仍然不知道我是否打对了。它可能会从屏幕的右侧消失,但clojure模式就是这样缩进的,我想应该是这样的

所以,问题是,什么时候在Clojure/Lisp代码中换行?我是在做仪式吗


注意:我不能保证我发布的代码是有效的。我一直在做一些实验,有些东西如果没有坏的话,可能会很糟糕。

当东西试图从右手边逃走时,我倾向于在第一次之后进入 每个调用的参数。每行仅按固定数量缩进

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

你打破界限的方式很正常。不过我会做一些小的改变

  • 将参数向量放在下一行
  • 使用不同的形式:小的
    ->
    ->
    助手、condp、when、
  • 如有必要,请在函数名后立即断开该行
这是我该怎么做的。(免责声明:我的风格。你的可能不同。YMMV!)

虽然以下不是你问题的一部分,但我无法抗拒:

(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))))

Emacs的clojure模式不一定能获得所有的缩进。我建议您尽量将行数控制在80个字符以下并保持一致。

您的代码中嵌入了制表符,这就是为什么代码块中的格式混乱的原因。我已经修好了,怎么会这样?我只是喜欢发现我的代码很烂。谢谢你的回答。您向我展示了一些我不知道的东西,并无意中教会了我如何使用->和->>:(你是不是碰巧上了Clojure IRC?如果是的话,你的名字是什么?好吧。你的代码不烂。只是冗长。我想这很正常。我——就我而言——总是忘记
zipmap
。我在#Clojure as
kotarak
。通常在CET时间晚上9点到10点左右(我想是GMT+1h).不,这很糟糕,但谢谢你让我感觉好一点。我想,通过->和->>,我可以避免过去犯下如此明显的错误。这个问题和答案显示了一个非常有趣的过程。即使不仔细阅读代码,你也可以看到对语言设施的熟悉程度在逐步提高谢谢你们的提问和回答。
(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))))