Gauche > Archives > 2011/02/18

2011/02/18 09:39:01 UTCshiro
#
R6RSが [] を正式採用した時には拡張の余地が減ってしまったと感じたものだったが、今や (let ([v0 x0] [v1 x1] ...) e ...) とか (cond [t1 e1 ..] [t2 e2 ...] ...) といった用法にすっかり馴染んでしまったため、Common Lispを書いてるとletやcondで丸括弧が多すぎると思うようになってしまった。
#
これはダークサイドに誘われているのだろうか。そのうち {} とか <> とかにも抵抗が無くなって、Lispは丸括弧だらけで読みにくいなんて思うようになっちゃうのだろうか。
#
ところでこれ以外の括弧 (左右でペアになってる区切り) を使ってる言語ってあったっけか。m4は勝手に定義できるけれども。シェルスクリプトの case ... esac や if ... fi も広い意味では括弧?
2011/02/18 09:52:19 UTCtorus@twitter
#
Perl6 はカッコいろいろありそう。
2011/02/18 09:53:24 UTCshiro
#
確かに。Perl6には何でもありそう。
2011/02/18 10:11:18 UTCnobsun
#
まぁ.括弧の種類を増やすというのは括弧に名前をつけてるようなもんで,究極はXMLの開始タグ,終了タグのペアですよね.
2011/02/18 10:13:13 UTC(び)
#
あれは、
#
1stエレメントに名前を付けられるようにすればすむものを、筋の悪い設計したよなぁ、と思えてならないけど
2011/02/18 10:14:15 UTCshiro
#
あ、確かに > 開始タグと終了タグ。
2011/02/18 10:14:29 UTC(び)
#
でもまぁ、任意種類のカッコをサポートするとしたらあれしかないのかしら
2011/02/18 10:15:01 UTCshiro
#
入れ子構造のミスが検出できる、というメリットは一応ある
2011/02/18 10:15:24 UTC(び)
#
なるほど
2011/02/18 11:27:38 UTCnobsun
#
コッカが一種類なら入れ子ミスは「ない」ことにできますね。:) > 入れ子構造のミスが検出できる、というメリットは一応ある
2011/02/18 11:32:34 UTCshiro
#
確かにそうだ。SGMLでは開始タグと終了タグの間に大量のテキストが挟まるわけで、終了タグを見ただけで何が閉じてるのかわかるという利点は大きかっただろうと思うが、XMLは実が少なくてタグだらけになってしまったせいでかえって分かり辛くなったような。
2011/02/18 11:38:24 UTCnobsun
#
逆にSGMLでは省略可能な終了タグがあったのであまりそういうメリットはなかったかもです。
2011/02/18 11:43:52 UTCshiro
#
むぅそうか。
2011/02/18 11:49:29 UTCkoguro
#
letやcondで[]を適切に使うと読みやすくなると思うんですが、(let って入力すると手が勝手に (( を入れてしまうんで、なかなか [] が使えない。
2011/02/18 11:52:15 UTCshiro
#
quackを入れてると閉じ括弧は ')' キーだけ押してれば対応する閉じ括弧を自動的に選択してくれるんですが、その環境が無いとかなり面倒かも。標準のscheme-modeはどうだっけ。
2011/02/18 12:03:22 UTCkoguro
#
標準のscheme-modeだとないような。quack使うようにしたほうがいいのかな。ただ、閉じ括弧の入力より、いったん勢いあまって入力した開き括弧を削除するのが面倒だったりします。
2011/02/18 12:05:49 UTCshiro
#
勢いか… 開き括弧の方はもう慣れたなあ。むしろCommon Lispで (let ([ と打って、あぅ、となって戻ることがたまにある。
2011/02/18 12:16:43 UTCnobsun
#
(letとタイプしたあとにスペースをタイプすると([を挿入してくれるmodeがあれば...
2011/02/18 12:16:49 UTCkoguro
#
なんか閉じ括弧の自動選択は便利そうなので、とりあえず自前で実装してみた。
2011/02/18 12:23:21 UTCkoguro
#
閉じ括弧が ] の入力で全部できるんで、たしかに楽かも。
2011/02/18 12:32:40 UTChigepon
#
自分も [ を使う派ですね。
#
ただ let を使う場面ではだいたい let1 と書き始めてしまうことが多いかも。
#
複数になりそうならあとから let にする。
2011/02/18 12:34:50 UTCkoguro
#
私は使い分けを考えるのが面倒なので、あんまりlet1は使わないです。let1の方が簡潔なんですが。
2011/02/18 12:35:48 UTChigepon
#
たしかに面倒ですね。(let ([a 0]) とかになると let1 にしたくてうずうずしますw.
2011/02/18 12:37:17 UTCkoguro
#
let1にしたあと、またあとでletに戻すと負けた感じがするので、なかなかlet1に変更する勇気が持てない...
2011/02/18 12:38:18 UTChigepon
#
あー。分かります。
2011/02/18 12:38:28 UTCshiro
#
今思うと、自分は書いてる時間よりも読んでる時間の方が長くて、読んでる時になんとなく綺麗な方がいいのでちまちま直したりしてる。
2011/02/18 12:38:53 UTChigepon
#
それはありますね>読むとき。
#
自分も lambda -> ^ への置換を手作業でちまちまやっています。
#
手癖で lambda と書いてしまうので。
2011/02/18 12:40:04 UTCkoguro
#
この手のリファクタリング用elispって簡単に書けそうだけど、書いたあと存在を忘れてしまい使わなくなってしまうのが問題。
#
lambda -> ^ の変換は、まだあんまりなれないです。^x とかだと便利すぎなので誘惑に負けて使っていますが。
2011/02/18 12:42:31 UTCshiro
#
あるある。自分もいくつか書いて結局使ってないのがある。
2011/02/18 12:42:42 UTChigepon
#
fly-make で強調表示すれば良いのかもしれませんね。間違ってないけど短くかけるよと警告。
#
今まで : (map (lambda(user) 処理) user*)
#
^ を使う。(map (^u 処理) user*)
#
user がこっそり u になるのがポイント。(そこに抵抗がなくなる)
2011/02/18 12:54:51 UTC(び)
#
gosh> ((^c c) 1)
1
gosh> ((^ c c) 1)
(1)
#
こないだうっかりハマった(笑)
2011/02/18 12:57:08 UTCkoguro
#
font-lockで色を変えるようにしておくと、いいのかもしれませんね。
2011/02/18 12:57:56 UTCshiro
#
それは ^c を導入する時にちょっと心配だった。けど短さの誘惑に負けた。
2011/02/18 13:12:50 UTCkoguro
#
(font-lock-add-keywords 'scheme-mode '(("\\^[_a-z]?\\>" . font-lock-keyword-face)))
#
ちょっと微妙かも
2011/02/18 13:22:10 UTC齊藤
#
私も (^ _ hoge) のつもりで (^_ hoge) と書いてしまったことはあります。 なんとなく _ だととりあえず全部捨ててくれそうな気になってた。
2011/02/18 13:35:04 UTCnobsun
#
^ って(使えるの知らんかった)チャーチの原点回帰ですねぇ。
2011/02/18 13:46:15 UTCokuoku
#
(^u hoge ...)よりは(^[user] hoge ...)を使ってるなぁ。map1なら常にeみたいなルールは有るけど。
#
カッコの自動対応は良さそうだからREPLに仕込もう。。
2011/02/18 13:56:18 UTCmhayashi1120
#
@m2ym さんのこういうのありますよ。
http://dev.ariel-networks.com/Members/matsuyama/pretty-lambda-in-emacs/

(set-pretty-patterns '((?λ ("\\<\\(\\^\\)[a-z]?\\>" scheme))))
(set-pretty-patterns '((?λ ("\\<lambda\\>" lisp lisp-interaction emacs-lisp scheme))))
#
ああ、初めましてって書こうとしたんですけどリターン押したらすぐに投稿されるんですね。
2011/02/18 15:23:28 UTCleque
#
閉じ括弧の自動選択は elisp で自分用に書いたことがあるんですけど書いたまま使わずに忘れてました
#
(defun close-any-or-insert (str)
  "close any open parenthesis (character whose syntax class is `\('),
or insert `str' if there is no open parenthesis."
  (insert (or (save-excursion
                (ignore-errors
                  (up-list -1)
                  (matching-paren (char-after))))
              str)))
#
こんな感じの
#
キー割り当てを Hyper-] みたいなのではなくて思い切って ] とかにしてしまったらちゃんと使ったのかも
2011/02/18 15:28:15 UTC齊藤
#
私は全部丸括弧派です。
#
合理性を言うなら角括弧にもメリットがあるんでしょうけど、S式は丸括弧のふんわりした感じが好きで。