こんにちは。@who_you_meです。

非常に変化が早いWebの世界ではありますが、一方で今まで長い時間をかけて積み重ねられてきた知識が大切なことに変わりはありません。

たまには古典に立ち返って名著を読みたくなりませんかなりますよね私はなります。

そんな個人の趣味趣向は別としても、プログラムを書く者としてコンピュータサイエンスの知識はやはり深めておきたいところ。

てなわけで、最近私の中ではSICP（『計算機プログラムの構造と解釈』）を読みたい欲が高まっています。というか読み始めています。

Amazonで買うとかなり高いですが、実はHTML版で無料で読めます*1。

計算機プログラムの構造と解釈 第二版

この本は非常に有名なのでご存じの方も多いかとは思いますが、Lispです*2。

大事なことなのでもう一度言います。Lispです。

実は最近のSICPの授業はPythonで教えられてたりするんですが*3、私はもとからPythonistaなので今更Pythonでやっても面白みがありません。

なので折角だからこの機会にLispに触れてみよう！ ということで、まずは実行環境を整えてみました。

Emacsをお使いの方へ

最初からついとるやんけ

ですので、ここから先は非Emacser向けの内容です^^

……と思いきや、SICPで採用しているSchemeとEmacs Lispって結構違うんですね。

Emacs Lisp で SICP に挑戦するさいの落とし穴 | Futurismo

Emacserの方でもSICP読むなら下の手順を踏んだほうがいいかもしれません。

どの処理系を使うのか

Lispには処理系がたくさんあります。

初学者の私にはそれぞれの違いはわからないですし、SICPを読む分には基礎的な文法のみでOKで、処理系依存の拡張は使わないためどれを選んでもよさそうです。

ということで、いくつかググってみてメジャーっぽかったRacketを使うことにします*4。

RacketをMacにインストール

幸いなことに公式のバイナリが提供されています。

The Racket Language

公式サイトから右上の「Download」で

Distribution: Racket

Platform: Mac OS X (Intel 32-bit or 64-bit)

を選択してdmgファイルをダウンロードしましょう。

後はダブルクリックしてApplicationにコピーすればOK*5。これだけです。

起動してみる

LaunchPadに追加されているはずです。DrRacketというGUIの開発環境が用意されています。

開いてみるとなんと最初から日本語化されてる！ すごい！

俺は黒い画面が大好きだ！ という方に

当然ですがコマンドラインからも実行可能です。まずはPATHを通しましょう。

私の環境ではこんな感じになりました。

echo 'export PATH="/Applications/Racket v6.1.1/bin:$PATH"' >> ~/.bashrc

これで $ racket でインタラクティブシェルが起動するようになります。

ソースファイルから実行するのも簡単。

#lang racket ( define ( square x ) ( * x x )) ( define ( average x y ) ( / ( + x y ) 2 )) ( define ( sqrt x ) ( define ( good-enough? guess ) ( < ( abs ( - ( square guess ) x )) 0.001 )) ( define ( improve guess ) ( average guess ( / x guess ))) ( define ( sqrt-iter guess ) ( if ( good-enough? guess ) guess ( sqrt-iter ( improve guess )))) ( sqrt-iter 1.0 )) ( sqrt 2 )

こいつを sqrt.rkt で保存して下記を実行

$ racket sqrt.rkt 1.4142156862745097

これであなたの好きなエディタ（つまりvim）でコードが書けますね！

いかがでしょうか。「これで俺もLisperだ！！」と叫ぶとあちこちからマサカリが飛んできそうですが、入門はできましたね。

これでSICPをサクサクと読み進められる……はず……