Макрос Clojure для создания синонима для функции

Я думаю, что самая большая проблема с наборами данных, они в основном поощрили Вас создавать DBMS в памяти. Я люблю способ, которым Linq/entities удовлетворяют Ваши потребности данных, и они полагаются на стандартные классы наборов .NET и дженерики для работы.

Тем не менее я не списал бы питание способности динамично считать невведенные данные и применил бы отношения и т.д. в памяти, которая является все еще очень очень мощной функциональностью в зависимости от Вашей ситуации.

6
задан Al Chou 22 August 2009 в 04:07
поделиться

1 ответ

Если я понимаю ваш вопрос, есть более простой способ: определить новый символ в старую функцию.

user=> (def foo +)
#'user/foo 
user=> (foo 1 2) 
3

Производительность def также превосходит подход макроса:

(defmacro foo2 [& args]
  `(+ ~@args))

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

Если вы хотите, чтобы поведение «псевдонима» было точно таким же то же самое, что и исходная функция (вызываемая в тех же контекстах), то вам нужно использовать def для переименования функции.

user=> (def foo +)

user=> (defn foo1 [& args]
         `(+ ~@args))

user=> (defmacro foo2 [& args]
         `(+ ~@args))

user=> (time (dotimes [n 1000000] (foo 1 n)))
"Elapsed time: 37.317 msecs"

user=> (time (dotimes [n 1000000] (foo1 1 n)))
"Elapsed time: 292.767 msecs"

user=> (time (dotimes [n 1000000] (foo2 1 n)))
"Elapsed time: 46.921 msecs"
13
ответ дан 8 December 2019 в 16:06
поделиться
Другие вопросы по тегам:

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