This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2020-03-14
Channels
- # aleph (1)
- # announcements (4)
- # babashka (12)
- # beginners (28)
- # bristol-clojurians (1)
- # calva (28)
- # cljs-dev (8)
- # cljsrn (1)
- # clojure (16)
- # clojure-europe (2)
- # clojure-uk (125)
- # clojurescript (6)
- # cursive (17)
- # datomic (2)
- # kaocha (7)
- # off-topic (6)
- # reagent (3)
- # shadow-cljs (25)
- # sql (6)
- # tree-sitter (1)
(defn eval-not
[input]
(cond
(and (seq? (second input)) (= 'and (first (second input)))) ;(do x here which -> (or (not x) (not y))
))
If the user types in: (eval-not '(not (and x y))), is there a way to return (or (not x) (not y)) Without using macros and without changing the style of code I have already written above. I asked this question before, but I was not very specific as to what I was asking. I hope this question is better written.is there any particular reason the style of the code canβt be changed?
Well. I created the homework assignment and I did any other functions in the same format. Would appreciate any advice :)
(defn demorgan
[form]
(cond
(atom? form)
form
(and (= 'not (first form))
(sequential? (second form))
(= 'and (first (second form))))
(let [[_ [_ & terms]] form]
(list* 'or (map (comp #(list 'not %) demorgan) terms)))
:else
form))
I am sure there is a function to convert the following collection of albums to be grouped by artists instead, or is this in need of a reducing function?
(def music-collection
[{:album-name "Tubular Bells" :artist "Mike Oldfield"}
{:album-name "Smells like teen spirit" :artist "Nirvana"}
{:album-name "Vision Thing" :artist "Sisters of Mercy"}
{:album-name "Here comes the war" :artist "New Model Army"}
{:album-name "Thunder & Consolation" :artist "New Model Army"}])
So the results would look like
{"Mike Oldfield" ["Tubular Bells"]
"Nirvana" ["Smells like teen spirit"]
"Sisters of Mercy" ["Vision Thing"]
"New Model Army" ["Here comes the war" "Thunder & Consolation"]}
I suggest trying a group-by
followed by a map
to convert the values to a vector.
I tried group-by after I partitioned it and made a mess π group-by :artist music-collection
on its own does a better job, although its not quite the right shape and artist details repeated. An anonymous function with group-by should fix it I think
This loop-recur does what I was looking for, but its so much code π
(loop [albums music-collection
by-artist {}]
(let [album (first albums)]
(if (empty? albums)
by-artist
(recur (rest albums)
(update by-artist
(keyword (:artist album))
conj (:album-name album))))))
hmm, loop-recur is the only approach that works so far π
As mentioned above you could try something like that
(reduce-kv (fn [m k v] (assoc m k (map :album-name v)))
{}
(group-by :artist music-collection))
The above works great, also if you wanted to do it using purely sequence function (and for example if you don't remember reduce-kv
's syntax off the top of your head)
(defn artist->albums
[coll]
(->> coll
(group-by :artist)
(map (fn [[k v]]
[k (mapv :album-name v)]))
(into {})))
^^ is good and here's the same thing using a transducer instead of ->>.
(into {}
(map (fn [[k v]]
[k (mapv :album-name v)]))
(group-by :artist music-collection))
Any form to express it more short and intuitive?
maybe without necessity to use the function int-or-nothing
Is just an example
if-let is in a function
yes, I just want to corroborate if this difference is greater than 0, and asign this value to a variable
btw it's generally considered bad-form to use if-let and if without else branches. if you have no else branch use when
and when-let
Thank you for that!
@UUGUA0MGQ if you don't mind, please post text instead of images, much easier to read for me anyway. To get syntax coloring you can post a snippet with Ctrl-Shift-Enter and select Clojure for the Type.