vim使いのslime入門(2)

前回、インストールしただけで止まっていたんですが、 今回は、slime上でコードを書いていってみます。まずは、簡単な関数を書きながら、slimeでのキーバインドなどに触れてみたいと思います。

簡単な例 ユークリッドの互除法で最大公約数を求める関数

数学的な話は置いといて、wikipediaからアルゴリズムを引っぱってきます。

  1. 入力を m, n (m >= n) とする。
  2. n = 0 なら、m を出力してアルゴリズムを終了する。
  3. n が m を割り切るなら、n を出力してアルゴリズムを終了する。
  4. 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というキーバインドを覚えました。

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.