Я думаю, что самая большая проблема с наборами данных, они в основном поощрили Вас создавать DBMS в памяти. Я люблю способ, которым Linq/entities удовлетворяют Ваши потребности данных, и они полагаются на стандартные классы наборов .NET и дженерики для работы.
Тем не менее я не списал бы питание способности динамично считать невведенные данные и применил бы отношения и т.д. в памяти, которая является все еще очень очень мощной функциональностью в зависимости от Вашей ситуации.
Если я понимаю ваш вопрос, есть более простой способ: определить новый символ в старую функцию.
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"