#:g1: closでL-99 (P25 ランダムに並び換え)

Posted 2008-06-08 15:29:00 GMT

-(http://www.ic.unicamp.br/~meidanis/courses/mc336/2006s2/funcional/L-99_Ninety-Nine_Lisp_Problems.html)
以前に作ったものを組み合わせて解答せよとのことなのですが、以前に作った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)))))

comments powered by Disqus