プロジェクト・オイラーProblem1解いた

**** 追記 2011/11/28 答え載せてなかったし間違ってたので修正。problem1のloop中のnを(- n 1)に変更

プロジェクト•オイラーというものがあったのでちょっとだけ解いてみた。
Problem 1 - PukiWiki

使用言語はSBCL。いい加減Emacs Lisp以外を使おうというのが頭にあったのでとりあえず使えるSBCLを使った。あとloopを使ってみようかと思って使ってみた。
http://www.apl.jhu.edu/~hall/Lisp-Notes/Loop-Summary.html
微酔半壊: Common Lisp: loopマクロ用法抄
ループ - Common Lisp クックブック



loopはあんまり詳しい使い方を知らなくて苦戦した。そしてEmacs Lisp以外をあまり使っていなかったのでかなり苦戦した。importとかuse-packageとかはまた今度使う。

finallyキーワードはやっと使い方がわかったから良かった。少しずつloopマクロの使い方がわかってきてる。

loop部分は1000未満なのでnを-1してる。loopの最大はn-1ではないみたい。

(defun problem1 (n)
  (loop for i from 1 to (- n 1) with result = 0 do 
       (setq result (+ (check-zerop-3-5 i) result))
     finally
       (return result)))

(defun check-zerop-3-5 (n)
  (cond ((zerop (mod n 3)) n)
        ((zerop (mod n 5)) n)
        (t 0)))
(problem1 1000)
;=> 233168