Common lisp事始め
September 10, 2018
Common Lisp をやって行く
エンジニアなら 1 度は触っておくべきと言われる Lisp をそろそろ入門しようと思う
有名なLand of Lispが積本になっていたのでやる
今回はまず環境の準備をしていきます
Clisp と emacs のインストール
lisp といえば emacs というイメージがあるので emacs を準備
$ brew install clisp emacs
emacs を一度起動しておく
次の SLIME をインストールするための.emacs.d
を生成するために一度 emacs を起動しておく
$ emacs
起動したらC-x
-> C-c
で終了C-x
は Ctrl キーを押しながら、x ボタンを押すという意味(C-c
も同様)
もう少しモダンな環境を準備
Clisp 用の IDE として、SLIMEというのが使われているらしい
これらもインストールしておく
SLIME のインストール
最新の SLIME を落としてくる
$ cd ~/.emacs.d/
$ git clone https://github.com/slime/slime.git
init.el を準備
$ vim ~/.emacs.d/init.el
(load (expand-file-name "~/sbcl/.quicklisp/slime-helper.el"))
(setq inferior-lisp-program "clisp")
;; ccl sbcl clisp など
;; SLIMEのロード
(require 'slime)
(slime-setup '(slime-repl slime-fancy slime-banner slime-indentation))
;; SLIMEからの入力をUTF-8に設定
(setq slime-net-coding-system 'utf-8-unix)
これで emacs を起動してM-x slime
とタイプすれば SLIME を開始できる
(M-x
はメタキー(ESC キー)を押して離した後に x キーを打つという意味)
$ emacs
$ M-x slime
File Edit Options Buffers Tools SLIME REPL Presentations Lisp Trace Help
Welcome to GNU Emacs, a part of the GNU operating system.
Get help C-h (Hold down CTRL and press h)
Emacs manual C-h r Browse manuals C-h i
Emacs tutorial C-h t Undo changes C-x u
Buy manuals C-h RET Exit Emacs C-x C-c
Activate menubar M-`
(‘C-’ means use the CTRL key. ‘M-’ means use the Meta (or Alt) key.
If you have no Meta key, you may instead type ESC followed by the character.)
Useful tasks:
-UUU:%%--F1 *GNU Emacs* Top L1 (Fundamental) ---------------------------
CLISP Port: 53152 Pid: 7029
; SLIME 2.21
CL-USER>
SLIME での開発の基本
emacs + SLIME を起動しておく
; SLIME 2.21
CL-USER>
ファイルを新規作成する
emacs + SLIME を起動した状態でC-x C-f
をタイプすると、現在の起動ディレクトリに対してファイルを作成できるようになるFind file: ~/work2018/land-of-lisp/guess-my-number/
このような表示が現れるので、既存のファイルを選択するか、新しく作る場合は適当なファイル名.lisp
とタイプしよう
タイプして Enter をするとファイル入力画面に移行する
テスト用のプログラムを入れる
ユーザーが頭の中に思い浮かべている数値をプログラムに推測させるプログラムを書いてみる
(land of lisp に乗っているのでそちらを参考にして)
(defun start-over ()
(defparameter *small* 1)
(defparameter *big* 100)
(guess-my-number))
(defun guess-my-number ()
(ash (+ *small* *big*) -1))
(defun smaller ()
(setf *big* (1- (guess-my-number)))
(guess-my-number))
(defun bigger ()
(setf *small* (1+ (guess-my-number)))
(guess-my-number))
コンパイル
SLIME を入れているとこれらをすぐにコンパイルして動作確認ができる
上のファイル編集画面の状態でC-x C-k
をタイプするとファイル全てをコンパイルC-c C-c
をタイプすると今ポインタがさしているスコープの関数をコンパイルする
ここではC-x C-k
でファイル全体をコンパイルしておこう
確認
コンパイルが済んだので一旦 REPL に戻って動かしてみるC-c C-z
で REPL 画面に戻る
ではゲームを試してみる。自分の頭の中で 72 という数字を思い浮かべた
; SLIME 2.21
CL-USER> (start-over) ## 初期値をリセット
50
CL-USER> (guess-my-number) ## ゲーム開始
50
CL-USER> (bigger) ## 50よりは大きい
75
CL-USER> (smaller) ## 75よりは小さい
62
CL-USER> (bigger) ## まだ小さい
68
CL-USER> (bigger) ## まだ小さい
71
CL-USER> (bigger) ## まだ小さい
73
CL-USER> (smaller) ## 大きい
72 ## 当てられてしまった...
終了するには
C-x C-c
で emacs を終了するよ
バックトレースに操作奪われたときはC-c C-z
で REPL に戻れる
まとめ
Common Lisp の開発環境を用意した