2017-08-03 13 views
7

Dường như hầu hết (nếu không phải tất cả) toàn cầu declarations không thể được hoàn nguyên theo cách ANSI CL tiêu chuẩn.Làm cách nào để hoàn tác tuyên bố `declaration`?

Ví dụ: khi bạn đánh giá (trực tiếp hoặc bằng cách tải một tập tin) là một hình thức như (proclaim '(declaration my-decl)) hoặc (declaim (special *my-var*)) không có di cách để làm cho (declare (my-decl ...)) bất hợp pháp hoặc *my-var* từ vựng.

Cung cấp triển khai khác nhau cách không di động để hoàn nguyên việc khai báo special, thường qua (proclaim '(notspecial *my-var*)) hoặc một số thủ thuật khác.

Làm thế nào về declarationproclamation?

Cách triển khai khác nhau hoàn tác? Bạn sẽ triển khai nó như thế nào? Bạn có nghĩ rằng (proclaim '(notdeclaration my-decl)) là một ý tưởng hay không?

Động lực: trong bộ thử nghiệm, sẽ tốt hơn nếu là mô-đun - để có thể hoàn nguyên tất cả các hiệu ứng của báo cáo thử để tránh bất kỳ sự can thiệp nào có thể xảy ra với bộ phần mềm thử nghiệm. Tôi biết đó là động lực một tuần vì The Right Way là sử dụng packages.

+0

Hmm. Điều gì xảy ra nếu bạn unintern biểu tượng cho biến? Điều này có lẽ sẽ là một ý tưởng tồi vì nó sẽ mess up bất kỳ ranh giới giữa cũ/mới tài liệu tham khảo để biểu tượng –

+0

Tôi không thấy bất kỳ cách thích hợp để làm điều đó trong SBCL, nhưng nó có vẻ như '(setf (sb-int: info : khai báo: được công nhận tên-of-the-declaration) nil) 'sẽ làm điều đó. – jkiiski

Trả lời

1

Một cách có thể là cung cấp cơ chế giao dịch (rollback/commit). Này được lấy từ archive xách của Naggum của:

tôi bỏ lỡ một cơ sở giao dịch, nơi tôi có thể làm cho một số thay đổi
vào hệ thống mà chỉ hiển thị cho chủ đề của tôi về một
môi trường đa luồng thực hiện và sau đó loại bỏ chúng hoặc cam kết tất cả tại
một lần. Ví dụ: tải một tệp có thể là sự chuyển mã như vậy. Báo hiệu
lỗi trong quá trình tải có thể làm cho toàn bộ hoạt động
trước khi hủy bỏ thay vì rời hệ thống ở trạng thái được sửa đổi một phần
. Đây không phải là không thể xây dựng trên đầu trang của
hệ thống hiện có, nhưng nó có nỗ lực đáng kể, do đó, nó là
loại điều mà các lập trình viên hệ thống Common Lisp nên làm.

Bạn sẽ bỏ lỡ khả năng undo chỉ là một tập hợp con của các tờ khai, như (declare A), (declare B), (undeclare A) nhưng với động lực của bạn, nó sẽ không là một vấn đề bởi vì bạn có khả năng muốn phục hồi lại tất cả các tờ khai có thể được thực hiện trong bài kiểm tra.

Bạn có thể cung cấp biểu mẫu đặc biệt cho các khai báo "không hoàn tác" riêng lẻ. Tôi muốn đặt tên nó là rút lại, nhưng điều này có thể khó xác định trong một số trường hợp. Giả sử bạn khai báo rằng x là một chuỗi hoặc một số, bạn có thể rút lại một khai báo cho biết x là một chuỗi không? Điều gì về chức năng nội tuyến, vv? Giao dịch trông dễ thực hiện hơn, ví dụ: một môi trường tạm thời.

+0

Tôi đã hỏi về một cú pháp có thể tiếp xúc với cơ chế, nhưng cách tiếp cận giao dịch thực sự thú vị. – sds

+0

@sds Đối với cú pháp, tôi muốn có '(declaim (not X))' với X bất kỳ biểu thức khai báo hợp lệ nào khác với biểu tượng 'notdeclaration' cho mỗi' khai báo' hợp lệ. Ngoài ra, 'không' có thể gây nhầm lẫn:' (khai báo (không (loại T X))) 'thường không giống với' (khai báo (kiểu (không phải T) X)) '. Prolog có 'assert' và' retract' built-in, có thể '(rút lại khai báo)' sẽ tốt hơn. – coredump

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