ズンドコキヨシ with Emacs Lispに続くEmacs Lispバージョン第2弾。遅れをとった…
(defun zundoko-list ()
(let ((zun-or-doko '("ズン" "ドコ"))
(zzzzd '("ズン" "ズン" "ズン" "ズン" "ドコ"))
(kiyoshi "キ・ヨ・シ!")
zundoko len-zzzzd len-zundoko kiyoship)
(setq len-zzzzd (length zzzzd))
(while (not kiyoship)
(setq zundoko (append zundoko (list (nth (random 2) zun-or-doko))))
(when (<= len-zzzzd (setq len-zundoko (length zundoko)))
(when (equal (nthcdr (- len-zundoko len-zzzzd) zundoko) zzzzd)
(setq zundoko (append zundoko (list kiyoshi)))
(setq kiyoship t))))
zundoko))
(defun zundoko-insert ()
(interactive)
(let (zd)
(setq zd (zundoko-list))
(while zd
(insert (car zd))
(when (setq zd (cdr zd))
(insert " ")))
(insert "\n")))
*scratch*バッファで実行
(zundoko-insert)
ズン ズン ズン ズン ズン ズン ズン ズン ドコ キ・ヨ・シ!
nil
解説というか感想
ズンドコのリストを作るのがLispっつぽい処理かなと。
「ズン ズン ズン ズン ドコ」を判定するために、nthcdr関数で取得したzundokoリストの末尾部分をzzzzdリストを比較しています。リストの先頭部分だけを取り出すことも考えたのですが、方法が分かりませんでした(リストをreverse関数で逆にしてからnthcdrで取り出すことはできますが)。
(when (equal (nthcdr (- len-zundoko len-zzzzd) zundoko) zzzzd)
(setq zundoko (append zundoko (list kiyoshi)))
(setq kiyoship t))))
リストの末尾を取り出す必要があるため、zundokoリストの先頭ではなく末尾に新しい「ズン」または「ドコ」を追加しています。appendはリストの結合なので、追加する要素もリストにする必要があります。
(setq zundoko (append zundoko (list (nth (random 2) zun-or-doko))))
zundoko-insertは、zundoko-listの内容をそのまま挿入する関数。リストをそのままスペース区切りで出力する関数を見つけられなかったので作りました。