Schemeことはじめ

何がきっかけだったか、少し前にScheme 入門 1. Scheme 処理系のインストールを読んでいて、「Scheme を習うと筋が良くなる と言われています。」という言葉につられ、入門しました><

環境

状況

cygwin gauche meadow - Google 検索
この辺りを参考に開発・実行環境を用意。
ちなみに、パス通したりとかの設定がいろいろ省けるので、Meadowは/usr/local/meadowにインストールしました。

先に挙げたもうひとつの Scheme 入門で、そのまま勉強中です。今日で、8. 高階関数まで。
JavaScript再帰高階関数は扱うので、ここまではそれなりにスンナリ進めました。
実はSymbolやQuoteがまだちょっとシックリきてませんが><
Scheme再帰については、http://practical-scheme.net/index-j.htmlの、http://practical-scheme.net/docs/tailcall-j.htmlや、http://practical-scheme.net/docs/cont-j.htmlが面白いです。

あと、読み進めていて「えぇ!lispは、識別子の大文字・小文字を気にしないの!?」と面食らったのですが、Gaucheでは「デフォルトのモードでは、Gaucheのリーダとライタはシンボルの大文字小文字を区別します。」だそうです。

[追記]
2007年に策定されたSchemeの新仕様(R6RS)では、大文字・小文字の区別があるようです。
ただし、今までどおり区別しないモードを用意してもよい、とのことです。

id:SaitoAtsushiさんに教えていただきました。ありがとうございます。
参考:Revised^6 Report on the Algorithmic Language Scheme - Non-Normative Appendices -
[/追記]

Schemeの文法を覚え書き

変数・関数について、自分の目に馴染んでいるJavaScriptで「これは、これに当たるのかな?」というものを併記してみます。

変数定義
(define x 5)
var x = 5;
関数定義

無名関数

(lambda (x) (* x x))
function(x) { return x * x };

無名関数を変数に束縛

(define square (lambda (x) (* x x)))
var square = function(x) { return x * x };

上のシンタックス・シュガー
JavaScriptの方は全然違うけれど、「見た目的に」ということで。

(define (square x) (* x x))
function square(x) { return x * x }
関数呼び出し

束縛された関数を使う

(square 5)
square(5);

無名関数をその場で使う

((lambda (x) (* x x)) 5)
(function(x) { return x * x })(5);

所感

少しSchemeに触れてみて、「Scheme を習うと筋が良くなる」というのは、「問題の細分化と組立て方が旨くなる」ってことなのかな、と思いました。
他言語で言う「演算子」すらも関数で、それらを幾重にもネストしてコーディングしていくので、前もって処理の流れを考えるようになります。

逆に言うと、慣れの問題かもしれませんが「あ、あそこにこの処理を挟まなきゃ」みたいなことがしにくいです。
一先ずはガリゴリ書いて、カッコの嵐とEmacsの操作に慣れたいと思います。