문제

나는 항상 이런 일을 하고 있는 나 자신을 발견한다.나는 이런 종류의 일을 더 쉽게 만들기 위해 매크로/함수 작성을 고려해 왔지만 아마도 바퀴를 다시 발명하고 있는 것 같습니다.

이와 동일한 종류의 작업을 더 간결하게 수행할 수 있는 기존 함수가 있습니까?

(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))  
도움이 되었습니까?

해결책

이를 수행하는 몇 가지 기본 제공 방법이 있습니다.한 가지 방법은 다음과 같습니다.

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

등...또한 있습니다 시리즈 그리고 반복.Iterate 버전은 LOOP 버전과 동일하지만 SERIES 버전이 흥미롭습니다.

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

그렇습니다. 당신은 재발명할 가능성이 매우 높습니다. 일부 바퀴.:-)

다른 팁

원하시는 기능은 remove-if-not, 내장되어 있습니다.

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

목록과 관련된 무언가를 다시 만들고 있다고 느낀다면 아마도 그럴 것입니다.Hyperspec을 확인하여 확인하세요.

이를 수행할 수 있는 몇 가지 방법이 있습니다.첫째, 아마도 가장 쉽게 재귀적으로 수행할 수 있습니다.

(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 그리고 reduce, 여기서 전자는 실패한 요소가 다음으로 대체된 목록을 구성할 수 있습니다. nil 후자는 다음을 필터링하는 데 사용될 수 있습니다. nil.

둘 중 하나는 목록을 취하고 일부 조건자에 의해 필터링된 목록을 반환하는 "필터" 매크로 또는 함수에 대한 좋은 후보가 될 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top