Идиоматическая функция Режима в Clojure

GAC может также использоваться блоками, которые требуют поднятых полномочий выполнить привилегированные операции от имени менее доверяемого кода (например, частичное доверительное приложение ASP.NET).

, Например, скажите, что у Вас есть частичное доверительное приложение ASP.NET, которое должно выполнить задачу, которая потребовала бы поднятых полномочий, т.е. Полное Доверие . Решение состоит в том, чтобы поместить код, который требует поднятых полномочий в отдельный блок. Блок отмечен с эти AllowPartiallyTrustedCallers атрибут и класс, который содержит привилегированную логику, отмечен с атрибутом PermissionSet, чем-то вроде этого:

[PermissionSet(SecurityAction.Assert, Unrestricted=true)]

Нашему блоку дали бы поставленную строгую подпись и затем развернутую в GAC.

Теперь наше частично доверяемое приложение (приложения) может использовать доверяемый блок в GAC для выполнения определенного и узкого набора привилегированных операций, не теряя преимущества частичного доверия.

8
задан clartaq 21 October 2009 в 14:45
поделиться

3 ответа

Вот мой вывод:

  1. Есть много основных функций clojure, которые принимают последовательности в качестве аргументов, в то время как другие принимают несколько аргументов, поэтому, на мой взгляд, настоящего идиоматического способа не существует. Если у вас уже есть данные в последовательности, я бы использовал в качестве аргумента seq, поскольку он избавит вас от вызова для применения.

  2. Я бы не стал писать функцию, которая в некоторых случаях возвращает значение и список значений в других случаях, потому что вызывающий код всегда должен будет проверять возвращаемое значение перед его использованием. Вместо этого я бы вернул одиночный режим как seq только с одним элементом в нем. Но у вас могут быть свои причины, в зависимости от кода, вызывающего эту функцию.

Кроме того, я бы переписал функцию режима так:

(defn mode [aseq]
  (let [amap (tally-map aseq)
        mx (apply max (vals amap))
        modes (map key (filter #(= mx (val %)) amap))
        c (count modes)]
    (cond
      (= c 1) (first modes)
      (= c (count amap)) nil
      :default modes)))

Вместо определения функции f вы можете использовать функцию идентификации (если ваши данные не содержат значений, которые логически ложны). Но тебе это даже не нужно. Я нахожу режимы другим способом, который мне удобнее читать: карта amap действует как последовательность записей карты (пары ключ-значение). Сначала я фильтрую только те записи, которые имеют значение mx. Затем я сопоставляю им функции клавиш, давая мне последовательность клавиш.

Чтобы проверить, есть ли какие-либо режимы, я больше не перебираю карту. Вместо этого я просто сравниваю количество режимов с количеством записей на карте. Если они равны, все элементы имеют одинаковую частоту!

Вот функция, которая всегда возвращает seq:

(defn modes [aseq]
  (let [amap (tally-map aseq)
        mx (apply max (vals amap))
        modes (map key (filter #(= mx (val %)) amap))]
    (when (< (count modes) (count amap)) modes)))
4
ответ дан 5 December 2019 в 11:25
поделиться

На мой взгляд, отображение некоторой функции над коллекцией с последующим немедленным сжатием списка до одного элемента является признаком использования reduce .

(defn tally-map [coll]
  (reduce (fn [h n]
            (assoc h n (inc (h n 0))))
          {} coll))

В этом случае я Я бы написал mode fn, чтобы принимать единственную коллекцию в качестве аргумента, как вы это сделали. Единственная причина, по которой я могу придумать использование нескольких аргументов для такой функции, - это если вы планируете вводить много буквальных аргументов.

Так что, если, например, это для интерактивного сценария REPL, и вы часто будете набрав буквально (mode [1 2 1 2 3]) , тогда вы должны заставить функцию принимать несколько аргументов, чтобы избавить вас от постоянного ввода лишнего [] в вызове функции. Если вы планируете читать много чисел из файла, а затем использовать режим этих чисел, затем пусть функция принимает единственный аргумент, который представляет собой коллекцию, чтобы вы могли избавиться от постоянного использования apply . Я предполагаю, что ваш самый распространенный вариант использования - это последний. Я считаю, что apply также добавляет накладные расходы, которых вы избегаете, когда у вас есть вызов функции, который принимает аргумент коллекции.

Я согласен с другими, что вы должны иметь mode возвращать список результатов даже если есть только один; это облегчит тебе жизнь. Возможно, переименуйте его в режимы , пока вы на нем.

Я согласен с другими, что у вас должен быть режим , возвращающий список результатов, даже если он только один; это облегчит тебе жизнь. Возможно, переименуйте его в режимы , пока вы на нем.

Я согласен с другими, что у вас должен быть режим , возвращающий список результатов, даже если он только один; это облегчит тебе жизнь. Возможно, переименуйте его в режимы , пока вы на нем.

5
ответ дан 5 December 2019 в 11:25
поделиться

Похоже мне хорошо. Я бы заменил

f (fn [x] (not (nil? x)))
mode (filter f (map #(if (= mx (get amap %)) %) k))

на

mode (remove nil? (map #(if (= mx (get amap %)) %) k))

(я не знаю, почему чего-то вроде not-nil? нет в clojure.core ; это то, что нужно каждому день.)

Если существует единственный уникальный режим, он возвращается. Если существует несколько режимов, они возвращаются в виде списка. Если режима нет, то есть все элементы присутствуют с одинаковой частотой, возвращается nil. "

Вы можете подумать о том, чтобы просто возвращать seq каждый раз (один элемент или пустой - это нормально); в противном случае необходимо учитывать случаи отличается вызывающим кодом. Всегда возвращая seq,

2
ответ дан 5 December 2019 в 11:25
поделиться
Другие вопросы по тегам:

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