- ベストアンサー
LISP/Schemeで括弧対応を直感的に掴む方法
本でSchemeを勉強しはじめたのですが、括弧が深くなってくると、ブロックの終わりがパッとわかりません。 LISPer/Schemerの皆さんは、紙に書いてあるコードのどこからどこまでがブロックなのか、パッとわかるのでしょうか。 私は括弧を数えないとわからないし、よく間違えるので、今はエディタに書き起こして、括弧対応を調べていますが、どうやったらパッとわかるようになるのでしょうか。あるいは、そもそもエディタ無しではパッとわからないものなのでしょうか。わかるようになるためのコツがあれば教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
>紙に書いてあるコードのどこからどこまでがブロックなのか、パッとわかるのでしょうか。 分かんないんじゃないでしょうか(笑)? ポール・グレアムと言うLispハッカーが仰ってましたが、コードは「括弧で」読んでるんじゃなくって「インデントで」読んでると思います。 例えば、 (define (integrate func a b n) (let ((h (/ (- b a) n))) (let loop ((i 1) (s (/ (+ (func a) (func b)) 2))) (if (= i n) (* h s) (loop (+ i 1) (+ s (func (+ a (* i h))))))))) なんてあった場合は define (integrate func a b n) let h = (b-a)/n let loop(i=1) (s=((func a)+(func b))/2 if i=n h*s loop (i+1) (s=(func (a+(i*h)))) みたいに「括弧を外して」「インデント中心で」脳内変換して読んでいると思います。(教えてgooだとインデント付けられないので苦しいのですが) ポール・グレアムも「インデント無しで一行で書かれたLispコードを読むのは不可能だ」と仰っていました。 >どうやったらパッとわかるようになるのでしょうか。 本でもそうですが「インデントで」読んでいくしかないと思います。 (逆に言うと、インデントの付け方がヘタクソな本でしたら読むのは難しいでしょう。) >そもそもエディタ無しではパッとわからないものなのでしょうか。 それが解答と言えば解答になるやもしれません。 Emacsとかでしたら「括弧の対応」が比較的楽なんで(対応している括弧同士を光らせたり色を薄くすることが出来る)、そう言う機能が無いとLisp系でコードを書く/読むのは難しいと思いますよ。 大体、僕の経験ですと、「Lispの出版物」の校正がまた大変みたいで(笑)、括弧の数が間違えたまま出版されていて、その本の通りにソースを入力しても動かない事がままありました(笑)。また、適切なエディタ無しで「Lispインタプリタ上に」コード入力すると、大体動きませんね(笑)。まず確実に「括弧の付け方」を間違えるから、です(笑)。エディタ無しではLisp/Schemeは難しいです。Pythonもエディタ無しでは難しいですけど、Lisp/Schemeではそれ以上に難しいです。 ええと、Emacsの編集で「Lispの括弧をどうするか?(光らせたり薄くしたりする)」説明しているサイトがありました。それを参考にすれば「意識的に括弧を頭から追い出す」練習ができると思います。どの道「インデントで」読むんですから、括弧は「目立たせない」方が良いでしょう。その方が「Lisp慣れ」が早いとは思います。
- 参考URL:
- http://0xcc.net/unimag/10/
お礼
cametan_42さん、 早速の丁寧な解説、ありがとうございます。 Lispハッカーでもやっぱりインデント無いと厳しいんですね。 自分としては、かなり安心し勇気づけられました。 ↓のtree->generatorのあたりで、call/ccの概念に加え、括弧対応がわかんなくなって、何か理解するための才能に書けてるのだろうか?と悩んで挫折しかけていました… http://download.plt-scheme.org/doc/205/html/t-y-scheme/t-y-scheme-Z-H-15.html#node_sec_13.3 エディタ片手にがんばって、インデントの慣用にも慣れたいと思います。ありがとうございました。