38

Clojure/LISP 構文に関する別の質問に時間を割いてコメントしてくれた人の 1 人が、標準的な LISP の方法でサンプル コードを書いていないことを指摘しました。それで、彼は親切にもコード スニペットを書き直してくれました。それは大きな助けになります。しかし、それは私の心に別の疑問を引き起こしました。なぜこれは:

(if (= a something)
  (if (= b otherthing)
    (foo)))

これは標準の LISP フォーマットであり、次の形式よりも優先されます。

(if (= a something)
  (if (= b otherthing)
    (foo)
  )
)

これは、私の C++ 開発経験から、このコードを素朴にフォーマットした方法です。後者のフォーマットに利点があるのか​​ 、それとも定着した標準(QWERTYキーボードなど)なのか疑問に思っています。私は議論をしようとしているわけではありません.なぜ最初の形式が望ましいのか理解するのが難しいだけです. 2 番目の形式は、コード構造をより簡単に確認するのに役立ちます。

4

5 に答える 5

40

インデントのレベルから同じ情報を取得できるため、余分な行の閉じ括弧はコードの構造を確認するのに実際には役立ちません。ただし、2 番目の形式はほぼ 2 倍の行数を占めるため、コードを読むときに頻繁にスクロールする必要があります。

また、ネストされた括弧をより詳しく調べる必要がある場合は、一致する括弧を強調表示するエディターが役立ちます。これは、対応する括弧が離れすぎていない場合にも簡単になります。

式が長すぎて複雑になりすぎて簡単に読めない場合は、機能の一部を別の関数に抽出する必要があることを示している可能性もあります。

于 2009-02-12T14:35:52.353 に答える
37

Lisp コードがインデントされる方法は、Python の重要な空白に似ていますが、もちろんオプションです。基本的な経験則では、項目が同じ行にない場合は、リスト内の項目を縦に並べて配置します。

(a (b (c (d e)
         (f g))
      (h i j))
   (k l m n))

括弧を見なくても、(d e)とが(f g)のパラメータでありc(c (d e) (f g))(h i j)が のパラメータでbあり、(b (c (d e) (f g)) (h i j))とが のパラメータであることがわかり(k l m n)ますa

あなたの例では、次のようにより正しくフォーマットする必要があります。

(if (= a something)
    (if (= b otherthing)
        (foo)))

    ^   ^
  notice how they line up

インデントのレベルが意味を持つようになったので、その情報を取得するために括弧のバランスを取ることに頼る必要がなくなりました。括弧を閉じステートメントと同じ行に置く方がコンパクトであるため、それが Lispers のすることです。確かに、Lisp コードをこのようにフォーマットする必要はありませんが、人々が使用し、信頼できるかなり標準的な規則です。

于 2009-02-12T14:24:03.083 に答える
3

簡単な答えは、あなたのやり方は Lisp の pretty-printer のやり方とは違うということです。1 つの TRUE FORMAT を持つことはコードにとって常に良いことであり、pprint マクロは言語に組み込まれたその形式を提供します。

もちろん、 pprint マクロが存在するため、標準のコード形式に従う必要はありません。ユーザーは pprint を介してコードを実行するだけで、慣れ親しんだものを取得できるからです。ただし、他のすべての人は pprint を使用するか、手動で概算するため、同じようにしないとコードを読むのに苦労し、コードを好みのコードに変換する簡単なマクロがありません。フォーマット。

于 2009-02-23T15:55:17.380 に答える
1

パッケージ Sreafctor: Homepageを使用して Lisp コードを再フォーマットできます。

いくつかのデモ:

利用可能なコマンド:

  • srefactor-lisp-format-buffer: バッファ全体をフォーマット
  • srefactor-lisp-format-defun: 現在の defun カーソルのフォーマット
  • srefactor-lisp-format-sexp: 現在の sexp カーソルのフォーマット。
  • srefactor-lisp-one-line: 同じレベルの現在の SENSP を 1 行にします。前置引数を指定すると、すべての内部 SEX を再帰的に 1 行に変換します。

書式設定コマンドは、Common Lisp と Scheme でも使用できます。

問題がある場合は、問題レポートを送信してください。喜んで修正いたします。

于 2015-04-08T10:12:02.510 に答える
0

閉じる括弧が 10 個あると、非常に扱いにくくなります。

私が Lisp をプログラミングしていたとき、次のように、数えやすくするために、同じ行の開き括弧と残りの閉じ括弧の間にスペースを残しました。

(if (= 何か)
  (if (= b その他)
    (ふー)))

編集者の方が便利なので、最近は必要なくなったと思います。

于 2009-02-12T14:20:58.287 に答える