#:g1: closでL-99 (P22 指定した範囲の数列のリスト)

Posted 2008-05-17 18:52:00 GMT

-(http://www.ic.unicamp.br/~meidanis/courses/mc336/2006s2/funcional/L-99_Ninety-Nine_Lisp_Problems.html)
色々な型に対応しつつ、コードの重複を避けるように考えているのですが、いまいちclos流というのが掴めていません…。
今回は、フロントに総称関数を置いて共通部分は、関数に括り出すという感じにしてみました。

;(range 4 9)
;=> (4 5 6 7 8 9)

;(mapc #'princ (range #\あ #\お)) ;=> あぃいぅうぇえぉお

(defgeneric RANGE (start end) (:documentation "P22 (*) Create a list containing all integers within a given range."))

(defmethod RANGE ((start integer) (end integer)) (RANGE1 start end #'values))

(defmethod RANGE ((start character) (end character)) (let ((start (char-code start)) (end (char-code end))) (RANGE1 start end #'code-char)))

(defun RANGE1 (start end fn) (declare (integer start end)) (if (< start end) (loop :for i :from start :to end :collect (funcall fn i)) (loop :for i :from start :downto end :collect (funcall fn i))))

comments powered by Disqus