Common lisp事始め

Common lisp事始め

September 10, 2018
Programming
Common Lisp, Emacs

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 の開発環境を用意した