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

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

koguroさんのとこで出た話題


コーディングスタイル

みなさんどんな風に Scheme のソースを書かれているのでしょうか。 他の人のソースを参考にしているのですが、どこかに明文化されたものがあるとうれしいです。(C みたいに K&R とか whitesmith とかいろいろ流派があるのでしょうか)

とりあえず、バリエーションが出る要素を上げていってみましょ。Shiro

関連:Lisp:コメント

ifのbegin

もしC言語でif (...) { を if (...) (begin と書けといわれたらうんざりするでしょう。 C言語のswitch文にbreak;を書いているような気分になります。(gemma): 2006/06/14 19:50:42 PDT

括弧の位置

閉じ括弧の位置ですが、私は「(baz) こそがこの関数の戻り値」と考えるときは前者、「func とは単に処理を繋げたもの」と思っているときは後者を使います。 (koguro)

(define (func)
    (foo)
    (bar)
    (baz))
(define (func)
    (foo)
    (bar)
    (baz)
    )

Shiro: 戻り値の有無で意識したことはないです。 むしろ(baz)の後に頻繁に追加や削除がありそうな時は後者のようにしています。

let式

bindingが短いとこう書きたくなる:

(let ((a b) (c d) (e f))
  ...
  ...)

逆にbindingが長い時は、bindingの終りを明示するために閉じ括弧だけ 一つの行に置いたりします。

(let ((a loooooooooooooooooooooooooooooooong-expression)
      (b (loooong-expression
           (and loooong-argument-list
                loooooong-argument-list
                lo--------ng----argum--ent---list)))
      (c (further long
                  exp-
                  ression))
      )  ;;←コレ
  ...
  ...)

if式

EmacsのScheme-mode標準だとこう:

 (if test
     then
     else)

Lisperはこう書く人もいる。 else節以降が implicit prognになる処理系もあるので、else の下にどんどん 続けるには適している。

 (if test
     then
   else)

ifのネストが深くなるときは、こんな風に書きたくなることも。

 (if test
   then
   else)

(if test then else)のthenが短くelseが長い時に、 thentestの後ろに書くのを見たことがある。コンパクトにはなるが、 個人的には条件をぱっと見た時にわかりにくいのでいまいち好きじゃない。Shiro

 (if (test-expr) r
   (let ((x y) (z q))
     (foo)
     (bar)
     (loop (cons x r))))

わたしは常にこれかも。ささだ

 (if (null? x) y
     (else-nantoka...))

関数定義

関数定義を

(define (foo arg)
  (hoge huga ...))

と書くか

(define foo
  (lambda (arg)
    (hoge huga ... )))

と書くか。

私は現在完全に前者。 そっちの方が自分で分りやすいからだけど、scheme 本を読み比べると 結構ポリシーがあるのか後者に執着するケースも見られる。 で、個人的には後者を書く方がなぜかカッコいいと思ってたりする。(錯覚?)cut-sea:2004/03/03 22:19:31 PST

関数のサイズ

Scheme/Lisp で、一関数当たりの行数(もっと妥当な言葉があるかも)はどれくらいが望ましいでしょうか? わたしはどの言語でも50行程度を上限だと思っていますが、Scheme はまだ入門者で分かりません。 何か意識のしどころが違ったりしますか?


編集環境

括弧を書くタイミング

MIT OPEN COURCE WARE から LECTURE NOTE を引っ張って呼んでますが、 emacs 上で S式を書く時のタイピングをそのまま記載している文面を見ました。

(define (f x) C-j (lambda (x) C-j ...

みたいな感じなのですが、皆さんも頭から順に書かれるのでしょうか? どうも私は () を書いてから戻って中を書くくせがあります。 でもそれで書きやすいか?と言われると結構書きにくいので、 みんなどうやって書いているのかなぁと思ってました。 emacs 上で、上記の様な書き方になれるのが結構書きやすいものなのでしょうか。。。 個人差があろうかとも思いますけど、普段他の人が S 式を書いているところをライブで みたことがないので色々聞いてみたかったりして。cut-sea:2003/09/10 09:58:42 PDT

emacsのキーバインディング

emacs 上では S 式単位での移動や入れ換えなんかも簡単にできるようになってますけど、 デフォルトでは M-C-t とか M-C-F など、メタキーとコントロールキーを押す操作が 入りますよね。 ESC, Ctrl+t というタイピングも押しにくいのですが、 Ctrl+Alt+t ってのも 結構押しにくい。。。と感じるのです。 さて、皆さんはどうやって押してます? もしくはキーバインドを変更してますか?cut-sea:2003/09/10 09:58:42 PDT

わたしは未だに式単位でなくてC-f, C-n などでちまちまカーソルを動かす悪い癖があるのですが、 なかなか克服できません…

括弧挿入のキーバインド

括弧の対を挿入するEmacs のコマンド M-( または M-x insert-parentheses は, 括弧がキーボードの上段にあることもあり,押しづらいという方もいると思います. 自分が押しやすいキーに変えるといいのかもしれませんが,ここでは,その一例を挙げてみます.

(global-set-key [?\C-\S-d] 'insert-parentheses)   ; "d" for down
(global-set-key [?\C-\S-f] 'insert-parentheses-1) ; "f" for forward

(defun insert-parentheses-1 ()
  "カーソルの直後の式を括弧で囲む."
  (interactive)
  (insert-parentheses 1))

全角の「\」を 1 バイトのバックスラッシュに読み替えてください.

両括弧の対応を見るために show-paren-mode がオンでないと, 上で指摘されているとおり,どのレベルにカーソルがあるのか分からなくなりかねません.


全体的なコメントはこちら

Shiro (2003/01/06 21:09:44 PST): コンパクトな方が見やすいので、ロジックの流れを追える範囲で なるべく上下方向に詰めるように書いてます。 ただ、ネストが深くなった時に最後の式の後ろに閉じ括弧を並べるのは あまり好きではなく、そういう時は括弧の対応が取りやすいように 適宜行を変えています (大きなletやcondを単位として)。 Cで得た習慣かな。Lisperの中には最後の閉じ括弧の連続を 全然気にしない人もいるようで(スーパー括弧なんてのもありましたね)。

More ...