Когда использовать восклицательный знак в clojure (или lisp)?

Говорят, что использовать восклицательные знаки при назначении нечистых функций.

Но я не совсем понимаю "нечистые" функции. Являются ли они

  • функции изменяют состояние своих аргументов (через reset!, alter, java-object-methods,...)
  • возникают побочные эффекты (например, print, spit,...)
  • или оба?

Очевидно, что официальный clojure apis не имеет ошибок в каждом случае выше. Интересно, когда я должен положить их и нуждаться в вашей помощи, чтобы сделать мой код более ясным.

Ответы

Ответ 1

Я бы сказал, что вам не нужно ставить ! на каждую нечистую функцию. Сообщество Clojure Руководство по стилю рекомендует:

Имена функций/макросов, которые небезопасны в транзакциях STM должен заканчиваться восклицательным знаком.

Итак, в основном, завершаем функции !, которые изменяют состояние для атомов, метаданных, варов, переходных процессов, агентов и io.

Благодаря @noisesmith для обновления.