Thật dễ hiểu nếu bạn nghĩ về chúng là cons-cells.
Tóm lại, ô khuyết điểm bao gồm chính xác hai giá trị. Ký pháp thông thường cho điều này là sử dụng dấu chấm, ví dụ:
(cons 'a 'b) ==> (A . B)
Nhưng vì danh sách được sử dụng thường xuyên trong LISP, ký hiệu tốt hơn là thả dấu chấm. Danh sách được thực hiện bằng cách có phần tử thứ hai là ô đối âm mới, với kết thúc cuối cùng là một terminator (thường là nil, hoặc '()
trong Common Lisp). Vì vậy, hai người đều bình đẳng:
(cons 'a (cons 'b '())) ==> (A B)
(list 'a 'b) ==> (A B)
Vì vậy (cons 'a 'b)
tạo ra một tế bào [a,b]
, và (list 'a 'b)
sẽ tạo [a, [b, nil]]
. Lưu ý quy ước cho danh sách mã hóa trong ô đối sánh: Chúng kết thúc bằng một bên trong nil
.
Bây giờ, nếu bạn chống số 'a
vào danh sách cuối cùng, bạn tạo ô đối âm mới có chứa [[a, [b, nil]], a]
. Vì đây không phải là danh sách "phù hợp", tức là danh sách này không bị chấm dứt bằng nil
, cách viết ra là sử dụng dấu chấm: (cons '(a b) 'a) ==> ((a b) . a)
.
Nếu chấm không được in, nó sẽ phải là danh sách có cấu trúc [[a, [b, nil]], [a, nil]]
.
dụ bạn
Khi bạn làm (cons 'a '(a b))
nó sẽ mất biểu tượng 'a
và danh sách '(a b)
và đặt chúng trong một tế bào khuyết điểm mới. Vì vậy, điều này sẽ bao gồm [a, [a, [b, nil]]]
. Vì điều này tự nhiên kết thúc với một bên trong nil
, nó được viết mà không có dấu chấm.
Đối với (cons '(a b) 'a)
, bây giờ bạn sẽ nhận được [[a, [b, nil]], a]
. Điều này làm không chấm dứt với một bên trong nil
và do đó ký hiệu dấu chấm sẽ được sử dụng.
Chúng ta có thể sử dụng khuyết điểm để làm ví dụ cuối cùng với một số không?Vâng, nếu chúng ta làm
(cons '(a b) (cons 'a '())) ==> ((A B) A)
Và, cuối cùng,
(list '(a b) 'a))
tương đương với
(cons (cons (cons 'a (cons 'b '())) (cons 'a '())))
Tôi nghĩ bạn sẽ tìm thấy câu trả lời cho câu hỏi của mình tại đây: http://stackoverflow.com/questions/20216711/dot-notation-in-scheme – erjiang
Tôi thấy cuốn sách này rất hữu ích cho việc học: http: // www .gigamonkeys.com/book/they-called-it-lisp-for-a-reason-list-processing.html – MicroVirus