Puede hackear directamente en REPL. Supongamos que tienes incandescente en tu classpath. Comience una REPL. Lo primero que debemos hacer es incorporar las clases de incandes.
user> (require 'incanter.core)
nil
Ahora podemos ver la función incanter.core/matrix?
user> (incanter.core/matrix? 2)
false
Podemos mirar el código fuente original:
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
Vamos a meter la pata:
Primer cambio al espacio de nombres incanter.core:
user> (in-ns 'incanter.core)
#<Namespace incanter.core>
Entonces podemos redefinirlo, usando el código fuente anterior como una cuna:
incanter.core> (defn matrix? [obj] "hello")
#'incanter.core/matrix?
Unidad de prueba:
incanter.core> (matrix? 2)
"hello"
cambiar de nuevo al espacio de nombres de usuario:
incanter.core> (in-ns 'user)
#<Namespace user>
pruébelo:
user> (matrix? 2)
; Evaluation aborted.
No existe una definición de usuario/matriz. Lo redefinimos en el espacio de nombres incanter.core.
user> (incanter.core/matrix? 2)
"hello"
para experimentar en el repl, está bien sólo para cambiar los archivos de origen y volver a compilar el archivo único (Ck CC en emacs), o si usted está en el espacio de nombres derecha, justo reevaluar la definición .
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Ahora, si queremos que nuestro valioso cambio sea permanente y esté disponible para otros proyectos, depende de cómo esté configurado todo.
Utilizo maven para la gestión de dependencias, por lo que sería una cuestión de modificar el archivo de origen y luego volver a ejecutar el proceso de compilación para que la biblioteca compile la nueva versión e instálela en el repositorio local de maven.
Con un proyecto Maven, que debe ser tan simple como
$ mvn install
Una nota acerca de los números de versión:
Si realiza modificaciones permanentes y el uso de gestión de la dependencia para coordinar las diferencias, entonces debería cambie el número de versión de su biblioteca, de tal vez 1.2.0 a 1.2.0-johnshack-SNAPSHOT, o algo que es poco probable que colisione con el real cuando desee usar una versión no invertida en otro proyecto. No desearía que una versión modificada encuentre su camino en proyectos en los que no es bienvenida.
Luego modifica sus propios archivos de proyecto para asegurarse de que usa la versión pirateada donde desea, y la próxima vez que inicie su repl, debe obtener el último truco que instaló.
Tendrá que volver a instalar cada vez que desee que los cambios lleguen al repositorio, pero probablemente sea algo bueno.
Desafortunadamente, (y en este punto comencé a desear haber elegido otro ejemplo) Incanter resulta ser un proyecto de Leiningen que se divide en submódulos en una especie de guión ad-hoc , entonces tenemos que descubrir cómo se espera que se instale. El descubrimiento resultó ser bastante difícil, aunque la respuesta es fácil. Leiningen me quema el pelo.
usted puede conseguir la fuente de encantador aquí:
$ git clone http://github.com/liebke/incanter.git
y el archivo fuente pertinente es:
~/embrujamiento/módulos/embrujamiento-core/src/embrujamiento/núcleo. clj
¿Modificarlo para romper la matriz? función, y luego resulta que lo que tiene que hacer es:
Cambie los números de versión en el nivel superior project.clj, y también en el submódulo project.clj.
Luego ejecuta lein install en el directorio incanter-core, y nuevamente en el directorio de nivel superior, y usted tiene que hacerlo en ese orden. No entiendo muy bien por qué.
Por el momento todo esto parece innecesariamente complicado. Estoy (bastante) seguro de que se calmará a medida que las herramientas maduren.
O utilice un repositorio local de Maven – Greg
Con Leiningen, esto se puede hacer usando 'lein install'. – Mars