7

私はいつもこの種のことをしていることに気づきます。このようなことを簡単にするためにマクロ/関数を書くことを考えていましたが、おそらく車輪の再発明をしているのではないかと思います。

これと同じようなことをもっと簡潔に実現できる既存の機能はありますか?

(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))  
4

3 に答える 3

22

これを行う組み込みの方法がいくつかあります。1つの方法は次のとおりです。

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

そしてもう一つ:

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

そしてさらに別:

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

など... SERIESIterateもあります。Iterate バージョンは LOOP バージョンと同じですが、SERIES バージョンは興味深いものです。

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

そうです、車輪を再発明する可能性が非常に高いのです。:-)

于 2008-09-02T04:37:55.650 に答える
6

必要な機能はremove-if-not、組み込みの です。

(defun remove-low-words (word-list)
  (remove-if-not #'good-enough-score-p word-list))

リストに関係する何かを再発明しているように感じるなら、おそらくそうです。Hyperspec をチェックして確認してください。

于 2008-09-17T14:48:26.273 に答える
-2

これを行うにはいくつかの方法があります。まず、おそらく最も簡単に、再帰的に行うことができます。

(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))))

mapcarまた、 andを使用して行うこともできreduceます。前者は失敗した要素を に置き換えたリストを作成しnil、後者は を除外するために使用できますnil

どちらも、リストを受け取り、何らかの述語によってフィルタリングされたリストを返す「フィルター」マクロまたは関数の良い候補になります。

于 2008-09-01T23:19:31.440 に答える