So for instances, starting with an object that has about 32,000 lines that 
need to be looped over, the code gets this far: 

 in loop-over-scores again 2375

It prints that out and then throws StackOverflow error. 

But I don't see anything in there that would exhaust the stack. These 
functions run, return a value, and are done. 



On Saturday, April 1, 2017 at 6:23:29 PM UTC-4, piast...@gmail.com wrote:
>
>
> I have a function that will run repeatedly, so I use the at-at library to 
> call it:
>
> https://github.com/overtone/at-at
>
> I don't think this is the problem. 
>
> Sad to say, the Error is catching a StackOverflow, which I'm having 
> trouble finding. I don't see a place where I call a function recursively, 
> so I don't see where any of this becomes stackoverflow. 
>
> I'm using Dire to catch errors, but for now I'm just logging them. I don't 
> see anything fancy or clever that would give me a stackoverflow, and yet 
> this anonymous function called by at-at is definitely giving rise to 
> StackOverflow.
>
> (defn- calculate--scores []
>   (let [my-pool (at/mk-pool)]
>     (at/every 180000
>               (fn []
>                 (append-to-file "/var/log/example/-scores.log" "Will 
> attempt to write scores")
>                 (future 
>                   (try 
>                     (let [
>                           map-of-all-sums   
> (api/get-accuracy-and-precision)
>                           set-of-all-scores (dire/supervise 
> #'api/path-entries map-of-all-sums)
>                           path-and--scores (dire/supervise 
> #'api/loop-over-scores set-of-all-scores)
>                           ]
>                       (append-to-file "/var/log/example/-scores.log" 
> "\n\n\n\n\n")
>                       (append-to-file "/var/log/example/-scores.log" " 
> path-and--scores: ")
>                       (append-to-file "/var/log/example/-scores.log"  (str 
> "(count set-of-all-scores): " (count set-of-all-scores)))
>                       (append-to-file "/var/log/example/-scores.log" 
> path-and--scores))
>                     (catch Exception e
>                       (do
>                         (append-to-file "/var/log/example/-scores.log" 
> (str " EXCEPTION:: " e))
>                         (append-to-file "/var/log/example/-scores.log" 
> (stack/parse-exception e))
>                         (errors/error e)))
>                     (catch Error o
>                       (println (str " a problem in the anonymous function 
> in calculate--scores: " o)))
>                     )))
>               my-pool)))
>
>
> The problem appears to be here, which will loop several thousand times and 
> then die. But I don't see why. (This function used to just be a loop, and I 
> added the (let) so I could see if I could read the end -- but I could not 
> reach the end).
>
>
>
> (defn loop-over-scores
>   [set-of-scores]
>   "2017-03-08 -- called from start.clj"
>   (try
>     (let [return-value  (loop [
>                                how-many-loops 0
>                                scores set-of-scores
>                                vector-of-maps-of-vector-key-and-score []
>                                ]
>
>                           (println  (str  " in loop-over-scores again " 
> how-many-loops))
>                           (if (next scores)
>                             (recur
>                              (inc how-many-loops)
>                              (remove #{(first scores)} scores)
>                              (conj vector-of-maps-of-vector-key-and-score 
> (find-related-positive-negative-true-false-records scores (first scores))))
>                             vector-of-maps-of-vector-key-and-score))
>           ]
>
>       (println " return-value in loop-over-scores " return-value " in 
> loop-over-scores")
>       return-value)
>     (catch Exception e (println " exception in loop-over-scores: " e))))
>
>
> So this line prints out a result several thousand times:
>
>       (println " return-value in loop-over-scores " return-value " in 
> loop-over-scores")
>
>
> And then I get stackoverflow.
>
> But nothing seems suspicious here:
>
>
> (defn find-related-positive-negative-true-false-records [set-of-scores 
> vector-with-path-score]
>   (println " in find-related-positive-negative-true-false-records the 
> vector-with-path-score "  vector-with-path-score)
>   
>   (let [
>         [vector-with-path score] vector-with-path-score
>         ;; 2017-03-08 -- seq-as-path should be something like [30 8 34 
> 20.94 2]
>         seq-as-path (rest (rest vector-with-path))
>
>         ;;_ (append-to-file "/var/log/example/-scores.log" "seq-as-path")
>         ;;         _ (append-to-file "/var/log/example/-scores.log" 
> seq-as-path)
>     
>         vector-as-path (apply conj [] seq-as-path)
>
>          _ (append-to-file "/var/log/example/-scores.log" "vector-as-path")
>          _ (append-to-file "/var/log/example/-scores.log" vector-as-path)
>         ]
>     (dire/supervise #'map-of-vector-path-and-true-false-scores 
> vector-as-path)))
>
>
> Nor here:
>
>
> (defn map-of-vector-path-and-true-false-scores
>   [vector-as-path]
>   (println " at the start of map-of-vector-path-and-true-false-scores")
>   (try 
>     (if-not (empty? vector-as-path)
>       (let [
>             ;; 2017-03-30 -- this fails:
>             ;; user> (apply conj [:positive :false] (30 6 40))
>             ;; ClassCastException java.lang.Long cannot be cast to 
> clojure.lang.IFn  user/eval1719 (NO_SOURCE_FILE:1)
>             ;;
>             ;; but this works: 
>             ;; user> (apply conj [:positive :false] '(30 6 40))
>             ;;[:positive :false 30 6 40]
>             ;;
>
>             true-positive-path  (apply conj [:positive :true] 
> vector-as-path)
>             false-positive-path  (apply conj [:positive :false] 
> vector-as-path)
>             false-negative-path  (apply conj [:negative :false] 
> vector-as-path)
>
>             true-positive (get-in @accuracy-and-precision 
> true-positive-path 0)
>             _ (append-to-file "/var/log/example/paths-with-score.log" (str 
> true-positive-path " score: " true-positive))
>
>             false-positive (get-in @accuracy-and-precision 
> false-positive-path 0) 
>             _ (append-to-file "/var/log/example/paths-with-score.log"  
> (str  false-positive-path " score: " false-positive))
>             
>             false-negative (get-in @accuracy-and-precision 
> false-negative-path 0)
>             _ (append-to-file "/var/log/example/paths-with-score.log"  
> (str  false-negative-path " score:  "  false-negative))
>             
>             ]      
>         { vector-as-path (dire/supervise #'calculate--score true-positive 
> false-positive false-negative) }))
>     (catch Exception e (println " problem in 
> map-of-vector-path-and-true-false-scores  " e))
>     (catch Error o (println " problem without exception in 
> map-of-vector-path-and-true-false-scores " o))
>     ))
>
> Nor here:
>
>
> (defn calculate--score [true-positive false-positive false-negative]  
>   (let [
>         twice-true-positive (* true-positive 2)
>         denominator (+ twice-true-positive false-negative false-positive)
>         ]
>     (if (> denominator 0)
>       (/ twice-true-positive denominator)
>       0)))
>
>
> There is nothing here where a function calls itself over and over, so what 
> would lead to StackOverflow?
>
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to