【发布时间】:2018-04-01 15:35:38
【问题描述】:
我想通过在函数体中放置一个 repl(带有 clojure.main/repl)来玩弄和开发基于局部变量的表达式:
(ns something)
(defn myfunc [ p ]
(let [local (+ p 10)]
(clojure.main/repl)
(+ local 100)))
(myfunc 666)
当我执行这个时,repl 启动正常,但函数的参数和本地 let-bindings 似乎在提示中不可见:
something=> p
CompilerException java.lang.RuntimeException: Unable to resolve symbol: p in this context
something=> local
CompilerException java.lang.RuntimeException: Unable to resolve symbol: local in this context
我已经能够通过创建新的 ^:dynamic 变量并使用绑定在本地设置它们的值来传递值,但这非常复杂并且需要为每个局部变量单独绑定:
(def ^:dynamic x)
(defn myfunc [ p ]
(let [local (+ p 10)]
(binding [x local]
(clojure.main/repl))
(+ local 100)))
有没有更简单的方法来传递/访问这种本地 repl 中的本地值?或者有没有更好的方法可以从非本地 repl 访问局部变量,例如“lein repl”?
【问题讨论】:
-
您可以使用
replfn 的:init挂钩来定义变量。 -
谢谢, :init 看起来很有希望。文档说“:init,没有参数的函数,初始化钩子调用了 set!-able vars 的绑定。”但是我无法通过谷歌搜索找到任何示例如何使用 :init 来传递值,你能提供一个吗?
标签: clojure binding var read-eval-print-loop