Lisp プログラマの考え方がわからない

リストの 2 番目の要素がほしい場合、C プログラマならインデックスでアクセスするんだけど、Scheme にはそんな便利?な機能はないので、

  1. cdr で先頭を除いたリストを取得し
  2. car でその先頭を取得する

という風に考えるんだと思うんだけど、たとえばリスト l を対象にすると

(cdr l)

まで書いて、

(car (cdr l))

と書く感じになり、考えた順番とコードの順番が異なるので、コーディングがとても面倒くさいと思うんだけど、どうなんだろうか。

Haskell も考え方は大体同じで

head $ tail l

という風に思考とコードが逆になるんだけど、Haskell の場合は

tail l >>= head

という感じでモナドを使用して思考順序通りにコードが書ける(ただし、これが Haskell 的によいコードなのかどうかはよくわからない)。

Lisper/Schemer は

  1. リストの要素を得るには car でしょ
  2. リストのどこを得たいのかはあとで

という風に考えるのだろうかね。

評価は内側の括弧から行われるので、手続き的に考えると、カーソルを戻りつつコードを書かなきゃならないから、考え方を変える(手続き的ではなく、宣言的に考える)必要があるんだろうな。