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: *[email protected] <javascript:>
> *Sent: *Saturday, April 1, 2017 9:56 PM
> *To: *Clojure <javascript:>
> *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: *[email protected]
> *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, [email protected] 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, [email protected] 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 [email protected]
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> [email protected]
> 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 [email protected].
> 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 [email protected] <javascript:>
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> [email protected] <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 [email protected] <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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.