Существует ли функция, подобная “andmap” в clojure?

MVP не обязательно сценарий, где Представление является главным (см. MVP Taligent, например).
я нахожу его неудачным, что люди все еще проповедуют, это как шаблон (Просмотрите ответственный) в противоположность антишаблону, поскольку это противоречит, "Это - просто представление" (Прагматически настроенный Программист). "Это - просто представление", указывает, что заключительное представление, показанное пользователю, является вопросом второстепенной важности приложения. Шаблон MVP Microsoft представляет повторное использование намного более трудных Представлений и удобно разработчик Microsoft оправданий от ободрительной плохой практики.

, Чтобы быть совершенно откровенным, я думаю, что базовые проблемы MVC сохраняются для любой реализации MVP, и различия являются почти совершенно семантическими. Пока Вы следуете за разделением проблем между представлением (который отображает данные), контроллер (который инициализирует и управляет взаимодействием с пользователем) и модель (базовые данные и/или сервисы)), тогда, Вы достигаете преимуществ MVC. Если Вы достигаете преимуществ тогда, кто действительно заботится, является ли Ваш шаблон MVC, MVP или Контроллером Наблюдения? [Только 114] реальные шаблон остается как MVC, остальные просто отличаются ароматы его.

Рассматривают этот очень захватывающая статья, которая всесторонне перечисляет много этих отличающихся реализаций. Можно отметить, что они все в основном делают то же самое, но немного по-другому.

я лично думаю, что MVP был только недавно повторно представлен как броский термин для или сокращения споров между семантическими фанатиками, которые спорят, является ли что-то действительно MVC или не или выровнять по ширине инструменты Microsofts Rapid Application Development. Ни одна из этих причин в моих книгах не выравнивает по ширине свое существование как отдельный шаблон разработки.

5
задан unj2 30 July 2009 в 22:49
поделиться

3 ответа

Вы можете использовать каждые? :

user=> (every? string? '("hi" 1))
false

Вот документация по каждые? .

9
ответ дан 18 December 2019 в 14:49
поделиться

Я написал andmap как макрос, который принимает предикаты в качестве аргументов и создает функцию, которая «обертывает и вокруг предикатов», т. Е.

(andmap integer? odd?) 
==>
(fn [x] (and (integer? x)
             (odd? x)))

(он не расширяется до точно this, но расширяется до чего-то эквивалентного этому)

Это имеет то преимущество, что сокращает предикаты, поэтому вы можете писать

(every? (andmap integer? odd?) [1 3 "a string"])

, не получая исключение времени выполнения, как в случае с ответом Артура .

Вот определение andmap :

(defmacro andmap 
  ([]       `(fn [& x#] true))
  ([p & ps] `(fn [& x#] (and (apply ~p x#)
                             (apply (andmap ~@ps) x#)))))

Также можно определить andmap как функцию, которая также сокращает свои предикаты из-за лени:

(defn andmap [& ps]
  (fn [& x]
    (every? true? (map (fn [p] (apply p x)) ps))))

Предикаты для andmap могут принимать произвольное количество аргументов,

1
ответ дан 18 December 2019 в 14:49
поделиться

каждые? спросит: «Возвращает ли эта функция значение true для каждого члена последовательности», что близко к тому, что, я думаю, вы просите. Для улучшения every? нужно взять список функций и спросить: «Все ли эти предикаты верны для каждого члена этой последовательности?»

Вот первая попытка:

(defn andmap? [data tests]
  (every? true? (for [d data, f tests]
                  (f d))))

user> (andmap? '(2 4 8) [even? pos?])
true
user> (andmap? '(2 4 8) [even? odd?])
false
1
ответ дан 18 December 2019 в 14:49
поделиться
Другие вопросы по тегам:

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