2013-05-04 11 views
5
(define .. 
    (lambda (start stop) 
    (cond ((> (add1 start) stop) (quote())) 
      ((eq? (add1 start) stop) (sub1 stop)) 
      (else (cons start (.. (add1 start) stop)))))) 

Basit bir aralık işlevi tanımladım. niyet yerineLisp'deki özyinelik aralığı bir süre ekler?

(.. 1 5) --> (1 2 3 4) 

için, tuhaf bir dönem benim tuplea ekleniyor ve neden hiçbir fikrim yok: Bu neden oluyor anlamıyorum

(.. 1 5) --> (1 2 3 . 4) 

. Herhangi bir yardım

takdir
+0

'(' 1 2) 'işlevini kullanırken' cond' içinde hangi durumda kullanılır? Ne geri dönüyor? – Barmar

cevap

15

Şema bir listesi (bazı Lisps içinde nil olarak da bilinir) boş liste () veya olan car (aynı zamanda first olarak da bilinir) listenin bir elementtir ve cdr bir dezavantajları hücresi (ya da bir rest olarak da bilinir) ya listenin geri kalanı (yani, başka bir liste) ya da listeyi sonlandıran bir atomdur. Geleneksel sonlandırıcı () boş listesidir; () tarafından sonlandırılan listelerin "uygun listeler" olduğu söylenir. Başka bir atom tarafından sonlandırılmış listeler "uygunsuz listeler" olarak adlandırılır. (1 2 3 4 5) listesi 1, 2, 3, 4 ve 5 öğelerini içerir ve () ile sonlandırılır. Sistem baskılar bir aleyhte hücre, genel durum Örneğin

(car . cdr) 

bunu yazdırmak olduğunda, Şimdi

(cons 1 (cons 2 (cons 3 (cons 4 (cons 5()))))) 

bunu olustursaydiniz, (cons 1 2) sonucu

olarak yazdırılır
(1 . 2) 

Listeler cons hücresinden oluşturulduğundan, bu gösterimi de listelerde kullanabilirsiniz:

en lisps (Bildiğim kadarıyla tümü) eksileri hücreleri yazdırmak için özel bir durum var bu yüzden olsa da, oldukça aksak var
'(1 2 3 4 5) == 
'(1 . (2 . (3 . (4 . (5 .()))))) 

: cdr listesi (ya başka eksileri hücre veya ()) ise, daha sonra 'don t . yazdιrιn ve cdr nolu parantezin yazdιğιnι yazmayιn (aksi takdirde, bir liste olduğundan) yazdιrιn. Eğer

(1 2 3 . 4) 

gibi bir sonuç görüyorsanız Yani, sen atom 4 tarafından sonlandırılır uygunsuz bir listesi var demektir.

(1 . (2 . (3 . 4))) 

Şu anki soru şudur: kodunuzda liste yapımı ne işe yaradı?bu bir değil bir şey dönebilirsiniz gibi

((> (add1 start) stop) (quote())) 

ikinci vaka görünür: İlk vaka daima (boş liste) uygun bir liste döndürür: .. daima uygun bir listesini döndürür, bu yüzden vakaların bakalım gerekiyordu liste (varsayarak (sub1 stop) == (- stop 1) o):

: .. düzgün olsaydı ( (cons x y) y ise uygun bir liste olduğundan)

((eq? (add1 start) stop) (sub1 stop)) 

Şimdi, daha sonra üçüncü durumda her zaman düzgün bir liste dönen olurdu

(else (cons start (.. (add1 start) stop))) 

İkinci durumunuzu bir liste olarak döndürün ve her şeyin ayarlanmış olması gerekir. Uygun bir liste oluşturmak için cons için Amacıyla (list (sub1 stop))

okumak gerekiyor (sub1 stop)

+0

Tavsiyeniz için teşekkür ederiz - açıklama net ve anlaşılması kolaydı. – vim

1

Sizin ifadesi, ikinci eleman bir liste kendisi olması gerekiyor. Böylece, .. işleviniz, her cond yan tümcesi için bir tür liste döndürmelidir.

1

Kaldır cond

((eq? (add1 start) stop) (sub1 stop)) 

bir erken bitirmek sebep oluyor bu kısmı.

+0

+1. Az daha çoktur !!! :) :) –