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-10

CLOSでL-99 (P21 指定した位置に要素を挿入する)

| 19:28 | CLOSでL-99 (P21 指定した位置に要素を挿入する) - わだばLisperになる を含むブックマーク はてなブックマーク - CLOSでL-99 (P21 指定した位置に要素を挿入する) - わだばLisperになる

call-next-methodすると色々できそうなんだけど、乱発すると何だか良く分からないことになるなあ…。

(insert-at 'alfa '(a b c d) 2)
;=> (A ALFA C D)

(insert-at 'alfa #(a b c d) 2)
;=> #(A ALFA C D)

(insert-at 'alfa "abcd" 2)
;=> "aALFAcd"

(defgeneric INSERT-AT (item sequence position)
  (:documentation "P21 (*) Insert an element at a given position into a list."))

(defmethod INSERT-AT (item (sequence array) (position integer))
  (call-next-method (if (stringp sequence) (to-string item) (vector item))
                    sequence
                    position))

(defmethod INSERT-AT (item (sequence list) (position integer))
  (call-next-method (list item) sequence position))

(defmethod INSERT-AT (item (sequence sequence) (position integer))
  (concatenate (class-of sequence)
               (subseq sequence 0 (1- position))
               item
               (subseq sequence position)))

(defgeneric TO-STRING (obj)
  (:documentation "coerce to string."))

(defmethod TO-STRING ((obj symbol)) (string obj))

(defmethod TO-STRING ((obj string)) obj)

(defmethod TO-STRING (obj) (write-to-string obj))