2015-10-21 2 views
2

У меня есть две функции, которые выполняют IO в dosync. Поэтому, когда я делаюМожно ли исключить функции/пространства имен из: перезагрузить на Repl?

(require 'my.namespace :reload) 

я получаю:

CompilerException java.lang.IllegalStateException: I/O in transaction, compiling: 

Есть ли способ, чтобы исключить перегрузку этих двух функций, или целое пространство имен?

ответ

6

Если у вас есть высшие формы уровня, которые имеют побочные эффекты (например, для чтения или записи вещей), вы можете защитить их от перезагружается с defonce макросъемки:

(defonce launcher (fire-the-missiles)) 

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

+0

спасибо Артур, из интереса, где лучше всего поставить код «побочного эффекта»? – Zuriar

+0

В основном это личное мнение, хотя я стараюсь сохранить его в функциях, так что ни один из побочных эффектов не будет выполняться до тех пор, пока функция не будет запущена. Поскольку я постоянно использую clj-refactor, он перезагружает пространства имен всякий раз, когда он чувствует себя так, поэтому наличие побочных эффектов во время загрузки становится сложным. –

Смежные вопросы