2013-04-02 47 views
5

Tôi đang sử dụng SBCL, emacs, slime và quicklisp để cài đặt các gói khác nhau.Trong Lisp chung một đại diện được in là gì?

tôi nhanh chóng và bắt đầu một chất nhận Hunchentoot như vậy,

CL-USER> (hunchentoot:start (make-instance 'hunchentoot:acceptor :port 4242)) 
#<HUNCHENTOOT:ACCEPTOR (host *, port 4242)> 

tôi thử nghiệm bằng cách mở trình duyệt trên cổng 4242 và nó hoạt động tốt.

Sau đó, để ngăn chặn nó, tôi có thể sao chép các đại diện được in và phát hành lệnh, như vậy:

CL-USER> (hunchentoot:stop #<HUNCHENTOOT:ACCEPTOR (host *, port 4242)>) 
#<HUNCHENTOOT:ACCEPTOR (host *, port 4242)> 

chỉ này hoạt động với các đại diện in được trả về bởi sự khởi đầu tương ứng.

Điều này thật bất ngờ đối với tôi. Tôi nghĩ rằng các đại diện in đã được chỉ đơn giản là văn bản trả lại, có lẽ vì các đối tượng chính nó không thể được hiển thị. Như vậy, tôi nghĩ rằng nó đã được khá gọn gàng rằng hunchentoot: dừng lại có thể sử dụng chuỗi văn bản để tìm đối tượng. Nhưng sau đó với nhiều thử nghiệm, tôi nhận thấy rằng tôi đã phải sử dụng các đại diện in tương ứng với sự bắt đầu, không chỉ bất kỳ một. Tôi cũng nhận thấy rằng khi tôi đặt chuột lên biểu diễn được in, nó sẽ làm nổi bật toàn bộ phân đoạn. Vì vậy, nó không phải là văn bản ở tất cả, nhưng đối tượng đó là thực sự trong REPL, và tôi có thể sử dụng nó.

Vì vậy, một mặt những gì được trả về là một đại diện in để tôi có thể nhìn thấy nó, nhưng mặt khác nó là đối tượng thực tế mà tôi có thể sao chép và dán vào REPL. Thê nay đung không? Tôi đoán nó phải là vì tôi đang làm nó. Điều này hoàn toàn tuyệt vời với tôi.

Mọi lời giải thích hoặc thông tin chi tiết sẽ được đánh giá cao.

Trả lời

6

Đây được gọi là 'Bản trình bày'. Xem Hướng dẫn sử dụng SLIME, Presentations.

Các tài liệu cũng giải thích những gì sẽ xảy ra nếu các đối tượng không đi xa ...

Ý tưởng chủ yếu xuất phát từ BBN (Zdybel, et al., An Hệ thống thông tin trình bày, 1981), sau đó các Symbolics Lisp Máy và di động Common Lisp Interface Manager, ghi lại các đối tượng bên dưới trong quá trình xuất trong hệ thống cửa sổ của nó. Các bản trình bày này hoạt động cho đầu ra đồ họa và văn bản và là cơ sở quan trọng cho giao diện người dùng của nó.

SLIME đã chọn ý tưởng cho REPL của nó.

+0

Tuyệt vời. Cảm ơn bạn đã liên kết đến hướng dẫn sử dụng, và để tham khảo Zdybel (Google dễ dàng tìm thấy một tệp PDF). – kes

7

Đây là "ma thuật" SLIME. Trong thực tế, bạn không thể làm bất cứ điều gì với "đại diện in" như vậy trong Lisp, bởi vì nó được coi là một đối tượng không đọc được: hãy thử nó trong chế độ giao diện điều khiển của việc thực hiện của bạn. Nhưng SLIME nhớ các hiệp hội để các đối tượng thực tế, vì vậy nó sẽ thay thế các đối tượng cho rằng #<...> điều - loại giống như một máy Lisp ...

gì sẽ làm việc một cách chính xác và luôn luôn là thế này:

CL-USER> (defvar *server* (hunchentoot:start (make-instance 'hunchentoot:easy-acceptor :port 4242))) 
*server* 
CL-USER> (hunchentoot:stop *server*) 
#<HUNCHENTOOT:ACCEPTOR (host *, port 4242)> 
+2

Có, tôi thường lưu đối tượng để tôi có thể dừng lại. Vì vậy, SLIME là nhận được đối tượng trả về và liên kết nó với đại diện in. Nó làm điều này với lambdas trở lại quá. Tính năng tuyệt vời không biết nó ở đó. Ngoại trừ việc nó đặt ra một câu hỏi: nếu tôi không muốn tất cả các đối tượng vẫn còn tồn tại thì sao? Có lẽ việc xóa bộ đệm sẽ giết chúng. Nó chắc chắn sẽ làm cho họ không thể tiếp cận. Có thể đó là xứng đáng với một câu hỏi khác hoàn toàn. – kes