2010-12-15 9 views
5

Tôi đang cố gắng để tìm ra cách để làm điều này bằng khuyết điểm:Làm thế nào để làm ((AB) (CD).) Trong lisp

((A . B) . (C . D))

nơi (A . B)(C . D) trong mỗi tế bào khuyết điểm

tôi đã cố gắng làm điều này (cons (cons 'a 'b) (cons 'c 'd)) nhưng nó mang lại cho tôi điều này:

((A.B) C . D)

tôi cũng tr IED này: (cons (cons 'a 'b) (cons (cons 'c 'd)())) nhưng nó mang lại cho tôi điều này:

((A . B) (C . D))

Bất kỳ ý tưởng làm thế nào để đạt được điều này?

+5

thứ hai trông giống như những gì bạn muốn. Theo cách nào thì nó không phù hợp? –

+0

@Anon: Cái thứ hai không có dấu chấm giữa. Nó thực sự là một giá trị khác nhau, bởi vì có một null (danh sách trống) trong đó. –

Trả lời

0

Tôi không hoàn toàn chắc chắn ý bạn là gì ... Tôi đồng ý với nhận xét ở trên rằng dòng cuối cùng của mã của bạn giống với dòng đầu tiên mà bạn đang đối sánh.

Dưới đây là một nguồn tài nguyên chung khá cho bạn dù sao đi nữa: http://www-2.cs.cmu.edu/~dst/LispBook/

7

Chỉ cần nhìn vào những gì bạn nhận lại khi bạn nhập vào một chữ ((A . B) . (C . D)):

 
* '((a . b) . (c . d)) 

((A . B) C . D) 

Có một defined algorithm máy in Lisp sử dụng để in ra các cấu trúc dữ liệu được xây dựng từ các cặp. Về cơ bản, bạn không bao giờ có thể có được một khuyết điểm để được in như một cặp chấm bên trong dấu ngoặc đơn khi nó là CDR của khuyết điểm khác.

Tuy nhiên, nó có thể tái cấu hình máy in để bạn có được hành vi mà bạn đang tìm kiếm, thông qua SET-PPRINT-DISPATCH:

 
(set-pprint-dispatch 'cons 
    (lambda (stream object) 
    (format stream "(~W . ~W)" (car object) (cdr object)))) 
 
* '((a . b) . (c . d)) 

((A . B) . (C . D)) 
* (cons (cons 'a 'b) (cons 'c 'd)) ;The same object 

((A . B) . (C . D)) 

Mặc dù trong dù rằng nó sẽ thẳng thắn được tốt hơn trong chạy dài nếu bạn cảm thấy thoải mái khi đọc hành vi mặc định.

0

Điều bạn đang tìm kiếm là không thể vì cách danh sách được thể hiện trong Lisp. Khi bạn tạo một danh sách, bạn đang tạo một chuỗi các ô khuyết điểm, trong đó ô của ô là giá trị của phần tử đó trong danh sách và cdr là tham chiếu đến ô đối thủ tiếp theo. Ô mong muốn của bạn, ((A . B) . (C . D)) có nghĩa là "tạo ô chống đối có ô là (A . B) và cdr là (C . D)". Điều đó tương đương với danh sách có phần tử đầu tiên là (A . B), phần tử thứ hai là C và đuôi của danh sách là D hoặc ((A . B) C . D).

+0

Tôi đã bình chọn, bởi vì bạn nói điều đó là không thể, sau đó giải thích tại sao nó tương đương với nỗ lực đầu tiên của mình! –

+0

Hội chợ. Tôi đã nói rằng không thể có được thông dịch viên đưa ra kết quả mà anh ta muốn. –

15

Thứ nhất là thứ bạn muốn. Chúng tương đương. Bạn có thể xác minh như sau:

1 ]=> (cons (cons 'a 'b) (cons 'c 'd)) 

;Value 11: ((a . b) c . d) 

1 ]=> (car (cons (cons 'a 'b) (cons 'c 'd))) 

;Value 12: (a . b) 

1 ]=> (cdr (cons (cons 'a 'b) (cons 'c 'd))) 

;Value 13: (c . d) 

Nhớ danh sách ô điều khiển. "Ô tô" là phần tử đầu của danh sách hoặc nửa đầu của ô khuyết điểm và cdr là phần còn lại của danh sách hoặc phần tử thứ hai của ô điều khiển.

Một cách khác để xác minh rằng họ đang tương đương:

1 ]=> '((a . b) . (c . d)) 

;Value 14: ((a . b) c . d) 
+0

Cảm ơn sự giúp đỡ của bạn Laurence! Đó là một mẹo hay nếu chúng tương đương – darkwingcode