2008-09-01 30 views
7

Tôi thấy mình luôn làm điều này. Tôi đã xem xét viết một macro/chức năng để làm cho loại điều này dễ dàng hơn, nhưng nó xảy ra với tôi rằng tôi có thể tái phát minh ra bánh xe.Thành ngữ lisp phổ biến - có cách nào tốt hơn không?

Có một chức năng hiện có sẽ cho phép tôi thực hiện cùng một loại điều ngắn gọn hơn không?

(defun remove-low-words (word-list) 
    "Return a list with words of insufficient score removed." 
    (let ((result nil)) 
    (dolist (word word-list) 
     (when (good-enough-score-p word) (push word result)))          
    result)) 

Trả lời

23

Có một số cách tích hợp để thực hiện việc này. Một cách sẽ là:

(remove-if-not 'good-enough-score-p word-list) 

Và khác:

(loop for word in word-list 
     when (good-enough-score-p word) 
     collect word) 

Tuy nhiên khác:

(mapcan (lambda (word) 
      (when (good-enough-score-p word) 
      (list word))) 
     word-list) 

Etc ... Ngoài ra còn có SERIESIterate. Phiên bản làm lại là giống hệt với phiên bản LOOP, nhưng phiên bản SERIES là thú vị:

(collect (choose-if 'good-enough-score-p (scan word-list)))) 

Vì vậy, có, bạn rất có khả năng tái tạo lại một số bánh xe. :-)

+0

Cảm ơn bạn - Tôi chưa bao giờ thực sự đưa ra một lý do để sử dụng mapcan trước đây, nhưng điều này cho tôi thấy con đường. Đối với ví dụ cụ thể này, remove-if/remove-if-not là tốt hơn, nhưng vẫn rất đẹp. – khedron

-2

Có một số cách bạn có thể thực hiện việc này. Đầu tiên, và có lẽ dễ dàng nhất, bạn có thể làm điều đó một cách đệ quy.

(defun remove-low-words (word-list) 
    (if (good-enough-score-p (car word-list)) 
     (list word (remove-low-words (cdr word-list))) 
     (remove-low-words (cdr word-list)))) 

Bạn cũng có thể làm điều đó với mapcarreduce, nơi trước đây có thể tạo ra cho bạn một danh sách với các yếu tố không thay thế bằng nil và sau này có thể được sử dụng để lọc ra các nil.

Hoặc là ứng cử viên tốt cho macro hoặc hàm "lọc" có danh sách và trả về danh sách được lọc bởi một số biến vị ngữ.

+0

Tôi tin rằng phiên bản của bạn không có trường hợp cơ sở, trong số những vấn đề khác. –

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