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
我的clojure函数在repl中定义时有效,但从脚本加载时无效_Clojure - Fatal编程技术网

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

我的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

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

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

在Clojure
repl
中,我可以使用
(加载文件“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在编译时会对代码进行两次传递,以便进行正向解析,因此调用稍后在文件中声明的方法不是问题。