определите синоним для макроса Clojure

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

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

С веб-стороной, я предположил бы, так как Вы - вопрос, отмечен с asp.net, что Вы пошли бы путем использования http обработчика для подавания изображений. Затем Вы обладаете всеми преимуществами платформы в Вашем распоряжении, и можно сохранить Вас доменным логическим инструментом для очистки только с необходимостью передать ключ к Вашему изображению к http обработчику.

12
задан Community 23 May 2017 в 12:01
поделиться

3 ответа

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

user=> (defmacro def-function [& args] `(defn ~@args))
#'user/def-function
user=> (def-function g [] 2)
#'user/g
user=> (g)
2

Или вы можете использовать clojure.contrib.def / defalias :

user=> (use 'clojure.contrib.def)
nil
user=> (defalias def-function defn)
#'user/def-function
user=> (def-function g [] 2)
#'user/g
user=> (g)
2
8
ответ дан 2 December 2019 в 03:43
поделиться

Для этого, по сути, вам придется переписать макрос точно так, как оригинал, просто подставив другое имя (для этого вы, конечно, должны использовать defmacro ). Это возможно только так, поскольку макросы не возвращают значение, а просто записывают код, который должен быть впоследствии оценен.

Def требует привязки имени к значению, а не блока кода.

( def symbol init?)

Создает и обрабатывает или находит глобальную переменную с именем символа и пространством имен значения текущего пространства имен ( ns ). Если предоставляется init, он оценивается, и корневой привязке переменной устанавливается результирующее значение. Если init не указан, это не влияет на корневую привязку переменной. def всегда применяется к корневой привязке, даже если var привязана к потоку в точке, где вызывается def. def возвращает саму переменную (не ее значение). Выдает исключение, если символ уже находится в пространстве имен и не сопоставлен с интернированной переменной.

из Clojure: Special Forms

Макросы не оценивают свои формы:

Макросы - это функции, которые манипулируют формами, с учетом синтаксической абстракции. Если оператор вызова является символом, который называет глобальную переменную, являющуюся макрос-функцией, эта макрос-функция вызывается, и передаются неоцененные формы операндов [курсив мой]. Затем вместо него оценивается возвращаемое значение макроса.

3
ответ дан 2 December 2019 в 03:43
поделиться

Может звучать (линейно) шумно, но

(def #^{:macro true} case #'cond)

работает!

29
ответ дан 2 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

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