Вы можете взломать прямо на REPL. Предположим, у вас есть заклинатель на вашем пути к классам.
Начните REPL. Первое, что нам нужно сделать, это включить в него классы заклинателей.
user> (require 'incanter.core)
nil
Теперь мы можем увидеть функцию incanter.core / matrix?
user> (incanter.core/matrix? 2)
false
Мы можем посмотреть на исходный код:
user> (require 'clojure.repl)
nil
user> (clojure.repl/source incanter.core/matrix?)
(defn matrix?
" Test if obj is 'derived' incanter.Matrix."
([obj] (is-matrix obj)))
nil
Пошли и облажались:
Первое изменение в пространстве имен incanter.core:
user> (in-ns 'incanter.core)
#<Namespace incanter.core>
Тогда мы можем переопределить его, используя старый исходный код в качестве шпаргалки:
incanter.core> (defn matrix? [obj] "hello")
#'incanter.core/matrix?
Юнит-тест:
incanter.core> (matrix? 2)
"hello"
Переключиться обратно в пространство имен пользователя:
incanter.core> (in-ns 'user)
#<Namespace user>
Попробуйте:
user> (matrix? 2)
; Evaluation aborted.
Нет определения пользователя / матрицы. Мы переопределили его в пространстве имен incanter.core.
user> (incanter.core/matrix? 2)
"hello"
Чтобы поэкспериментировать в repl, можно просто изменить исходные файлы и заново скомпилировать отдельный файл (C-C C-k в emacs), или, если вы находитесь в правильном пространстве имен, просто пересмотреть определение.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Теперь, если мы хотим сделать наши ценные изменения постоянными и доступными для других проектов, это зависит от того, как все настроено.
Я использую maven для управления зависимостями, поэтому нужно будет изменить исходный файл, а затем повторно запустить процесс сборки библиотеки, чтобы скомпилировать новую версию и установить ее в локальный репозиторий maven.
Для проекта maven это должно быть так же просто, как
$ mvn install
Примечание о номерах версий:
Если вы делаете постоянные изменения и используете управление зависимостями для координации различий, то вам следует изменить номер версии вашей библиотеки, возможно, с 1.2.0 на 1.2.0-johnshack-SNAPSHOT, или что-то, что вряд ли столкнется с реальной вещью, когда вы хотите использовать необращенную версию в другом проекте. Вы не хотели бы, чтобы модифицированная версия попала в проекты, где это не приветствуется.
Затем вы изменяете свои собственные файлы проекта, чтобы убедиться, что вы используете взломанную версию, где хотите, и в следующий раз, когда вы запускаете repl, она должна получить последний взломанный файл, который вы установили.
Вам нужно будет переустанавливать заново каждый раз, когда вы хотите, чтобы ваши изменения попали в хранилище, но это, вероятно, хорошая вещь.
К сожалению, (и именно в этот момент я начал желать, чтобы я выбрал другой пример), Incanter оказывается проектом leiningen, который разбит на подмодули специальным скриптовым способом, поэтому нам нужно выяснить, как он будет установлен. Выяснить оказалось довольно сложно, хотя ответ прост. Лейнинген поджигает мои волосы.
Вы можете получить источник заклинания здесь:
$ git clone http://github.com/liebke/incanter.git
и соответствующий исходный файл:
~ / Ведун / модули / Ведун-ядро / SRC / Ведун / core.clj
Изменить это, чтобы сломать матрицу? функции, и тогда выясняется, что вам нужно сделать:
Изменить номера версий в проекте верхнего уровня project.clj, а также в подмодуле project.clj.
Затем вы запускаете lein install в каталоге incanter-core, а затем снова в каталоге верхнего уровня, и вы должны сделать это в таком порядке. Я не совсем понимаю, почему.
В настоящее время все это кажется излишне сложным. Я (довольно) уверен, что он успокоится, когда инструменты повзрослеют.