(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
Post by ÿffffe7aÿfffff0layanI 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
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp