Lisp のコメント記法について
最近 Lisp の勉強を再開したのですが、
Emacs で Scheme をやっていると、次のようなことに気づきました。
- Emacs のフォーマッタは閉じカッコが一行につき一個になるまでフォーマットしてくれない
- どうも Lisper の間では、閉じカッコを最後の行にまとめる書き方が好まれるらしい
-
;
一つのコメントが右寄せされる
スタイルはともかく、勝手にコメントが右寄せされるのは困ります。
調べてみると、 Lisp ではインデントレベルを;
の数で表現する作法のあることがわかりました。
;
一つのコメントは行の最後に書かれる形式だそうです。
これでコメントを右寄せするメリットがわかりました、左寄せするとコメント間が遠くなり見にくくなるからでしょう。
インデントレベルと役割
Lisp にはまだ docstring や範囲コメント #||#
がありますが、ここでは無視します。
レベル | 見た目 | 役割 |
---|---|---|
1 | ; | 行についてのコメント、行の最後に書かれる |
2 | ;; | 直後の小さなブロックについてのコメント |
3 | ;;; | コメントに続く大きなブロックについてのコメント、左端に揃える |
4 | ;;;; | ファイル全体あるいは大部分についてのコメント、左端に揃える |
例:クイックソート
例示のため、コメント行を極端に多くしました。
また、リンク先の記述によるとコメントの始まりを縦に揃えることを推奨していますが、
日本語だとフォントの問題で文字の幅が揃わずガタガタになり見苦しくなるため、コメント行の幅を揃えてません。
;;;; ソートの実装
;;; クイックソート
;;; (リストを昇順にソートする再帰アルゴリズム)
;; quicksort: リストをクイックソートで昇順にソートする
;; lst: ソート対象のリスト
;; 戻り値: ソート済みリスト
(define (quicksort lst)
(if (null? lst)
'(); 空リストならそのまま返す
(let* ((pivot (car lst)); 先頭の要素をピボットにする
(rest (cdr lst)); 残りのリスト
(smaller (filter (lambda (x) (< x pivot)) rest)); ピボットより小さい要素のリスト
(greater (filter (lambda (x) (>= x pivot)) rest))) ; ピボット以上の要素のリスト
(append (quicksort smaller); smaller の再帰呼び出しでソート
(list pivot); ピボットをリストに変換して結合
(quicksort greater))))) ; greater の再帰呼び出しでソート
;;; 使用例
;; `(quicksort '(3 1 4 1 5 9 2 6 5 3 5))`
;; => `(1 1 2 3 3 4 5 5 5 6 9)`
(quicksort '(3 1 4 1 5 9 2 6 5 3 5))
感想
- 全体的に Python を連想させる
-
lambda
の記法ってもともとはこんなだったのかと感心 -
;;;;
でファイル単位のコメントをする作法、Pylint で最初の行に docstrings を書くルールを思い出した - 慣れるとカッコを見ずにインデントだけを見るようになる。じゃあ、カッコなしでいいんじゃないかと思った
- さらに慣れて無意識に閉じカッコを書くようになると気にならなくなるんでしょうね
-