2010-03-04 28 views
7

Tôi biết rằng trong Lisp một danh sách phải kết thúc với con số không, nhưng biểu hiện nhưLên danh sách các con số không trong Lisp

(print (cons 1 (cons 3 2))) 

không ném bất kỳ lỗi nào. Bản in:

(1 3 . 2) 

Có đúng không?

Tôi đang sử dụng GNU Clisp.

Trả lời

9

Những gì bạn có là dotted list, là một loại improper list.

Một chuỗi các ô CONS trong đó CDR cuối cùng là NIL là .

-1

Khi bạn lặp qua danh sách, bạn biết bạn đã đạt đến kết thúc khi bạn đạt đến số không. Những gì bạn có là một danh sách với một chiếc xe hơi và một cặp điểm.

11

Trong Lisp, thích hợp danh sách kết thúc bằng NIL, nhưng bạn cũng có không đúng danh sách. Một loại danh sách không đúng là danh sách trong đó ô đối thủ cuối cùng có một nguyên tử khác với NIL trong số CDR. (1 3 . 2) chính xác là một danh sách không đúng.

Bạn thậm chí có thể có danh sách không đúng nơi không có ô cuối cùng. CAR s và CDR s về cơ bản chỉ là con trỏ, vì vậy bạn có thể có thông tư danh sách!

Trong Lisp chung (ngôn ngữ CLISP thực hiện), nhiều hàm chuẩn sẽ không hoạt động với danh sách không đúng làm đối số.

3

Nó cũng thú vị cần lưu ý những gì xảy ra khi đánh giá danh sách thích hợp:

;; A proper list 
(cons '+ (cons 5 (cons 10 '()))) 
⇒ (+ 5 10) 
(eval (+ 5 10)) 
⇒ 15 

so với đánh giá danh sách chấm:

;; A dotted list 
(cons '+ (cons 5 (cons 10 5000))) 
⇒ (+ 5 10 . 5000) 
(eval (+ 5 10 . 5000)) 
⇒ 15 

Nó bỏ qua các nguyên tử chấm dứt.

+0

Cảm ơn. Thú vị lưu ý. –

Các vấn đề liên quan