Lisp プログラマの考え方がわからない
リストの 2 番目の要素がほしい場合、C プログラマならインデックスでアクセスするんだけど、Scheme にはそんな便利?な機能はないので、
- cdr で先頭を除いたリストを取得し
- car でその先頭を取得する
という風に考えるんだと思うんだけど、たとえばリスト l を対象にすると
(cdr l)
まで書いて、
(car (cdr l))
と書く感じになり、考えた順番とコードの順番が異なるので、コーディングがとても面倒くさいと思うんだけど、どうなんだろうか。
Haskell も考え方は大体同じで
head $ tail l
という風に思考とコードが逆になるんだけど、Haskell の場合は
tail l >>= head
という感じでモナドを使用して思考順序通りにコードが書ける(ただし、これが Haskell 的によいコードなのかどうかはよくわからない)。
Lisper/Schemer は
- リストの要素を得るには car でしょ
- リストのどこを得たいのかはあとで
という風に考えるのだろうかね。
評価は内側の括弧から行われるので、手続き的に考えると、カーソルを戻りつつコードを書かなきゃならないから、考え方を変える(手続き的ではなく、宣言的に考える)必要があるんだろうな。