常见的lisp习语 - 有更好的方法吗?

r00*_*00k 7 common-lisp

我发现自己一直在做这种事情.我一直在考虑编写一个宏/函数来使这种事情更容易,但我发现我可能正在重新发明轮子.

是否有现有的功能可以让我更简洁地完成同样的事情?

(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))  
Run Code Online (Sandbox Code Playgroud)

Luí*_*ira 22

有几种内置的方法可以做到这一点.一种方法是:

(remove-if-not 'good-enough-score-p word-list)
Run Code Online (Sandbox Code Playgroud)

而另一个:

(loop for word in word-list  
      when (good-enough-score-p word)
      collect word)
Run Code Online (Sandbox Code Playgroud)

而另一个:

(mapcan (lambda (word)
          (when (good-enough-score-p word)
            (list word)))
        word-list)
Run Code Online (Sandbox Code Playgroud)

等等......还有SERIESIterate.Iterate版本与LOOP版本相同,但SERIES版本很有趣:

(collect (choose-if 'good-enough-score-p (scan word-list))))
Run Code Online (Sandbox Code Playgroud)

所以,是的,你很可能会重新发明一些轮子.:-)


Nat*_*ers 6

您想要的功能remove-if-not是内置的.

(defun remove-low-words (word-list)
  (remove-if-not #'good-enough-score-p word-list))
Run Code Online (Sandbox Code Playgroud)

如果你觉得你正在重新发明与列表有关的东西,你可能就是这样.检查Hyperspec以查看.