2012-04-10 7 views
8

私はclojureには新しく、私が苦労している主なことは読みやすいコードを書くことです。私はしばしば以下のような機能に終わります。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)))))))) 

エンドブラケットのビルドアップがたくさんあります。これを減らすか、括弧を紛失しやすいように書式を設定する最良の方法は何ですか?

+1

これは 'Lisp-anese'です。ブラケットのマッチングに役立つまともなエディタを使用することは、一つの道です。 –

+1

あなたはいつも一括弧を自分の行に置いて、開き括弧(C#またはJavaの標準中括弧構文のように)を並べることができます。しかし、いくつかのハードコアLispersはあなたに暴力を発するかもしれません:) –

+7

私は2年間だけlispを使用しているにもかかわらず、私は "ハードコアlisper"として踏み入れるだろうと思います。自分の行に括弧を付けることは、フォーマットの枢機卿の罪のようなものです。悪い選択肢はありません。 Lispの多くの方言は、C言語のように読みやすく、聖戦を刺激する多くのスタイルを持っているのとは異なり、(多かれ少なかれ)単一のコーディングスタイルに収まっています。あなたがそれを掛けていないという理由だけで、標準的なスタイルを放棄しないでください。 – amalloy

答えて

7

この場合、カッコを色付けするエディタは非常に便利です。たとえば、ここにあなたのコードは、(vimclojureを使用して)私のvimエディタに見えるものです:

Rainbow colors

あなたが使用しているエディタを言いませんでしたので、あなたはあなたのための虹着色機能を見つける必要があります適切に編集してください。

+0

emacsのためにこの質問を参照してください:http://stackoverflow.com/questions/2413047/how-do-i-get-rainbow-parentheses-in-emacs –

+0

私はしばらくの間、emacsで虹の括弧を使用しました。私はもはやあなたが実際にマニュアル/精神的な括弧のマッチングを行うことを奨励すると考えているので、私はもはやそれをしません。しかし、私は虹のparens *見て*かなり涼しいので、あなたがそれをやっている場合は、私は本当に議論することはできません告白。 – amalloy

+0

@amalloy:* paredit *と* rainbow-parens *を同時に使用できますか? – TacticalCoder

2

すべての括弧を避けることはできません。率直に言ってhttp://emacs-fu.blogspot.com/2011/05/toward-balanced-and-colorful-delimiters.html

、これらはあまりにも非Lispの編集者のために:)

有用であろう機能の種類は次のとおりです。しかし、私が見てきたものLispersはやる括弧のマッチング/ハイライトでエディタと多分虹のブラケットを使用しています
15

Emacsのpareditモード(いくつかの他のエディタでもエミュレートされています)を使用すると、マウス/強制非構造選択でコピー/ペーストしない限り、大括弧/中括弧と関連するインデントカウントは必要ありません。

https://github.com/technomancy/emacs-starter-kitのEmacs(強くお勧めします)は、デフォルトでクローズ機能が有効になっています。それ以外の場合は、http://emacswiki.org/emacs/ParEdit

+0

+1のための+1。私はそれなしでは生きられない! – Gert

+1

私がemacsを使い始めたときに私はpareditを持っていました。しかし、一度それが私のためにやっていたことを理解すると、(http://www.emacswiki.org/emacs/PareditCheatsheet)私はそれなしでは生きられません。 –

+0

私はvimのユーザーであるので私は他の答えを選択しましたが、pareditのために+1 –

13

を参照してください。ブレースマッチングをサポートするエディタに加えて、コードのネストを少なくすることもできます。この科学よりも芸術(工芸)の詳細ですが、(ランダムな順序で)いくつかのポインタもちろん

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

:私はあなたの関数のように書き換えることができることを信じている4clojure

  • 問題とトップユーザー(特定の問題を解決した後、目に見える)ことにより、自社のソリューション - 私はクリス・ハウスは、CHのchouser
  • いえばハンドルの下にあることを信じて - 「のClojureの喜びは」非常に便利ですがClojureの上
  • 閲覧のドキュメントをお読みください。 c鉱石 -
  • ;-)明るいと最も有用な人々のいくつかを世界回答の質問であり - そこに便利な機能がたくさんある
  • ->->>スレッドマクロは
  • stackoverflowのネストされたコードを平坦化するための非常に便利ですより読みやすいです
