2011-10-13 16 views
6

क्लोजर में कुछ प्रारंभिक एसआईसीपी कोड को लागू करते समय मुझे एक अप्रत्याशित NullPointerException का सामना करना पड़ा। विशेष रूप से, मैं धारा 1.1.7 से पुनरावर्तक वर्ग रूट प्रक्रिया को कार्यान्वित करना चाहता हूं।एसआईसीपी sqrt NullPointerException

(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))))) 

इस छोटे से पर्याप्त मूल्यों, उदा ठीक काम करता है:

कोड यह (sqrt 16)। मुझे (square 2718) से बड़े किसी भी इनपुट के लिए NullPointerException clojure.lang.Numbers.lt (Numbers.java:3693) त्रुटि मिलती है।

कोई विचार?

पूरे ट्रैस बैक के साथ

अद्यतन (पिछले एक सब मैं repl में मिलता है):

धागा "मुख्य" clojure.lang.Numbers.lt पर java.lang.NullPointerException में अपवाद (Numbers.java : 3693) 14.invoke ___ sicp_in_clojure.chapter_one $ sqrt $ good_enough_QMARK पर (chapter_one.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) clojure.lang.C पर ompiler.load (compiler.java:6902) clojure.lang.Compiler.loadFile (compiler.java:6863) clojure.main $ load_script.invoke (main.clj: 282) clojure.main $ script_opt पर। clojure.main $ main.doInvoke (main.clj: 426) clojure.lang.RestFn.invoke (RestFn.java:408) clojure.lang.Var.invoke पर invoke (main.clj: 342) Var.java:401) clojure.lang.AFn.applyToHelper (AFn.java:161) clojure.lang.Var.applyTo (Var.java:5218) clojure.main.main पर (main.java: 37)

+0

क्या आप पूरे ट्रेसबैक पेस्ट कर सकते हैं? – poolie

+0

मैं त्रुटि को पुन: उत्पन्न नहीं कर सकता, यह मेरे लिए ठीक काम करता है, यहां तक ​​कि बड़ी संख्या के लिए भी। क्लोजर/जावा के कौन से संस्करण आप काम कर रहे हैं? –

+0

मैं भी पुन: उत्पन्न नहीं कर सकता - मुझे लगता है कि आपका वर्ग कार्य है (वर्ग [x] (* x x) defn)। अन्यथा कोड को कॉपी-पेस्ट किया गया। – Paul

उत्तर

0

अरे यह मेरे लिए ठीक काम करता है। मैं क्लोजर 1.3.0 का उपयोग कर रहा हूँ। टर्मिनल आउटपुट निम्नलिखित है। कोड ठीक काम करता है। अगर यह अभी भी प्रासंगिक है या नहीं

[[email protected] ~]$ 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 
+1

क्या आप अपना कोड (वर्ग (वर्ग 3000)) के लिए कोशिश कर सकते हैं? –

+0

उपयोगकर्ता => (वर्ग (वर्ग 5000)) ने मुझे 5000.000000041231 –

+0

आकर्षक :) ऊपर दिया गया कोड क्लोजर 1.2.1 पर पूरी तरह से काम करता है, लेकिन मैं इन NullPointerExceptions को 1.3.0 के साथ प्राप्त करता रहता हूं। बहुत अजीब। –

1

सुनिश्चित नहीं हैं, लेकिन मैं यह सोचा कि आप देख कैसे चीजें व्याख्या कर रहे हैं देता है कि LightTable Playground एप्लिकेशन का उपयोग करने के लिए इसे बाहर कोशिश कर रहा लायक:

light table demo screenshot of above code

आप की कोशिश की है हाल के निर्माण के साथ, नया Clojure 1.4.0 रिलीज कहें?

संबंधित मुद्दे