9

私は clojure が初めてで、主に苦労しているのは読みやすいコードを書くことです。私はしばしば以下のような関数で終わります。

(fn rep 
  ([lst n]
    (rep (rest lst)
    n
    (take n 
      (repeat (first lst)))))
  ([lst n out]
    (if
      (empty? lst)
      out
      (rep 
        (rest lst) n
        (concat out (take n 
          (repeat 
            (first lst))))))))

エンドブラケットのビルドアップがたくさんあります。これを減らす、または欠落している括弧を見つけやすくする方法でフォーマットする最良の方法は何ですか?

4

8 に答える 8

15

Emacs のpareditモード (他のいくつかのエディターでもエミュレートされています) を使用すると、一般的に、マウスによるコピー/貼り付け/構造化されていない選択を強制しない限り、一致するブラケット/ブレース/括弧および関連するインデントを数えることなく処理することを意味します。

https://github.com/technomancy/emacs-starter-kit (強くお勧めします!) を使用する Emacsでは、デフォルトで clojure に対して paredit が有効になっています。それ以外の場合は、 http://emacswiki.org/emacs/ParEditを参照してください 。

于 2012-04-10T20:17:53.600 に答える
13

ブレース マッチングをサポートするエディターを使用することに加えて、コードのネストを少なくすることもできます。あなたの関数は次のように書き直すことができると思います:

(defn rep [coll n] (mapcat (partial repeat n) coll))

もちろん、これは科学というより芸術 (工芸) ですが、いくつかの指針 (順不同) を示します。

  • トップユーザーによる4clojureの問題とその解決策(特定の問題を解決した後に表示されます)-ハンドルの下にChris Houserがいると思いますchouser
  • CH といえば - 「The Joy of Clojure」は非常に役立つ読み物です
  • clojure.core でドキュメントを閲覧 - そこには便利な関数がたくさんあります
  • ->->>スレッド化マクロは、ネストされたコードを平坦化するのに非常に役立ちます
  • stackoverflow - 世界で最も優秀で最も親切な人々の何人かがそこで質問に答えます ;-)
于 2012-04-10T20:20:46.580 に答える
7

この場合、括弧に色を付けるエディターが非常に役立ちます。たとえば、私の vim エディター ( vimclojureを使用)でのコードの外観は次のとおりです。

虹色

どのエディターを使用しているかは言わなかったので、エディターの虹色の機能を適切に見つける必要があります。

于 2012-04-10T19:48:33.033 に答える
3
(fn rep 
  ([lst n]
    (rep lst n nil))
  ([lst n acc]
    (if-let [s (seq lst)]
      (recur (rest s) n (concat acc (repeat n (first s))))
      acc)))

その方が読みやすいと思います。ご了承ください:

  • 末尾再帰の場合は recur を使用する必要があります
  • テストする必要がありますseq- http://clojure.org/lazyを参照してください
  • 繰り返しはカウントを取ることができます
  • concat は nil をドロップします。これにより、繰り返しを省くことができます
  • 開いている括弧ごとに新しい行を開始する必要はありません

括弧については、エディター/IDEがそれを処理する必要があります。私はここで盲目的に入力しているので、間違っていたら許してください...

[Rafał Dowgird のコードはより短い。私も勉強中です…】

[更新:]「遅延」リンクを読み直した後、遅延シーケンスを正しく処理していないと思います。

于 2012-04-10T20:28:53.920 に答える
3

paredit や別のエディターの同様の機能を使用することがどれほど価値があるかを十分に強調することはできません。これにより、括弧を気にする必要がまったくなくなります。括弧は常に完全に一致し、「に変更」などの退屈でエラーが発生しやすい編集タスク(foo (bar x) y)(foo (bar x y))1 回のキーストロークになります。1 週間ほど、paredit は手動で行うことができないため、信じられないほどイライラさせられますが、括弧を自動的に処理する方法を習得すると、元に戻すことはできなくなります。

私は最近誰かが言うのを聞いたが、それはほぼ正確だと思う. paredit なしで Lisp を書くことは、オートコンプリートなしで Java を書くようなものだ.

于 2012-04-10T20:37:18.803 に答える
2

すべてのブラケットを回避できるかどうかはわかりません。しかし、私が Lispers が行うのを見たのは、括弧のマッチング/ハイライトと、おそらくレインボー ブラケットを備えたエディターを使用することです: http://emacs-fu.blogspot.com/2011/05/toward-balanced-and-colorful-delimiters. html

率直に言って、これらは非 Lisp エディタにとっても役立つ種類の機能です:)

于 2012-04-10T19:44:15.617 に答える
1

好きなようにフォーマットしてください。読者が好むスタイルでコードを表示するのは編集者の仕事です。私は、独自の行に単一の角かっこが付いたCスタイルの階層ツリー型フォーマットが好きです(すべてのLISPerはその時に怒り狂います:-)))))))))))))))

しかし、私は時々このスタイルを使用します:

  (fn rep 
  ([lst n]
    (rep (rest lst)
    n
    (take n 
      (repeat (first lst)) )  )   )    )

これは、角かっこが間隔を空けて配置される従来のスタイルの更新です(log2ブランチレベル)

宇宙が好きな理由は、視力が悪く、濃い文章が読めないからです。だから、私が言う伝統的な方法で物事を行うように私に言わせようとしている怒っているLISPerには、まあ、誰もが独自の方法を持っています、リラックスしてください、それは大丈夫です。

しかし、誰かがClojureでまともなエディターを書くのを待つことはできません。それはテキストエディターではなくエディター**であり、フォーマットの問題はなくなります。自分で書いていますが、時間がかかります。アイデアは、式に関数を適用して式を編集することです。私は、単語、文字、行ではなく、式ごとにジッパーでコードをナビゲートします。コードは、必要な表示機能で表されます。

**はい、emacs / pareditがあることは知っていますが、emacsを試してみましたが、申し訳ありませんでした。

于 2012-04-11T00:31:13.080 に答える
1

少なくとも 75% の使用済み材料から作られた 100% リサイクルされた閉じ括弧を常に使用してください。そうすれば、そんなにたくさん使うことにそれほど気分を害する必要はありません。

于 2012-04-10T22:36:27.430 に答える