Каков рекомендуемый способ использования memoize? - PullRequest
0 голосов
/ 06 декабря 2018

Я иногда использовал функцию memoize.Обычно в следующей форме:

(defn- sqrt-denom [iterations]
  (/ 1 (if (= iterations 0)
         2
         (+ 2 (sqrt-denom (dec iterations))))))

(def sqrt-denom (memoize sqrt-denom))

Я предположил, что «правильно» повторно использовать имя функции при запоминании.Это хорошая практика?Или я должен использовать разные имена для незаписанных и запомненных функций?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Как и Алан Томпсон, я часто использовал (def sqrt-denom (memoize (fn ...))), но неудобно разбивать простые defn на def и fn, чтобы обернуть последние.Синтаксическое преобразование затрудняет переключение между запомненной и неметизированной версиями функции, и memoize - это единственная функция, которая заставила меня пожелать, чтобы у Clojure было что-то вроде Python-декораторов.

Тогда, недавноЯ обнаружил, что у Clojure есть декораторы:

(defn sqrt-denom ...)

(alter-var-root #'sqrt-denom memoize)

Это очень похоже на ваш пример, но позволяет избежать путаницы двух переменных, названных одним и тем же, и в нем четко указаны намерения автора.Теперь это мой предпочтительный метод для запоминания функций.

0 голосов
/ 06 декабря 2018

Я бы никогда не использовал имя верхнего уровня def, особенно когда ссылаюсь на себя.Два варианта:

(defn ^:no-doc sqrt-denom-impl [iterations]
  (/ 1 (if (= iterations 0)
         2
         (+ 2 (sqrt-denom (dec iterations))))))

(def sqrt-denom (memoize sqrt-denom-impl))

или даже проще:

(def sqrt-denom
  (memoize (fn  [iterations]
    (/ 1 (if (= iterations 0)
           2
           (+ 2 (sqrt-denom (dec iterations))))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...