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>
できました。
いや、できてません。なんか()の位置間違えてますね。
つづく
コメント