我的clojure函数在repl中定义时有效,但从脚本加载时无效
我在Windows XP(JVM=1.6.0)上使用Clojure 1.4.0 我的我的clojure函数在repl中定义时有效,但从脚本加载时无效,clojure,Clojure,我在Windows XP(JVM=1.6.0)上使用Clojure 1.4.0 我的help.clj脚本包含我认为有用的Clojure代码的模糊片段 在Clojurerepl中,我可以使用(加载文件“help.clj”)从当前目录访问它 我写了(defn-clojure-help[](加载文件“help.clj”)。现在,一个简单的(clojure帮助)加载它 然后我尝试将clojure help函数放入我使用的repl启动脚本中 但是现在调用(clojure帮助)会导致以下异常: Compil
help.clj
脚本包含我认为有用的Clojure代码的模糊片段
在Clojurerepl
中,我可以使用(加载文件“help.clj”)
从当前目录访问它
我写了(defn-clojure-help[](加载文件“help.clj”)
。现在,一个简单的(clojure帮助)
加载它
然后我尝试将clojure help
函数放入我使用的repl
启动脚本中
但是现在调用(clojure帮助)
会导致以下异常:
CompilerException java.lang.RuntimeException:无法解析symbol:clojure在此上下文中的帮助
我遗漏了什么?如果您没有使用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
感谢您在上面的评论中发布代码!没有代码就不可能知道实际发生了什么。做一个简单的更改似乎可以解决问题:
(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)
调用移动到脚本末尾。如果调用不在脚本末尾,那么Clojure会在评估脚本中的其余函数之前进入REPL,因此它们在REPL中不可用。由于clojure帮助
是在脚本中的(p1)
调用之后定义的,因此在退出REPL之后才对其进行评估。启动脚本是什么样子的?如何启动repl?似乎没有对defn
进行评估。这是我的启动脚本prompt.clj
->(defn my prompt[](printf“\n[%s]>”(ns name*ns*))(defn p1[](clojure.main/repl:prompt my prompt))(p1)(defn closure help[](加载文件“help.clj”))
它从命令行开始java-cp clojure-1.4.0.jar clojure.main prompt.clj
my prompt功能正常运行。对不起,各位。我用s
(closure
!)拼写了clojure
),谢谢opqdonut。你是对的,我的defn
没有被评估,@DaoWen说明了原因。谢谢DaoWen,解决了这个问题。我是Clojure的新手,所以你的建议很有价值。我已经习惯了Python中编译顺序不那么重要的地方。@exbctel-我很高兴您决定试用Clojure!因为Clojure和Python都是逐行编译/解释的,所以我很确定类似于上面的代码也会在Python中导致错误。当我运行print f()def f():return 5
时,它抛出一个错误,表示未定义f
。相反,Java在编译时会对代码进行两次传递,以便进行正向解析,因此调用稍后在文件中声明的方法不是问题。