Thank you again. This has been educational. 


On Monday, April 3, 2017 at 1:07:18 PM UTC-4, Sean Corfield wrote:
>
> This is lazy:  (remove #{(first scores)} scores)
>
>  
>
> Since find-related-positive-negative-true-false-records does not realize 
> set-of-scores in order to return its value, then you still have laziness on 
> scores.
>
>  
>
> I think, in your original, if you wrap that remove call with doall, you 
> won’t get a stack overflow.
>
>  
>
> Sean Corfield -- (970) FOR-SEAN -- (904) 302-SEAN
> An Architect's View -- http://corfield.org/
>
> "If you're not annoying somebody, you're not really alive."
> -- Margaret Atwood
>
>  
>
> On 4/3/17, 9:24 AM, "clo...@googlegroups.com <javascript:> on behalf of 
> piast...@gmail.com <javascript:>" <clo...@googlegroups.com <javascript:> 
> on behalf of piast...@gmail.com <javascript:>> wrote:
>
>  
>
> I apologize for my ignorance, but why is this lazy?
>
>      
>
>  (conj vector-of-maps-of-vector-key-and-score 
> (find-related-positive-negative-true-false-records scores (first scores))))
>
>  
>
> Assuming the functions are not called eagerly simply because I am in a 
> loop. But what would the eager version of this be? I 
>
>  
>
>
> On Sunday, April 2, 2017 at 1:42:20 AM UTC-4, Sean Corfield wrote:
>
> > But does that mean one can't use functions to build up sequences in a 
> loop? That seems to limit loops a great deal. 
>
> You just need to ensure you are building the sequences in an eager manner, 
> rather than a lazy manner.
>
>  
>
> Sean Corfield -- (970) FOR-SEAN -- (904) 302-SEAN
> An Architect's View -- http://corfield.org/
>
> "If you're not annoying somebody, you're not really alive."
> -- Margaret Atwood
>
>  
>
> *From: *piast...@gmail.com
> *Sent: *Saturday, April 1, 2017 9:56 PM
> *To: *Clojure
> *Subject: *Re: I can not find any function that might give rise 
> tothisStackOverflow error
>
>  
>
>
> > Because when you recur in your loop, you’re passing in lazy sequences, 
> so those 
> > are essentially building up a giant stack of delayed evaluations – and 
> when you hit bottom 
> > and try to realize those, that’s when your stack overflow hits you.
>
> I was thinking the answer had something to do with the lazyness, but I 
> wasn't sure because the app seemed to die before the loop finished -- which 
> I assume is before the functions were realized. But it is possible the 
> logging functions were slow and didn't show the whole truth. I am grateful 
> to have someone with your experience clarify this. 
>
> But does that mean one can't use functions to build up sequences in a 
> loop? That seems to limit loops a great deal. 
>
>
>
> On Saturday, April 1, 2017 at 10:22:04 PM UTC-4, Sean Corfield wrote:
>
> Because when you recur in your loop, you’re passing in lazy sequences, so 
> those are essentially building up a giant stack of delayed evaluations – 
> and when you hit bottom and try to realize those, that’s when your stack 
> overflow hits you.
>
>  
>
> By contrast, your reduce code is eager so the work is done as you work 
> through the sequence, instead of “stacked up” lazily, to be done later.
>
>  
>
> Sean Corfield -- (970) FOR-SEAN -- (904) 302-SEAN
> An Architect's View -- http://corfield.org/
>
> "If you're not annoying somebody, you're not really alive."
> -- Margaret Atwood
>
>  
>
> *From: *piast...@gmail.com
> *Sent: *Saturday, April 1, 2017 6:52 PM
> *To: *Clojure
> *Subject: *Re: I can not find any function that might give rise to 
> thisStackOverflow error
>
>  
>
>
> Crazy! I re-wrote the (loop) to use (reduce) instead and now everything 
> works: 
>
>
> (defn loop-over-scores
>   [set-of-scores]
>   "2017-03-08 -- called from start.clj"
>   (reduce
>    ;; 2017-04-01 -- we assume vector-with-path-score looks like this:
>    ;;  [[:positive :true 0.88 19 60 10 12 3 1 3 1 2 1] 1]
>    ;; so we do a minor bit of destructuring
>    (fn [vector-of-maps-of-vector-key-and-score [vector-with-path score]]
>      (conj vector-of-maps-of-vector-key-and-score
>            (dire/supervise #'map-of-vector-path-and-true-false-scores 
> vector-with-path)))
>    []
>    set-of-scores))
>
>
> The StackOverflow error is gone. 
>
> Sad to say, I'm left with a feeling as if I know nothing about Clojure. I 
> don't know why (loop) gave me a StackOverflow error whereas (reduce) works 
> just fine. This is black magic to me, which, sad to say, is not a 
> comfortable feeling. 
>
>
>
>
>
>
> On Saturday, April 1, 2017 at 7:51:08 PM UTC-4, piast...@gmail.com wrote:
>
> Well, I am out of ideas. Let's assume I'll re-write this some other way. 
> What would be better than using (loop)? What would be less likely to cause 
> StackOverflow, or at least reveal why I'm seeing it. 
>
>
> 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 clo...@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+u...@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+u...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>
>  
>
> -- 
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clo...@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+u...@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+u...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>
>  
>
> -- 
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clo...@googlegroups.com <javascript:>
> Note that posts from new members are moderated - please be patient with 
> your first post.
> To unsubscribe from this group, send email to
> clojure+u...@googlegroups.com <javascript:>
> 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+u...@googlegroups.com <javascript:>.
> For more options, visit https://groups.google.com/d/optout.
>
>

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