Oh! Can Not Diary

おきゃんなダイアリー

腐女子のためのlisp入門 #2

こんばんは。第二回腐lispの時間です。
今回はループ処理と高階関数について説明します。そして最後にfizzbuzz問題のアレンジ版を作ってみますよ。

ループ

一番単純なループはwhileです。書き方はこちら。

(while 条件式
 フォーム1
 フォーム2
)

whileを使って、1からlimitまでのリストを作る関数を作ってみます。
fizzbuzzなので1から15までのリストを作ります。

(defun generate-list (limit)
  (let ((i 1) ret)
    (while (<= i limit)
      (setq ret (cons i ret))
      (setq i (1+ i)))
    (reverse ret)))

(generate-list 15) ; (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15)

高階関数

高階関数というのは引数に関数をとれたり、関数を戻り値にできる関数のことです。
まぁピンとこないかもしれませんが、次のように理解してもあんまり問題ないと思います。

(mapcar '攻め関数 '受けリスト)

mapcar関数は受けリストの各要素について攻め関数を呼び出してリストを返します。
つまり×の役割といえますね!

では早速、さきほどの受けリストを使ってfizzbuzz関数を適用させてみます。

ただ、普通のfizzbuzzでは面白くないので、
ここでは3と5の倍数の時にホモになって15の倍数の時にほられるという仕様にします。

(defun yaranaika (num)
  (cond
   ((= (% num 15) 0) "アッー!")
   ((= (% num  3) 0) "やらないか")
   ((= (% num  5) 0) "ウホッ!いい男")
   (t num)))

(defun fizzbuzz (limit)
  (mapcar 'yaranaika (generate-list limit)))

(fizzbuzz 15)

結果は以下のようになります。

(1 2 "やらないか" 4 "ウホッ!いい男" "やらないか" 7 8 "やらないか" "ウホッ!いい男" 11 "やらないか" 13 14 "アッー!")

台詞は自由に変えるといいでしょう。もはや全くfizzbuzzではありませんがそれは気にしないでください。

# 連載と銘打っていますが実はほぼノープランなので、またネタを思いついたら書くことにします。

おわり