2009-11-06 10 views
5

Bunun bir n00b sorusu olduğunu anlıyorum, ama merak ediyorum ve burada başka bir yerde olduğundan daha iyi bir açıklama alabileceğimi düşündüm. İşte benceŞemada uygun bir liste almak için niçin nezaketiniz var?

> (list 1 2 3) 
(1 2 3) 

bunun için sadece şeker (Dr. Scheme kullanıyorum) bir liste:

> (cons 1 (cons 2 (cons 3 null))) 
(1 2 3) 

Bu, diğer taraftan, başka bir şey yapar:

> (cons 1 (cons 2 3)) 
(1 2 . 3) 

Sorularım neden bu kadar farklı? Listenin sonunda null değerini gerektiren nokta nedir?

cevap

11

Bir listenin tanımı özyinelemeli.

1. null =>() --read as empty list 
2. cons 3 null => (3) 
3. cons2 (cons 3 null) => (2, 3) 

son örnek, bunu liste tanımı bu yüzden onun değil bir listeye uymuyor eksilerini 2 3 verdi:

1. The null list (empty list) is a list 
2. A list is made up of an item cons a list 

Yani bu listeler vardır. Bu bir madde ve bir liste kabul eder. 3 bir liste değildir.

2

cons bir liste başına yeni bir öğe ekler, böylece size yazarken ne yaptığınızı:

(cons 1 (cons 2 (cons 3 null))) 

yinelemeli, null başlayarak sürekli büyüyen listeye öğe ekleyerek hangi olduğu boş liste() olarak tanımlanmıştır. (cons 2 3)'u aradığınızda, başlamak için boş listeden başlamıyorsunuz, bu yüzden 2'ye başlayarak bir liste oluşturmuyorsunuz.

0

bir aleyhte deyimi kimin araba obj1 olan bir çift tahsis etmek için kullanılır ve kimin cdr

(cons obj1 obj2) 

nedenle obj2, bu gereklidir biz son biliyorum böylece bir null eksileri deyimi sonlandırmak için listenin

> (cons 1 (cons 2 3)) 
(1 2 . 3) 

Bu örnekte, CDR 2 araba ve 3 CDR bir çifti < 2,3> olur. Aynı Değil olarak:

(list 1 2 3) 
2

Projesi de dahil Lisps, dinamik yazıldığında ve 'lisp şekilde' tek bir veri yapısı üzerinde birçok işlevi yerine farklı görevler için farklı veri yapılarını sahip olmaktır.

Yani soru "listenin sonunda null adlı gerektiren noktası nedir?" sormak için doğru olanı değil.

cons işlevi, cons nesnesini veya nil ikinci bağımsız değişkeni olarak vermenizi gerektirmez. Ikinci bağımsız değişken cons nesnesi veya nil değilse, bir liste yerine bir çift alırsınız ve çalışma zamanı liste notasyonu kullanarak ancak bir nokta ile yazdırmaz.

Yani bir listede şeklindedir şey inşa etmek istiyorsanız, o zaman cons ikinci argüman olarak bir liste verir.Başka bir şey inşa etmek istiyorsanız, ikinci argümanı olarak cons başka bir şey verin.

Çiftler, tam olarak iki değeri olan bir veri yapısı istiyorsanız yararlıdır. Bir çift ile, uzunluğunu işaretlemek için sonunda nil gerekmez, bu yüzden biraz daha verimli. Çiftlerin bir listesi, bir anahtarın değer haritasının basit bir uygulamasıdır; Ortak lisp, standart kütüphanesinin bir parçası olarak bu tür emlak listelerini destekleyecek işlevlere sahiptir.

Asıl soru, "neden aynı çiftleri ve listeleri aynı cons işleviyle oluşturursunuz?" Sorusunun yanıtı, "neden yalnızca bir taneye ihtiyaç duyduğunuzda iki veri yapısına sahipsiniz?"

İlgili konular