Clojure SICP sqrt NullPointerException
在Clojure中实现一些开始的SICP代码时,我遇到了意外的NullPointerException。特别是,我想实现第1.1.7节中的迭代平方根过程 代码如下:Clojure SICP sqrt NullPointerException,clojure,nullpointerexception,sicp,Clojure,Nullpointerexception,Sicp,在Clojure中实现一些开始的SICP代码时,我遇到了意外的NullPointerException。特别是,我想实现第1.1.7节中的迭代平方根过程 代码如下: (defn square [x] (* x x)) (defn abs [x] (cond (< x 0) (- x) :else x)) (defn average [x y] (/ (+ x y) 2)) (defn sqrt ([x] (sqrt 1.0 x)) ([guess x
(defn square [x] (* x x))
(defn abs [x]
(cond
(< x 0) (- x)
:else x))
(defn average [x y]
(/ (+ x y) 2))
(defn sqrt
([x] (sqrt 1.0 x))
([guess x]
(letfn [(good-enough? [guess]
(< (abs (- (square guess) x)) 0.001))
(improve [guess]
(average guess (/ x guess)))]
(if (good-enough? guess)
guess
(recur (improve guess) x)))))
(defn平方[x](*x))
(定义abs[x]
(续)
(
这适用于足够小的值,例如(sqrt 16)
。对于任何大于大约(square 2718)
的输入,我会得到NullPointerException clojure.lang.Numbers.lt(Numbers.java:3693)
错误
有什么想法吗
使用整个回溯更新(我在repl中只得到上一个回溯):
线程“main”java.lang.NullPointerException中出现异常
在clojure.lang.Numbers.lt(Numbers.java:3693)
在sicp_in_clojure.第1章$sqrt$足够好\u QMARK___14.调用(第1章.clj:40)
在sicp_in_clojure.chapter_one$sqrt.invoke(chapter_one.clj:43)
在sicp_in_clojure.chapter_one$sqrt.invoke(chapter_one.clj:37)
在sicp_in_clojure.chapter_one$eval19.invoke(chapter_one.clj:48)
位于clojure.lang.Compiler.eval(Compiler.java:6465)
加载(Compiler.java:6902)
位于clojure.lang.Compiler.loadFile(Compiler.java:6863)
在clojure.main$load_script.invoke处(main.clj:282)
在clojure.main$script_opt.invoke(main.clj:342)
在clojure.main$main.doInvoke(main.clj:426)
位于clojure.lang.RestFn.invoke(RestFn.java:408)
位于clojure.lang.Var.invoke(Var.java:401)
位于clojure.lang.AFn.applyToHelper(AFn.java:161)
在clojure.lang.Var.applyTo(Var.java:518)
在clojure.main.main(main.java:37)嘿,它对我来说工作得很好。我正在使用clojure 1.3.0。以下是终端输出。代码工作正常
[user@myhost ~]$ clj
Clojure 1.3.0
user=> (defn square [x] (* x x))
#'user/square
(defn abs [x]
(cond
(< x 0) (- x)
:else x))
#'user/abs
(defn average [x y]
(/ (+ x y) 2))
#'user/average
(defn sqrt
([x] (sqrt 1.0 x))
([guess x]
(letfn [(good-enough? [guess]
(< (abs (- (square guess) x)) 0.001))
(improve [guess]
(average guess (/ x guess)))]
(if (good-enough? guess)
guess
(recur (improve guess) x)))))
#'user/sqrt
user=> (sqrt 16)
4.000000636692939
user=> (sqrt 2718)
52.134441897781194
user=> (sqrt 3000)
54.77225658092904
[user@myhost~]$clj
Clojure 1.3.0
user=>(defn平方[x](*x))
#'用户/平方
(定义abs[x]
(续)
((sqrt 16)
4.000000636692939
用户=>(sqrt 2718)
52.134441897781194
用户=>(sqrt 3000)
54.77225658092904
我不确定这是否仍然相关,但我认为值得使用该应用程序进行尝试,该应用程序可以让您了解事物的解释方式:
你试过最近的版本吗,比如说新版本?你能粘贴整个回溯吗?我不能重现错误,它对我来说很好,即使是对于更大的数字。您使用的是什么版本的Clojure/Java?我也无法复制--我假设您的square函数是(defn square[x](*x))。保罗:是的,我忘了把我对正方形的定义贴上去;我将在中编辑它。我正在使用Clojure 1.3.0。java版本“1.6.0_26”java(TM)SE运行时环境(build 1.6.0_26-b03-384-10M3425)java热点(TM)64位服务器VM(build 20.1-b02-384,混合模式)用户=>(sqrt(square 5000))给了我5000.000000041231fascing:)上面的代码在Clojure 1.2.1上运行得很好,但我一直在1.3.0中得到这些NullPointerException。非常奇怪。我的clojure版本是1.3.0。你可以在我的回复中看到它!我认为这是由于clojure安装中的问题造成的。顺便说一下,这是我的java安装,java版本“1.6.0_22”OpenJDK运行时环境(IcedTea6 1.10.3)(ArchLinux-6.b22_1.10.3-1-x86_64)OpenJDK 64位服务器虚拟机(构建19.0-b09,混合模式)