(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

Attachment: 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

Cevap