インデントについて雑感

関数型言語と呼ばれるものを触っておくと良い理由について

変わったパラダイムや考え方を学ぶと良いと言われるけれど。

本当にこういうことを学べるから素晴らしいのだろうか。

一昔前に「lispを学ぶと悟りを開ける」と言った人がいた記憶があるけれど(要出典)、lispで悟りが開ける理由も

  • 再帰
  • マクロ
  • 同図像性
  • etc..

というような話をする人もいるけれど。それって本当なんだろうか?

ところでpythonはインデントが意味を持っている。他にインデントが意味を持つ言語は?

pythonなどインデントが意味を持つ言語は一部存在していて。 その利点として、「読みやすい」ということが挙げられる事が多い。

ところでpythonは、構文のブロック構造をインデントで表していて。 ブロック構造は把握しやすいように感じる。

他にインデントが視覚的に貢献している言語はあるんだろうか? と考えてみると、式指向の関数型言語*1と呼ばれるものが当てはまるような気がしている。 例としてはML系の言語やscheme*2

schemepythonのコードの比較

schemeで書かれたコードとpythonで書かれた同様のコードを並べてみる。

schemeの方はブロック構造ではなく、変数間の依存関係がインデントによって視覚化されているように見える。 (letg*使えという声も出るかもしれないが、コード上のlet*を見ている時頭の中では同様のイメージで描かれているのではと思う) 一方、pythonの方は変数間の依存関係が一見しただけでは分かりにくいように感じる。

変数間の依存関係が見極められるようになること≒悟り?

特に、自分であーでもないこーでもないと混沌としたコードを試行錯誤しながらキレイな形に分離する過程で、変数間の依存関係が視覚的に表現されていることがプラスに働くのではと思った。そして、もし仮に、悟り?というものが意味するものが在るとしたら、それは実は再帰や値としての関数に対する理解などではなく、変数間の依存関係をきっちり把握することだったりするのではないか?などと思ったりした。

つまるところ、変数間の依存関係を容易に把握できるような人はそういう意味では関数型言語と言われる言語に触る必要が無いし。 完成形の綺麗なコードをみせられて、素晴らしいと鑑賞したりするだけではあまり悟り?からは程遠いままなのでは?と思った。

*1:式で十分なものに文を使わない言語

*2:whereがあるのでhaskellはあてはまらないきがする。全てが後付可能だしインデントに意味はあまりない