vim使いのslime入門(2)
2008/11/17
前回、インストールしただけで止まっていたんですが、 今回は、slime上でコードを書いていってみます。まずは、簡単な関数を書きながら、slimeでのキーバインドなどに触れてみたいと思います。
簡単な例 ユークリッドの互除法で最大公約数を求める関数
数学的な話は置いといて、wikipediaからアルゴリズムを引っぱってきます。
- 入力を m, n (m >= n) とする。
- n = 0 なら、m を出力してアルゴリズムを終了する。
- n が m を割り切るなら、n を出力してアルゴリズムを終了する。
- m を n で割った余りを新たに m とし、更に m と n を取り替えて 3. に戻る。
で、例として1071と1029の最大公約数は、21です。
関数定義
slimeを起動して、1.から実装しながら、関数を定義してみます。
; SLIME 2005-11-22 CL-USER> (defun mygcd (a b) (let ((m (max a b)) (n (min a b))))) MYGCD CL-USER>
焦らず少しずつ。
以前入力したものを再度プロンプトに表示させるキーバインドは、M-pでした。次は、M-pを押してさっきのmygcdを改変して2.を実装します。
CL-USER> (defun mygcd (a b) (let ((m (max a b)) (n (min a b))) (cond ((zerop n) m)))) MYGCD CL-USER> (mygcd 0 0) 0 CL-USER> (mygcd 0 3) 3 CL-USER>
とりあえず、できたことまで(小さい方のパラメータが0なら逆の方を返す)の動作確認をしてみました。では、また M-pを押して次は3.を実装します。
CL-USER> (defun mygcd (a b) (let ((m (max a b)) (n (min a b))) (cond ((zerop n) m) ((zerop (mod m n)) n)))) MYGCD CL-USER> (mygcd 2 4) 2 CL-USER>
また、実装後に今回実装した部分の確認をしています。では、また M-pを押して最後の4.を実装します。
CL-USER> (defun mygcd (a b) (let ((m (max a b)) (n (min a b))) (cond ((zerop n) m) ((zerop (mod m n)) n) (t (mygcd (mod m n) m))))) MYGCD CL-USER> (mygcd 1071 1029) 21 CL-USER>
無事、1071 と 1029 の最大公約数を求めることができました。
まとめ
replで、関数を作ってみました。slimeとしては、M-pというキーバインドを覚えました。