我的clojure函数在repl中定义时有效,但在从脚本加载时则无效

时间:2012-08-11 19:56:10

标签: clojure

我在Windows XP上使用Clojure 1.4.0(JVM = 1.6.0)。

我的help.clj脚本包含我认为有用的Clojure代码的模糊片段。

在Clojure repl中,我可以使用(load-file "help.clj")从当前目录访问它。

试着想要我写(defn clojure-help [] (load-file "help.clj"))。现在一个简单的(clojure-help)加载它。

然后我尝试将clojure-help函数放在我使用的repl启动脚本中。

但现在调用(clojure-help)会导致以下异常:

CompilerException java.lang.RuntimeException: Unable to resolve symbol: clojure-help in this context

我错过了什么?

2 个答案:

答案 0 :(得分:2)

感谢您在上面的评论中发布代码!没有代码,就不可能知道实际发生了什么。做一个简单的改变似乎解决了这个问题:

(defn my-prompt [] (printf "\n[%s]> " (ns-name *ns*)))

(defn p1 [] (clojure.main/repl :prompt my-prompt))

(defn clojure-help [] (load-file "help.clj"))

(p1)

此更改正在将(p1)调用移至脚本的 end 。如果调用不在脚本的末尾,那么在评估脚本中的其余函数之前,Clojure会进入REPL,因此它们在REPL中不可用。由于clojure-help是在之后在您的脚本中(p1)调用后定义的,因此在退出REPL之后才会对其进行评估。

答案 1 :(得分:1)

如果您没有使用repl加载其他脚本,您可以执行以下操作:

clojure --init replstartup.clj --repl

其中replstartup.clj将包含您的闭包帮助函数。

或者你可以创建一个名为clojure-repl.bat(或某些此类东西)的批处理文件,如下所示。

@echo off
java -cp %userprofile%\clojure-1.4.0.jar clojure.main --init repl-startup.clj --repl
@echo on