EmacsでLispの覚え直し(その4)

Emacs Lisp続きです。
defunで関数を作れます。

ELISP> (defun first (lis) (car lis))
first
ELISP>

今作った関数を使ってみましょう。

ELISP> (first (list 10 20 30))
10 (#o12, #xa, ?\C-j)
ELISP> 

ちょっとだけ複雑にした関数。

ELISP> (defun second (lis) (car (cdr lis)))
second
ELISP> (second (list 10 20 30))
20 (#o24, #x14, ?\C-t)
ELISP> 

数字から始まる関数だって作れてしまいます。

ELISP> (defun 1st (lis) (car lis))
1st
ELISP> (1st (list 10 20 30))
10 (#o12, #xa, ?\C-j)
ELISP> 

なかなか魅力的です。

次はif。ifといえども関数です。

ELISP> (setq a 10)
10 (#o12, #xa, ?\C-j)
ELISP> (setq b 10)
10 (#o12, #xa, ?\C-j)
ELISP> (if (= a b) (princ "A") (princ "B"))
A
"A"
ELISP> 

ifに続く3つの要素は、1番目が条件で、条件次第で2番目、3番目のどちらかを処理するようです。

ELISP> (if (= a 10) (princ "A") (princ "B"))
A
"A"
ELISP> 

条件が偽の場合。

ELISP> (if (= a 9) (princ "A") (princ "B"))
B
"B"
ELISP> 

判定方法を変えてみます。

ELISP> (if (> a 9) (princ "A") (princ "B"))
A
"A"
ELISP> 

ではif関数を使って関数を作ってみましょう。

ELISP> (defun greater (a b) (if (> a b) (a) (b)))
greater
ELISP> (greater 100 5)
*** Eval error ***  Symbol's function definition is void: a
ELISP> 

エラーになりました。なぜ?

(a)(b)の()が余分でした。

ELISP> (defun greater (a b) (if (> a b) a b))
greater
ELISP> (greater 100 5)
100 (#o144, #x64, ?d)
ELISP> (greater 5 30)
30 (#o36, #x1e, ?\C-^)
ELISP> 

面白くなってきました。

次は数字をカウントダウンする関数を作ります。
再帰呼び出しを使います。

ELISP> (defun count (n) (if (> n 0) (count (- n 1)) 0))
count
ELISP> (count 10)
0 (#o0, #x0, ?\C-@)
ELISP> 

カウントダウンの過程が見れないので、ちゃんとカウントダウンしているか分かりません。

複数の処理を実行したい場合は、prognを使います。

ELISP> (progn (princ "A") (princ "B") (princ "C"))
ABC
"C"
ELISP> 

prognを使って、カウントダウンをしながらカウント値を表示するように改造。

ELISP> (defun count (n) (if (> n 0) (progn (princ n) (count (- n 1)) 0)))
count
ELISP> (count 10)
10987654321
0 (#o0, #x0, ?\C-@)
ELISP> 

できました。
いや、できてません。なんか()の位置間違えてますね。
つづく

Leave a Reply

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

CAPTCHA