2010-08-13 32 views
5

tôi đang tìm kiếm một cách để "bật" một phần tử từ một danh sách liên kết, hay nói cách khác là "phá hoại" assoc:Popping một phần tử từ một danh sách liên kết trong lisp (elisp)

(setq alist '((a . 1) (b . 2)) 
(assoc-pop 'a alist) ;; -> (a . 1) 
;; alist -> ((b . 2)) 

Are có bất kỳ chức năng trong khai thác elisp? Cách thanh lịch nhất để có được chức năng tương tự là gì? (không chắc chắn rằng loại "tác dụng phụ" này là một thực hành tốt, ngay cả khi có thể!)

Trả lời

3

Không có built-in điều hành như vậy mà tôi biết, nhưng tôi nghĩ rằng bạn có thể nhận được chức năng này khá nhanh chóng:

(defmacro assoc-pop (key alist) 
    `(let ((result (assoc ,key ,alist))) 
    (setq ,alist (delete result ,alist)) 
    result)) 
1

assq-delete-all gần với những gì bạn muốn. Nó tìm kiếm các yếu tố theo nhận dạng đối tượng (eq), chứ không phải bằng giá trị bình đẳng (equal). Nó loại bỏ tất cả các yếu tố phù hợp, không chỉ là các yếu tố đầu tiên. Nó trả về danh sách đã sửa đổi. Bạn có thể điều chỉnh mã của hàm này để làm những gì bạn muốn. (Nhưng nếu bạn đang đi để gọi assoc-pop trong vòng một, và tất cả các phím của bạn là biểu tượng, assq-delete-all làm tất cả bạn cần.)

Lưu ý rằng "a"'a là đối tượng hoàn toàn khác nhau: đầu tiên là một chuỗi, thứ hai là một biểu tượng. Dòng thứ hai của bạn phải là (assoc-pop 'a alist).

Nhưng trên thực tế, cuộc gọi (assoc-pop 'a alist) không thể hoạt động (trừ khi assoc-pop là macro), vì không thể xóa phần tử đầu tiên trong danh sách. Bạn có thể tạo một hàm nhận biểu tượng làm đối số và sửa đổi danh sách là giá trị của biểu tượng, theo mô hình của add-to-list. Bạn sẽ gọi nó là (assoc-pop 'a 'alist).

+0

Cảm ơn bạn cũng cho điểm về các biểu tượng, Tôi mới để lisp và tôi chưa nắm bắt được công cụ biểu tượng/danh sách/other_things. Tôi đang sửa lỗi! – pygabriel

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