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);