Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JVM:是否可能通过远程Clojure repl生成修补程序/补丁程序代码?_Clojure_Jvm_Read Eval Print Loop - Fatal编程技术网

JVM:是否可能通过远程Clojure repl生成修补程序/补丁程序代码?

JVM:是否可能通过远程Clojure repl生成修补程序/补丁程序代码?,clojure,jvm,read-eval-print-loop,Clojure,Jvm,Read Eval Print Loop,在谈话中,Rich Hickey提到这是Clojure的好处之一: 如果您构建的应用程序具有一定的加载权限 代码-远程repl连接或某种方式。你的 运行的生产系统将具有此功能来进行修复 加载到正在运行的程序中 我想知道这在实践中有多容易。比如说,我知道一个函数中有一个bug,我想通过远程repl在生产中重新定义/覆盖它 可能吗 在我退出repl后,覆盖的版本会保持活动状态吗 在所有JVM应用程序容器中都存在这种行为吗 我没有在生产中使用JVM的任何经验,这就是我提出这个问题的原因 可能吗 是

在谈话中,Rich Hickey提到这是Clojure的好处之一:

如果您构建的应用程序具有一定的加载权限 代码-远程repl连接或某种方式。你的 运行的生产系统将具有此功能来进行修复 加载到正在运行的程序中

我想知道这在实践中有多容易。比如说,我知道一个函数中有一个bug,我想通过远程repl在生产中重新定义/覆盖它

  • 可能吗
  • 在我退出repl后,覆盖的版本会保持活动状态吗
  • 在所有JVM应用程序容器中都存在这种行为吗
我没有在生产中使用JVM的任何经验,这就是我提出这个问题的原因

可能吗

是的,我建议观看他讲述的美国宇航局使用REPL在太空中热修复卫星的故事

在我退出repl后,覆盖的版本会保持活动状态吗

当您重新评估函数时,更改将适用于任何地方,例如

(defn add1 [x]
  (+ x 2))

(defn foo [x]
  (add1 x))

(foo 1)

注意
(foo 1)=>3
如果您修复并重新评估
add1
,然后再次运行
(foo 1)=>2

我们在工作中偶尔会这样做——通过连接的REPL对生产应用程序应用热修复程序——但这当然是有风险的,因为您正在修改人们(可能)积极使用的正在运行的应用程序。值得注意的是,当您断开与进程的连接后,通过REPL应用的更改保持不变,但更改仅应用于内存中,如果您重新启动进程,它将丢失这些更改(因为它将使用磁盘上的任何版本的代码启动)。