On Jul 8, 2014, at 9:40 AM, Cecil Westerhof <[email protected]> wrote:
> In Clojure you can define a local constant with let, but I need a variable (I
> think).
>
> I want to do the following. I have a function that checks several things.
> Every time an error is found I want to set the variable errors to:
> (concat errors new-error)
>
> Is this possible? Or is there a better way to do this?
Here's a different take on your question, and a few comments about how I'd
write that code. I don't think you need the atom -- kinda ugly and the
reduce/map/filter family of sequence functions will take you a long way.
; This is not a predicate, so don't use the -p suffix (and in Clojure it's a ?
normally)
; There's no reason not to pass those two objects into this function, so I do.
(defn errors-in-datastruct [locations objects]
(if (= (count objects) (count locations))
; 'remove' makes a new sequence containing elements that had a falsey
; (false or nil) result to the provided function -- that is the objects
; with no location
; the mapv maps a function over a sequence resulting in a vector.
; the function creates a vector pair for each object containing the error
; code and object
; I find vectors more natural to use in Clojure
; I also find keywords more natural (and useful)
; In my mind, finding the errors and reporting them are two separate
functions. If you want to make
; a nicer error report, then map a reporting function over the error codes.
(mapv #(vector :no-location %) (remove locations objects))
; This reduce does something similar to the mapv/remove combination above,
but
; it gives you more flexibility.
#_(reduce (fn [errors obj]
(if (locations obj)
errors
(conj errors [:no-location obj]))) [] objects)
[[:counts-differ]]))
; use locally scoped variables if you can
(let [locations {:whiskey :living-room
:bucket :living-room
:chain :garden
:frog :garden
:dummy :nowhere}]
(println (errors-in-datastruct locations [:whiskey :bucket :chain :frog
:dummy]))
(println (errors-in-datastruct locations [:whiskey :bucket :chain :frog :pole
:dummy]))
(println (errors-in-datastruct locations [:whiskey :bucket :chain :frog
:pole]))
(println (errors-in-datastruct locations [:whiskey :bucket :chain :frog1
:pole]))
(println (errors-in-datastruct locations [:whiskey :whiskey :whiskey :whiskey
:whiskey])))
; If you need to use the same locations map and don't want to pass it around,
you can
; partially apply the errors-in-datastruct function to the locations, and use
that function.
; You probably don't care about this but the technique can be very handy when
getting
; rid of global variables.
(let [f (partial errors-in-datastruct {:whiskey :living-room
:bucket :living-room
:chain :garden
:frog :garden
:dummy :nowhere})]
(println (f [:whiskey :bucket :chain :frog :dummy]))
(println (f [:whiskey :bucket :chain :frog :pole :dummy]))
(println (f [:whiskey :bucket :chain :frog :pole]))
(println (f [:whiskey :bucket :chain :frog1 :pole])))
I hope you can make sense of that :-)
Cheers,
Bob
>
> --
> Cecil Westerhof
>
> --
> 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]
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.