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-06-09

CLOSでL-99 (P25 ランダムに並び換え)

| 00:29 | CLOSでL-99 (P25 ランダムに並び換え) - わだばLisperになる を含むブックマーク はてなブックマーク - CLOSでL-99 (P25 ランダムに並び換え) - わだばLisperになる

以前に作ったものを組み合わせて解答せよとのことなのですが、以前に作ったremove-atが予期せぬ動きをしていたため、はまってしまいました。

原因は、

(concatenate (class-of '(a)) () ())

のような処理の個所で、class-ofでは、consと判定されるのですが、結果は、()なので、クラスはCONSではなくなってしまうということでした。

LISTならば、CONS+NULLなので大丈夫ですがLISTとCONSの扱いの違いで割とはまることが多いです(;´Д`)

(rnd-permu '(a b c d e f))
;==> (E A D F C B)
(rnd-permu #(a b c d e f))
;==> #(F E A C B D)
(rnd-permu "abcdef")
;==> "fdbaec"

(defgeneric RND-PERMU (sequence)
  (:documentation 
   "P25 (*) Generate a random permutation of the elements of a list."))

(defmethod RND-PERMU ((sequence sequence))
  (RND-SELECT sequence (length sequence)))

;; 修正版
(defmethod REMOVE-AT ((sequence sequence) (position integer))
  (let ((class (if (listp sequence) 'list (class-of sequence))))
    (values (concatenate class
                         (subseq sequence 0 (1- position)) 
                         (subseq sequence position))
            (elt sequence (1- position)))))

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20080609