Идиома языка Common LISP - является там лучшим путем?

Я не знаком с Python 3.1, но будет ли это работать?

[chr(x) for x in [66, 53, 0, 94]]
7
задан Múna 7 March 2014 в 10:03
поделиться

3 ответа

Существует несколько встроенных способов сделать это. Один путь был бы:

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

И т.д... Существует также РЯД, и Выполнить итерации. Выполнить итерации версия идентична версии ЦИКЛА, но СЕРИЙНАЯ версия интересна:

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

Так, да, Вы, очень вероятно, заново изобретите некоторое колесо.:-)

22
ответ дан 6 December 2019 в 06:52
поделиться

Функция, которую Вы хотите, remove-if-not, который встроен.

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

Если Вы чувствуете, что переосмысливаете что-то, чтобы сделать со списками, Вы, вероятно. Проверьте Гиперспецификацию для наблюдения.

6
ответ дан 6 December 2019 в 06:52
поделиться

Существует пара путями, можно сделать это. Во-первых, и вероятно наиболее легко, можно сделать это рекурсивно.

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

Или был бы хороший кандидат на макрос "фильтра" или функцию, которая берет список и возвращает список, фильтрованный некоторым предикатом.

-2
ответ дан 6 December 2019 в 06:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: