ハウテレビジョンブログ

『外資就活ドットコム』『Liiga』『Mond』を開発している株式会社ハウテレビジョンのブログです。

Lispをはじめよう! 非EmacserがMacにLisp(Scheme)の実行環境を作るまで

f:id:fuyumi3:20150312165148p:plain

こんにちは。@who_you_meです。

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

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

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

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

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

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

  • 作者: ハロルドエイブルソン,ジュリーサスマン,ジェラルド・ジェイサスマン,Harold Abelson,Julie Sussman,Gerald Jay Sussman,和田英一
  • 出版社/メーカー: 翔泳社
  • 発売日: 2014/05/17
  • メディア: 大型本
  • この商品を含むブログ (1件) を見る

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にインストール

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

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

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

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

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

起動してみる

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

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

f:id:fuyumi3:20150312164828p:plain

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

当然ですがコマンドラインからも実行可能です。まずは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をサクサクと読み進められる……はず……

*1:海賊版ではなく公式訳なのでご安心を。原著はCC BY-SA 4.0で公開されています。翻訳版のライセンスは謎

*2:正確には、Lispの一方言であるSchemeですが

*3:http://www-inst.eecs.berkeley.edu/~cs61a/sp14/index.html

*4:正確にはRacket自体も一つのLispから派生した言語らしいですが、Scheme互換なので細かい違いは一旦置いておきましょう

*5:展開すると400MBぐらいある