+0

ヒントをありがとう!私は4回の問題を可能な限り数回、少なくとも1回は再帰で、少なくとも1回は外して解決してきました。これは大括弧で囲まれた単なる例でした。上記のあなたのヒントは間違いなく非常に便利でしょう。 –

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

、私は思います。次の点に注意してくださいあなたが使用する必要があります

  • 尾が
  • を再帰するときにseqでテストする必要が再発 - http://clojure.org/lazy
  • 繰り返しカウント
  • 連結は自分で
  • を繰り返し保存しnilを、ドロップされます取ることができます参照してください開いているすべてのparenのために新しい行を始める必要はありません

あなたの編集者r/ideはそれを処理する必要があります。私は[ラファウDowgirdのコードが短くなって...それは間違っている場合ので、私を許し、ここ

をブラインド入力しています。 i]は...あまりにも学んでいます

[更新:]「怠惰」リンクを再読み込みした後、私は、私が間違って怠惰なシーケンスを処理してきたと思います

+0

ヒントをお寄せいただきありがとうございます。 –

3
私は強く十分にそれがどのように貴重なエコーすることはできません

pareditなどの別のエディタで同様の機能を使用します。完全に自分自身に合っていて、「(foo (bar x) y)(foo (bar x y))に変更する」というエラーが起こりやすい編集作業は、一回のキーストロークになります。一週間かそこらの間、あなたは手作業からあなたを妨げるので信念を超えてあなたを挫折させますが、括弧を自動的に処理する方法を学ぶと、戻れなくなります。

私は最近、誰かが言うのを聞いた、と私はそれがpareditなしのLispを書くことはオートコンプリート(可能性が、非常に快適ではない)なしでJavaを書くようなものであることを、大体正確だと思います。

1

常に少なくとも75%のポストコンシューマー材料から作られた100%リサイクル閉括弧を使用します。あなたはとても多くのことを使うことについてとても気にする必要はありません。

1

好きなようにフォーマットします。読者が好むスタイルでコードを表示するのは編集者の仕事です。私はCスタイルの階層的なツリー形の書式が好きです.LISPのすべてがそれに怒りを浮かべています:-))))))))))))))))))))))

このスタイルを使用します。ブラケットは間隔を置いて配置されている伝統的なスタイルの更新(LOG2支店レベル)

私は宇宙が好きな理由は、私の視力が悪いということであると私は単純に読むことができないのである

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

密なテキスト。ですから、私が伝える伝統的なやり方を私に伝えようとしている怒っているLISPersには、誰もが自分のやり方を持っています。リラックスしても大丈夫です。

テキストエディタではなく、の式エディタ**であるClojureでまともなエディタを書くのを待つことができないので、フォーマットの問題はなくなります。私は自分自身を書いていますが、時間がかかります。その考え方は、関数を関数に適用することによって式を編集することであり、単語や文字や線ではなく、式ごとのジッパーでコードをナビゲートします。コードは、あなたが望むどんな表示機能でも表されます。

**はい、私は、Emacs/pareditがあります知っているが、私は、Emacsを試してみましたが、それは申し訳ありませんが好きではなかったです。

+1

コードを誰とも共有しない限り、問題はありません。しかし、通常は私たちのコードに協力して、このような難解なフォーマットが大きな問題になります。 –

+0

はい、それは私の指摘です - フォーマットがアルゴリズム的に行われた場合、それは問題ではありません。コードは1つの構造体であり、書式設定は別のものであり、誰もが自分のものを見る方法を持っています。これは良いことです。ある人にとって論理的に見えるものは、他の人には恐ろしいものに見えます。宗教を書式設定する唯一の理由は、昔ながらのテキストエディタを使ってコードを表示していることです。実際には適切なツールでコードを可視化する必要があります。 – Hendekagon

+0

私の論文はまさにこのテーマでしたので、間違った理由をすべて理解する時間がありました。私は、テキストファイルは宇宙飛行の何かだと思ったが、私はもはやそれを考えていない。 –

関連する問題