Có rất nhiều cách để lọc hoặc chọn nội dung từ danh sách bằng cách sử dụng công cụ dựng sẵn nhanh hơn nhiều so với vòng lặp. Có thể sử dụng remove-if tích hợp theo cách này. Ví dụ, giả sử tôi muốn thả các phần tử từ 3 đến 10 trong danh sách MyList. Thực thi đoạn mã sau làm ví dụ:
(let ((MyList (number-sequence 0 9))
(Index -1)
)
(remove-if #'(lambda (Elt)
(setq Index (1+ Index))
(and (>= Index 3) (<= Index 5))
)
MyList
)
)
Bạn sẽ nhận được '(0 1 2 6 7 8 9).
Giả sử bạn chỉ muốn giữ các phần tử từ 3 đến 5. Bạn về cơ bản, lật điều kiện mà tôi đã viết ở trên trong vị từ.
(let ((MyList (number-sequence 0 9))
(Index -1)
)
(remove-if #'(lambda (Elt)
(setq Index (1+ Index))
(or (< Index 3) (> Index 5))
)
MyList
)
)
Bạn sẽ nhận được '(3 4 5)
Bạn có thể sử dụng bất cứ điều gì bạn cần cho vị mà bạn phải cung cấp để loại bỏ-nếu. Giới hạn duy nhất là trí tưởng tượng của bạn về những gì để sử dụng. Bạn có thể sử dụng các chức năng lọc tuần tự, nhưng bạn không cần chúng. Ngoài ra, bạn cũng có thể sử dụng mapcar hoặc mapcar * để lặp qua danh sách bằng cách sử dụng một số chức năng để chuyển các mục cụ thể thành không và sử dụng (remove-if nil ...) để thả nils.
Nguồn
2017-06-22 22:49:47
Tôi muốn chỉ ra rằng hàm '# 'remove-if-not' không được dùng trong Common Lisp [¹] (http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/ HyperSpec/Body/fun_removecm__elete-if-not.html) trong đó bộ lọc sẽ được viết '(remove-if (bổ sung # 'evenp)' (1 2 3 4 5))' hoặc đơn giản '(remove-if # 'oddp' (1 2 3 4 5)) '- chức năng' bổ sung' không tồn tại trong Emacs Lisp với kiến thức của tôi. –
Xin vui lòng sử dụng gói * cl-lib * và sử dụng chức năng ** cl-remove-if-not ** để thay thế. –