関数型プログラミングは、なんだか「当たり前」な感じがする

オブジェクト指向的なプログラミングでも、エレガントにやろうとすることを考えると、関数型言語の手法に似たことをやっている気がする。
逆に、学校の課題とかをとりあえず済ませちゃおうとするときに使う、「あー今すっげー汚いことやってんなー」と思ってしまうようなやり方ってのは関数型言語でもやっぱり否定されてる。


on Lispを22ページを越えて読んでる。
90%以上はぐっすり眠っていた電車の中でわずかに読んだ文章のなかに、はっとするような言葉があったので抜粋。

一般的な場合では、オブジェクトをどの関数が支配しているかではなく、どの関数呼び出しが支配しているかについて考えなければいけない。

それがどう違うねん、と読み直すこと三度。
言っている意味に思い当たって、「だからLispは歴史的にはダイナミックスコープなのか!!」と感動しました。そして逆にレキシカルスコープを理不尽に感じてしまいました。
でも、すぐあとの文でそんな勘違いは目が覚める。

だからルールはこうあるべきだ:任意の関数呼び出しが、自分だけが支配するオブジェクトを安全に書き換えられるようにする。

ん…クロージャに限らず、静的スコープで囲まれた部分で保持された変数はその次元でのみ扱うって事だろうか。考え方としてはオブジェクト指向と通じるものがある気がする。


他の言語を学ぶさいに、今まで自分が知っていた言語に当てはめて考えるのは有害なのか有益なのか。
関数型を学ぶのに手続き型の手法になんでもはめ込もうとするのは有害だと思う。手続き型をひきずっているという事だから。
でも「何かに似ている」とか「何かに通じるものがある」ならセーフだと思…いたい。理解を助けるために使ってるだけだから。
…大丈夫、きっと大丈夫…。