range
Common LispにはPython等に見られるrange関数がないみたい(?)ですね。
(defun range (end &optional (start 0) &key (step 1)) (cond ((not (plusp (- end start))) nil) (t (let (acc) (do ((i start (+ i step))) ((>= i end) (nreverse acc)) (push i acc) ))))) >(range 10) (0 1 2 3 4 5 6 7 8 9) >(range 11 1) (1 2 3 4 5 6 7 8 9 10) >(range 21 0 :step 2) (0 2 4 6 8 10 12 14 16 18 20) >(range -10 -20) (-20 -19 -18 -17 -16 -15 -14 -13 -12 -11)
破壊的操作とループを積極的に使ってるので速度もまぁまぁなんじゃないかな。
Lispのコード貼り付けるとインデント崩れる・・・。
(let* ((lst (range 101 1)) (gen #'(lambda (v) #'(lambda (x) (= 0 (mod x v))))) (f3 (funcall gen 3)) (f5 (funcall gen 5)) (buzz #'(lambda (x) (if x (concatenate 'string x "Buzz") "Buzz"))) ) (mapcan #'(lambda (x) (let (v) (if (funcall f3 x) (setf v "Fizz")) (if (funcall f5 x) (setf v (funcall buzz v))) (if v (setf v (intern v)) (setf v x)) (list v) )) lst ))