Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-05-18

CLOSでL-99 (P22 指定した範囲の数列のリスト)

| 03:52 | CLOSでL-99 (P22 指定した範囲の数列のリスト) - わだばLisperになる を含むブックマーク はてなブックマーク - CLOSでL-99 (P22 指定した範囲の数列のリスト) - わだばLisperになる

色々な型に対応しつつ、コードの重複を避けるように考えているのですが、いまいち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))))