Хотя я могу динамически связывать символ с различными функциями, я думаю, что вы действительно хотите переопределить функцию.
Подумайте об этом так: ваш код создает символ и две функции, и вы динамически связываете символ с другой функцией:
+---> func1
/
symbol ---- [dynamic binding] ---<
\
+---> func2
Эффект динамического связывания ограничен областью применения binding
.
Чего мы хотим добиться, так это, учитывая символ и функцию, обеспечить новую реализацию функции, чтобы весь код, ссылающийся на нее, имел доступ к новой реализации:
(defn func1 [...])
(var func1) ; ---> func1
(defn func1 [...])
(var func1) ; ---> func1*
и такое изменение постоянно влияет на весь код, который использует func1
. Это нормальная задача, когда вы разрабатываете часть замыкания: вы, скорее всего, откроете REPL в работающем приложении, и вы будете def
и defn
несколько раз повторять одни и те же символы снова и снова, переопределяя все движущиеся части вашего приложения на лету.
Если вы используете Emacs и SLIME / Swank, каждый раз, когда вы нажимаете C-c C-k
в измененном исходном файле Clojure, вы потенциально можете переопределить все функции в пространстве имен без необходимости перезапуска приложения.