(Bu eposta cs-lisp eposta listesine geldi. Aslinda Scheme ile degil, Common-Lisp ile cevap isteniyor. Pek de fark yok aslinda. Comp/FM-149 ogrencileri icin de enteresan bir soru olacak. Lutfen dikkatle okuyunuz. Aykut'un sorununu bizim yontemimizle cozecegiz.)
Merhaba Aykut. Temel Kaynak: http://www.htdp.org Sorunu cozmek icin sana daha temel bir oneri ile baslayayim. Once programin tasarimi ile baslayalim. Verimiz nedir? ;; Veri tanimi: ;; ;; Sembol listesi Sira keldi programin kontratina. Fonksiyonun ismi, aldigi girdiler ve bunlarin tipleri ve geri dondurdugu tipi yazmamiz gerekiyor. ;; replace-symbol: (listof symbols) -> (listof symbols) Fonksiyon ne ise yarar? ;; To replace 'a with 'e and 'b with 'd in a list of symbols. Ornek verelim. Dikkat ornekler bizim icin cok onemli. Tum kritik olasiliklari dusunmemiz gerekiyor. (replace-symbol nil) -> nil (replace-symbol '(a)) -> '(e) (replace-symbol '(e)) -> '(e) (replace-symbol '(b)) -> '(d) (replace-symbol '(d)) -> '(d) (replace-symbol '(a e b d c)) -> '(e e d d c) Simdi sira geldi bir liste tuketen ve bunu isleyen bir programin sablonuna. Bu sablon nasil hazirlanir? Temel olarak veri tipinden yola cikiyoruz. Veri tipimiz aslen bir liste. Demek ki listeleri tanimlamamiz gerekiyor: A list is either: 1. empty, or 2. a pair of a. a value and b. a list. Bu tanim bize kendine isaret eden (ya da basvuran: self-referential) bir veri tipi tanimi. Yani ozyinelemeli (recursive) bir fonksiyon kullanmamiz gerekiyor. Sablonu yazalim: (defun replace-symbol (l) (cond ((null l) ...) (t ... (car l) ... ... (replace-symbol (cdr l)) ...))) Veri tanimi ile sablonun nasil bir benzerlik gosterdigine dikkat!!! Simdi sablonu bozmadan kodumuzu yazalim mi? Hayir. Siz yazin. Ama dikkat: listenin ilk elemani bir sembol ve bu sembolu uygun bir sekilde degistiren baska bir fonksiyon kullanmalisin. Aksi takdirde sablon bozulacaktir. Butun bunlar buyuk problemlerin ustesinden kolaylikla gelmek icin... Son olarak da testlerini yapalim: (equal (replace-symbol nil) nil) (equal (replace-symbol '(a)) '(e)) (equal (replace-symbol '(e)) '(e)) (equal (replace-symbol '(b)) '(d)) (equal (replace-symbol '(d)) '(d)) (equal (replace-symbol '(a e b d c)) '(e e d d c)) Butun bunlardan T (true) cevabinin donmesi gerekiyor. Eger takildigin yer olursa tekrar sor, ama yaptigin seyleri yine gonder ki yorum yapabilelim. Son olarak: Kendi fonksiyonuna bakarsan, bir kontrat hazirlamadigin icin liste geri gondermen gereken yerlerde 1, 'e, 'd gibi seyler gonderdigini goreceksin. Aslinda kodun tamamen yanlis :) COMP/FM 149 Ogrencileri: Siz de acilen Scheme ile ayni programi tasarlayip yaziyorsunuz. Firsat bu firsat. 10 dakikalik bir is ve ekstra odev size :) -- vst aykut "ÿffffe7aÿfffff0layan" <[EMAIL PROTECTED]> writes: > I try to replace some elements of a list through using > recursive function; but i cannot. Can you advise me? > > > Function: replace a with e, and b with d. > (defun replace (lst) > (cond ((null lst) 1) > ((eq lst 'a) 'e) > ((eq lst 'b) 'd) > (t (cons ((car (lst)) (replace > (cdr lst))))))) > > What is wrong with that code? > > > > __________________________________________________ > Do You Yahoo!? > Tired of spam? Yahoo! Mail has the best spam protection around > http://mail.yahoo.com > > _______________________________________________ > 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
pgpmSd4ZHcnNk.pgp
Description: PGP signature
_______________________________________________ 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