Schemeの好きなところと嫌いなところ

あくまでへっぽこSchemeファンの現時点での個人的な感想として挙げておきます。おかしなところはツッコミをもらえるとありがたいです

好きなところ

その1 手続きを単なる値として扱える

手続き(lambda/クロージャ)を普通に変数で扱えるというのはやっぱり気持ちいいです。JavaScriptもそうですが。例えば、単なる値を扱っていた部分をクロージャに書き換えることでプログラムの機能を強化する、といったことができたり

その2 レキシカルクロージャが強力

「環境をキャプチャできる」というレキシカルの意味に気づいたときは、ぱっと視界が開けたような気がしました。オブ厨の人がオブジェクト指向に目覚めるときって、きっとこんな感じなんだろうなという

その3 Gaucheがある

(特に日本で)Schemeを使う人はなんだかんだ言ってやっぱりこれが一番大きいのではないかと。下のコメントでshiroさんが書かれているように、標準のSchemeだけでは実用的なコードは書けないとよく言われます。私の記憶では、この前のshibuya.lispでshiroさんは、Gaucheを開発する理由を「Schemeを仕事で使えるようにするため」だとおっしゃっていたと思います。GaucheはピュアSchemeとしても使えるし、独自の拡張を生かした実用的なプログラミングもできる(はず。私はGaucheの独自機能をバリバリ使ったことはないのでわかりませんが)

嫌いなところ

ここからは偏見バリバリです

その1 lambda式が醜い

SchemeだけじゃなくてLISP全般の話ですが。コードの中でlambdaの部分だけなんか異質なんですよね。まずlambdaって長いし。エディタの設定でλの1文字にしている人も見かけます。あと、引数リストと本体が並んでるのも異質感を醸し出してる気が。いっそのこと先祖返りして「(^(引数リスト)(本体))」の形なら、まだ許せるかも

その2 メソッド探索機能がない

Schemeクロージャって簡単なオブジェクトとして使えるんですが、手続きのディスパッチは全部自分で手で書かなきゃならない。そんなことは普通は処理系の仕事だろう、と。
ただこれは素のSchemeの話で、実際にはScheme処理系にはたいてい何らかのオブジェクトシステムが載っています。Scheme用のオブジェクトシステムとしてはSTkのSTklosが有名だし、Gaucheにもあらかじめオブジェクトシステムが組み込まれていたりします。

その3 forループがない

個人的には再帰は好きなんですが、繰り返しの手段が再帰だけというのはやりすぎだと思います。木などの再帰的な構造を処理するならいいんですが、単純なループをわざわざ再帰で書くのはわずらわしい(「名前付きletをloop構文だと思いこむ」という技はありますけど)。再帰はおつむリソースを余分に消費するので、その分のリソースは別のロジックを考えるのに使ったほうがいんじゃないかと思ったり。
え、do構文? そ、それわ…