Lisp:コメント

Lisp:コメント

さんのとこから。

Lisp/Scheme な人へ(もしかして嫌な)質問。

Shiro: とりあえず私の知るところをまとめてみます。

関連:Scheme:コーディングスタイル

Lispシステムとコードドキュメントシステム

もともとLispシステムではオンラインドキュメント機能が発達していました。 Emacs Lispやった方はご存知でしょうが

  (defun foo (args)
    "FOO takes ARGS and do such and such calculation blah blah blah"
    ...)

みたいに関数中にドキュメントを埋め込んで、さらにそれをインタラクティブに 参照できるという。 CommonLispでは徹底していて、関数のみならずstructureやオブジェクト等 いろんなものにdocumentationがつけられるようになっています。

また、次のようなコメントの慣習もありますね。

;;;; ファイル全体に対するコメント

;;; いくつかの関数グループに対するコメント

(defun foo (args)
  (let ((a 0) (b 1))
    ;; 関数内コードブロックに対するコメント
    (apply #'+ a b args)    ; 一つの式に対するコメント
  ))

こういうコメント書法がエディタレベルでサポートされているということは、 コメントを書くことは確かに推奨されることであったのでしょう。

Shiroの以前のボスはSymbolicsにいたことがあるんですが、 彼の使っていたシステムではエディタがコメントのネスティングレベルだか 何だかに応じて違うフォントを使うようになっていたとかで (ネスティングが深くなるほど小さな字になったりする)、 ある時、同僚とあるアルゴリズムに関して議論になり、 お互いに相手への反論をコメントに書いてチェックインを繰り返して コメントがすごいことになったとかなんとか。(小さな字でぐちゃぐちゃと)

Lispハッカーの習慣

で、現実のLispプログラマはどうかというと、 私の印象ではものすごくコメントを書く人と、 潔いくらいさっぱりコメントを書かない人に極端に分かれるような気がします。

以前一緒に仕事をしたLispハッカーの先生は ほぼコメント無しのソースを渡してくれたんですが、 ほとんどの関数が10〜20行以内に収まっていて、関数間の関係さえわかれば 理解しやすいソースでした。だから「ソースが究極のドキュメントなり」を 実践しているのかも。

「細かい関数がたくさん」に関しては、CommonLispの場合 パッケージからエクスポートする関数だけに詳細なドキュメントをつけている場合も 見られますね。

Schemeでは公式なモジュールシステムが無いせいか、細かい関数は 関数内関数でやる場合も多いようで、そうなると外から見える大きな単位で コメントがついているのをよく見ます。


私の場合、EmacsLispならdescribe-functionの為のコメントはかなり書きます。 やっつけの時は書かない事もあるけど、 しばらく使い続けるつもりなら、 拡張する気がなくてもコメントは書く。

そのかわり、describe-functionで出ないような、 普通の言語でのコメントはあまり書かないかなぁ。

Schemeの時はあんまし書いてない。 関数内関数にコメント書いた事はたぶん無いし、 トップレベルの関数でもあまりコメントは書かない。

ちなみにCもあまりコメントは書かない。私があまりコメントを読まないので。

やはり書いたコメントが使いやすく無いと書かない気がする。 javadoc位じゃ書く気がかけらも起きない--有野

かつての同僚(この人は、熟練したプロのプログラマですた)と、C言語で仕事を したときは、「まず処理内容をざくっとコメントとして書くんだ。で、そのあと その内容をコードに書き下すといいよ。」と教えてくれました。 なるほど、このようにすると自然にプログラムが構造化されて、 関数の分割単位も非常にリーズナブルなものになるなと感心したことがあります。 以来私も、……他人が読む可能性のあるコードを書くときはそのように しています(汗)。 ただ、CとLisp/Schemeじゃあちょっと条件というか効果が 異なる気がしますね。-- ふじさわ

Haskellには "literate comment" というのがあって、(という話WiLiKiのどこかでしたっけ) ファイルの拡張子を.lhs (通常は.hs)としたソースコードファイルでは、行頭を'>' ではじめるか、 プログラムのコード部分を\begin{code}、\end{code}でかこむとコンパイラやインタープリタが その部分のみプログラムのコードとして看倣してくれます。これは言語仕様書のAppendix Cで規定? されています。書いたものをプリプロセッサにかける必要もなく、Haskell のプログラムコードで あると同時にLaTeXのテキストあるいはHTMLのテキストとしてあつかうことができます。 http://www.sampou.org/haskell/smallpuzzle/polyomino/Main.lhs はその例です。 Gauche のインタープリタにもそんな機能があるといいかも。(^-^) --nobsun

More ...