Карта лени в clojure - PullRequest
       30

Карта лени в clojure

6 голосов
/ 25 ноября 2011

Я создаю простой Swing GUI в Clojure. Я пытаюсь применить одну функцию к нескольким компонентам GUI, используя карту в контексте let:

(map #(f % component4) [component1 component2 component3])

Где все компоненты определены в let.

Проблема заключается в том, что карта ленивая, и действие не применяется к компонентам, однако я могу принудительно принудительно применить это, заключив вышеизложенное в 'take'.

Есть ли ленивая альтернатива карте? Или я должен идти об этом по-другому?

EDIT: Использование против часовой стрелки в затмении. У меня были разные результаты с использованием (используйте 'Lib: reload) из REPL и использованием CTRL + Enter из редактора. Перезагрузка запустит графический интерфейс, но возникнет проблема, описанная выше. Проблема не возникала при использовании CTRL + Enter из редактора, поэтому я думаю, что мое описание проблемы может быть неточным. В любом случае, дозаq, кажется, является лучшей альтернативой карте в этом сценарии.

Ответы [ 3 ]

17 голосов
/ 25 ноября 2011

Я оспариваю ваше утверждение, что участие take имеет какое-либо значение. Если вы обернули его в doall или dorun, он будет делать то, что вы хотите, но вы должны рассмотреть возможность использования doseq вместо map для такого рода действий только с побочными эффектами.

Примечание

Первоначально опубликовано как комментарий к вопросу; Скопировано для ответа по многочисленным просьбам.

8 голосов
/ 25 ноября 2011

дозыq , вероятно, лучший способ приблизиться к этому. Дозировка примерно эквивалентна выражению «для каждого», которое повторяется над каждым элементом коллекции во многих других языках. Это гарантированно будет ленивым.

(doseq 
  [comp [component1 component2 component3]]
  (f comp component4))

Несколько общих советов:

  • Используйте map и его ленивых друзей (включая взятие, отбрасывание и т. Д.), Когда вы хотите последовательность в качестве выхода
  • Используйте дозыq , doall , dotimes и т. Д., Когда вас больше интересуют побочные эффекты
2 голосов
/ 25 ноября 2011

Завершение вашей карты в дуал заставит ее оценить.или лучшая альтернатива - доза, которая используется для лечения побочных эффектов.

...