On 3/17/07, Ifnu <ifnubima¡gmail.com> wrote:

> Rekursinya tidak berhenti. Coba baca ini:
> http://www.delorie.com/gnu/docs/elisp-manual-21/elisp§141.html. Coba
> kasih fungsi lengkapnya, fungsinya itu nggak berhenti.
misalnya ini nih :

Wah ternyata saya salah, batas rekursinya elisp ternyata memang
terlalu rendah, di clisp (common lisp)semua baik2 saja. Pertama,
fungsi ini memang terlalu rumit:

(defun uh(ls ll ld)
    (cond
        ((equal ll nil) ls)
        ((equal (occurence (car ll) ld 0) 1) (
            cond ((equal ls nil)
                (uh (list(car ll)) (cdr ll) ld))
                 ((atom ls)
                (uh (append (list ls) (list (car ll))) (cdr ll) ld))
                 (t (uh (append ls (list (car ll))) (cdr ll) ld))

        ))
        (t (uh ls (cdr ll) ld))
    )
)

(unique-list '(a b c a))

ini code untuk menampilkan unique list, eksekusi list diatas ini
harusnya jadi list (b c), eksekusi ini bisa jalan kalo listnya kecil,
nah kalo listnya panjang dya overflow karena rekursi.

misalnya (atom ls) itu gak pernah dieksekusi, kalau rekursif murni,
sebaiknya begini saja:
(defun uniqlist (l)
 (if (null l)
     nil
   (if (member (car l) (cdr l))
 (uniqlist (remove (car l) (cdr l)))
     (cons (car l) (uniqlist (cdr l)))
     )
   )
 )


tapi itu hanya bisa menangani sedikit lebih banyak elemen dari versi Anda.


nah maunya ini dirubah pake loop ajah, jangan rekursi.

kira2 implementasinya pake fungsi dolist, dengan algoritma sebagai berikut:

Algoritmanya agak terlalu rumit, begini lebih sederhana (bisa
menangani list yang besar):

(defun isuniq(el mylist)
 (equal (- (length mylist) (length (remove el mylist))) 1)
)

(isuniq 'a '(a b c))
t

(defun listunik (mylist)
 (let (result)
   (dolist (el mylist result)
     (if (isuniq el mylist) (setq result (append result (list el))))
     )
   )
 )

(listunik '(a b c a b a d e g h i j k l m j i q w p w))
(c d e g h k l m q p)




sebenernya gw pengen tau di lisp bisa ga sih melakukan expresi C ini :

x+=1;

atau

x = x + 1;


Bisa, pake aja setf, misalnya
(setf x 0)
(setf x (+ x 1))

--
Regards
Yohanes
http://tinyhack.com/freewarelist/s603rd/

--
Berhenti langganan: [EMAIL PROTECTED]
Arsip dan info: http://linux.or.id/milis

Kirim email ke