Aycan iRiCAN wrote:
Volkan YAZICI wrote:
---- {0} demiş ki:
Listemi islemden gecirip ...
İşlemden geçirmek ile, bir tür sıralamayı kast ettiğinizi varsayıyorum.
... her bir elemaninin basina
sira no'sunu nasil ekleyebilirim.
(loop for item in (sort list pred)
for idx from 0
collect (cons idx item))
Ama sizin yerinizde olsam (coerce (sort list pred) 'vector) tarzı bir
şey kullanırdım.
Bunun genel adı "zip" diye biliyorum. Örneğin elinizdeki listeyi,
birden sonsuza sayılar listesi ile birebir işleme sokuyorsunuz. Bu
genel özelliği CL'de acemice aşağıdaki gibi ifade edebilir miyiz acaba?
(defun zip (fn &rest lsts)
(if (any #'null lsts)
nil
(cons (apply fn (mapcar #'car lsts))
(apply #'zip fn (mapcar #'cdr lsts)))))
(defun any (fn lst)
(if (member nil lst)
(or (funcall fn (car lst))
(any fn (cdr lst)))
nil))
Ya da çözümü CL'ye özelleştirerek;
CL-USER> (let ((mylist '(a b c d e f)))
(mapcar #'cons (core-server::seq (length mylist)) mylist))
((0 . A) (1 . B) (2 . C) (3 . D) (4 . E) (5 . F))
Fermuar yönteminin herhangi bir döngüden daha iyi olduğunu düşünüyorum.
CL-USER> (let ((mylist '(a b c d e f)))
(zip #'list (core-server::seq (length mylist)) mylist))
((0 A) (1 B) (2 C) (3 D) (4 E) (5 F))
Bu işlem haskell'de çok basit, "zip [1..] mylist" şeklinde bir ifade
yetiyor ki bu yüzden seviyoruz onu.
Prelude> zip [1..] "abc"
[(1,'a'),(2,'b'),(3,'c')]
Sevgiler...
--
Aycan iRiCAN
Kor Bilişim Ltd. Şti.
http://www.core.gen.tr/
_______________________________________________
cs-lisp mailing list
cs-lisp@cs.bilgi.edu.tr
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp