💡

Lispは関数型言語か?

に公開

この記事は、
https://tadsan.fanbox.cc/posts/10062198?utm_campaign=manage_post_page&utm_medium=share&utm_source=twitter
氏から触発されて書いたものだ。ただ、この内容の批判や反応ではなく単に僕の思考をつらつらと書く。

ちなみに、タイトルと内容が乖離しているが、タイトルを一番最初においてそこから、好き勝手に書いたものなので、悪しからず

どうでもいい

Lispは関数型言語かどうかなんて、私にはどうでもいい。どっちであれLispはすばらしいプログラミング言語であることは変わりない。

とここで終わってもいいのだが、ちょっと私の考えを整理するために、関数型言語周りの個人的な意見を整理したいと思う。

関数型言語かどうかより、良いプログラミング言語かどうか

○○が関数型言語かどうかはどうでもいい

まず、関数型言語に関して思うのは、なにが関数型言語かはどうだっていいのだ。以前C言語も関数型言語であると主張する言説もあるが、それは私にとっては無価値だ。C言語に関数型言語の機能を発掘したとしてもC言語の特性やプログラミングスタイルが大きく変わるわけではない。実際C言語はHaskellやLispを比較してかなり関数型のプログラミングスタイルで書きにくいし、それで書かれたとしても大して可読性は良くないだろう。

最近私が良く使う概念として認知心理学の「スキーマ」ということばを良く使う。スキーマとは過去の経験から形成される認知の枠組みのことだ。たとえば、台所になにがあるだろうか?大抵の人間は、コンロや食器、冷蔵庫、電子レンジなどを答えるはずだ。そして知らない人の家でもコンロが見えればそこが台所だと認知するはずだ。我々は幼少期から、経験的にそれらを獲得している。それがスキーマというものだ。

C言語にはC言語のスキーマがあり、それによって認知しやすいかどうかが変わってくる。HaskellやLispにもその言語のスキーマがありその結果、可読性や書きやすさが変わりプログラミングスタイルが変わってくる。「C言語ならこう書かれるはず」「Lispならこのように書く」「Haskellならこのように書く」そういったものがその言語の特徴の一つとなってくると私は考えている。

また、「関数型言語はこのようなもの」みたいなスキーマもあるだろう。関数型言語の定義以前に、関数型言語とされているプログラミング言語をやったことがある人間は、関数型プログラミングのイメージができている。

私が無意味に感じるのは「関数型言語」そのスキーマが人間のプログラミング言語の学習経験によって差がありすぎることに思うのである。「○○言語は関数型言語」だという発言はその言語にとって、「関数型寄り」ということが分かるだけで、その言語の特徴が分かるわけではないのである。

良いプログラミング言語なのか?

私が常に関心があるのは、結局それが良いプログラミング言語かどうかである。関数型だから命令型だからその言語が良い/悪いが分かるわけではない。例えばgo言語は関数型言語と一般に言われる言語ではないが、評価は高い(私はそこまで評価してないのだが)。

私がLispを大いに評価しているのは、それが関数型言語だから素晴らしいとかではなく、Lispを構成しているもの、例えばS式だとか、シンボルだとか、マクロだとか、同図像性だとか、そういった要素の全体を評価しているのだ。私の「良いプログラミング言語のスキーマ」と、「Lispのスキーマ」がある程度一致するのだ。

ちなみに、Lispが良いと思うのはその表現力にある。つまり、私が意図したことを、できるだけ少ない記述で表現できるからLispがすばらしいと思う一面だ。

関数型言語はすばらしいか?

関数型言語というと手放しに素晴らしいイメージが付きがちだったりする。例えば数学的だから美しいだとか。数学が苦手な人はどうなんだろう?って思う。そもそも数学がすばらしいと私はこれっぽっちも思っていない。また、関数型言語で書きたい、関数型スタイルで書くことを意識するあまり、現実の課題を「エレガント」に解決したがっていないだろうか?

たとえば最近の関数型の議論を見ていると「副作用を排除」「純粋関数にするべき」が時々目的化しているように見える。その結果「そもそも副作用とは何か?」だとか「純粋関数とはこのようなものだ!」みたいなことになりがち。そうじゃない、私にとってはそれによってどのように美しく現実の問題に対応した価値のあるコードが書けるようになるかである。副作用の排除は一つの考え方でしかない。

Lispは関数型だから素晴らしいし、関数型でないからすばらしい

ここまで書いて私は思ったのだが、Lispが素晴らしいと思うのは、関数型でもあり、関数型でないからでもあると思っている。つまり、ある程度、副作用を許容しながら宣言的に書くことができる。ある程度の抽象と具象のバランスが取れているように感じる。

分類よりも実感を

私は、プログラミング言語を分類したいのではない。どのように考え、どのように書き、どのように表現できるかにこそ興味がある。関数型というラベルが、時にその言語の実際の魅力を見えなくしてしまうことすらあるのではないだろうか?

Lispが素晴らしいのは、関数型言語としても使えるし、手続き型的にも使えるし、メタプログラミングもできる。思考を言語に写すことが、これほどまでに滑らかにできる言語は珍しい。ある意味分類を超えていると思うのだ。

「関数型かどうか」は、その言語を評価する本質ではない。自分の思考が、その言語の構造にどれだけフィットし、拡張されるかどうか。それこそが、良いプログラミング言語を測る本質的な問いなのだと私は思っている。

Discussion