Мы можем почти мгновенно перезагрузить любую функцию и/или переменную в Clojure во время выполнения. Мы даже можем изменить сигнатуры методов. Максимум, что мы можем сделать со Scala или Java, — это использовать JRebel, который является медленным, коммерческим и ограниченным. В чем разница, которая позволяет Clojure быть таким интерактивным? Читая об этом в Slack, я нашел следующие комментарии, но я хотел бы узнать об этом больше. Ссылки на документы/статьи, разъясняющие проблему, также приветствуются (хотя и не обязательны).
Это в основном потому, что язык настроен на перезагрузку. Clojure имеет косвенное указание var для каждой функции или определения переменной верхнего уровня, которое вы можете видоизменять, поэтому вы можете переопределить только одну функцию, сохраняя при этом остальную часть вашей среды прежней, и продолжайте
.
следуя этому - есть косвенность, когда имя функции находится в коде, но для долго работающей функции, которая принимала другую функцию в качестве аргумента (например, вы передали функцию обработчика запуску процесса http-сервера), вы можете получить преимущества var косвенность вручную - путем передачи #'handler вместо обработчика, но в противном случае вы не получите перезагрузку (без перезапуска процесса, который принял этот аргумент)
.
Что-то вроде
прямая компоновка заменяет скомпилированные вызовы var прямыми вызовами (отредактированными), однако путь var все еще существует, и НОВЫЙ код все еще может вызываться через vars