2013-06-11 28 views
7

Định nghĩa chính xác của phá hủykhông phá hủy cấu trúc trong LISP (hoặc nói chung). Tôi đã cố gắng tìm kiếm ý nghĩa thực sự nhưng tôi chỉ tìm thấy rất nhiều cách sử dụng các thuật ngữ này mà không thực sự giải thích chúng.LISP - cấu trúc phá hoại và không phá hủy

Theo hiểu biết của tôi, hàm phá hoại có nghĩa là thay đổi ý nghĩa của cấu trúc (hoặc biến) - vì vậy khi tôi chuyển danh sách thành tham số cho hàm nó được gọi là hoạt động phá hoại, bởi vì nó thay đổi danh sách ban đầu và trả về một danh sách mới. Điều này đúng hay có một số ngoại lệ?

Ví dụ như đặt một hàm phá hoại (vì nó thay đổi giá trị của x)? Tôi nghĩ rằng không nhưng tôi không làm thế nào, làm thế nào tôi sẽ biện minh cho điều này.

(set 'x 1) 

Xin lỗi vì có thể là một câu hỏi rất cơ bản .... Cảm ơn bạn đã trả lời!

+2

Cũng thấy câu hỏi này: [pushnew không hỗ trợ địa điểm. Nó được coi là một vĩ mô phá hoại?] (Http://stackoverflow.com/q/16789594/1281433). Một số câu trả lời có thảo luận về các khái niệm về cấu trúc phá hoại và không phá hủy. –

Trả lời

6

Tôi sẽ không diễn giải quá nhiều vào từ 'phá hoại'.

Trong xử lý danh sách, hoạt động phá hoại là một hoạt động có khả năng thay đổi một hoặc nhiều danh sách đầu vào dưới dạng hiệu ứng phụ có thể nhìn thấy.

Bây giờ bạn có thể mở rộng ý nghĩa cho các hoạt động trên mảng, cấu trúc, đối tượng CLOS, v.v. Bạn cũng có thể gọi gán biến 'phá hoại' và cứ thế.

Nói chung, Lisp có ý nghĩa khi nói về các hoạt động phá hoại trên chuỗi (đó là danh sách, chuỗi và vectơ nói chung) và mảng đa chiều.

5

Practical Common Lisp phân biệt hai loại hoạt động phá hoại: cho-tác dụng phụ hoạt động và tái chế hoạt động.

set là phá hoại và có hiệu ứng phụ: nó luôn thay đổi đối số đầu tiên của nó. Hãy cẩn thận, rằng nó thay đổi ràng buộc cho một biểu tượng, nhưng không phải là điều hiện đang bị ràng buộc với biểu tượng đó. setf có thể thay đổi các ràng buộc hoặc đối tượng tại chỗ.

Ngược lại, nreverse là tái chế: nó là phép để sửa đổi danh sách đối số của nó, mặc dù không có đảm bảo rằng nó sẽ, vì vậy nó nên được sử dụng giống như reverse (lấy giá trị trả về), ngoại trừ việc đối số đầu vào có thể bị "hủy" và không còn được sử dụng nữa. [Lập trình Đề án có thể gọi đây là chức năng "cập nhật tuyến tính".]