Fork me on GitHub
#beginners
<
2022-06-14
>
M J07:06:25

Hi, I am a beginner to Clojure, and am trying to set up my team's project on IntelliJ. Its running for them, but for me I am encountering a Java error, and we haven't been able to fix it. I would appreciate any help. This is the error I am getting when doing "lein run": Compiling 2 source files to C:\Projects\strive_clojure\target\default\classes C:\Projects\strive_clojure\java_src\firebase\FirebaseAdmin.java:17: error: cannot find symbol var options = new FirebaseOptions.Builder() ^ symbol: class var location: class FirebaseAdmin C:\Projects\strive_clojure\java_src\firebase\FirebaseAdmin.java:33: error: cannot find symbol var builder = ActionCodeSettings.builder(); ^ symbol: class var location: class FirebaseAdmin Note: C:\Projects\strive_clojure\java_src\firebase\FirebaseAdmin.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details. 2 errors Compilation of Java sources(lein javac) failed. Java Version is: java 17.0.2 2022-01-18 LTS Java(TM) SE Runtime Environment (build 17.0.2+8-LTS-86) Java HotSpot(TM) 64-Bit Server VM (build 17.0.2+8-LTS-86, mixed mode, sharing)

Ferdinand Beyer07:06:45

Looks like a Java version issue. Just learned the var keyword was introduced in Java 10, maybe you have multiple Java versions installed and use the wrong one?

Ferdinand Beyer07:06:49

What does lein version print?

emccue14:06:02

you need to make sure to run the java compiler with --release

popeye11:06:09

I have a map like below, how can i sort descending as per key :value

(def abc ({:Number 1, :value 11} {:Number 2, :value 7} {:Number 3, :value 78}))

Martin Půda12:06:33

(->> [{:Number 1, :value 11} {:Number 2, :value 7} {:Number 3, :value 78}]
     (sort-by :value >))

=> ({:Number 3, :value 78} {:Number 1, :value 11} {:Number 2, :value 7})

popeye12:06:18

why this giving me null?

(sort-by :value > (into [] ({:Number 1, :value 11} {:Number 2, :value 12} {:Number 3, :value 78})))

Martin Půda12:06:56

Your list is missing quote .

(sort-by :value > (into [] '({:Number 1, :value 11} {:Number 2, :value 12} {:Number 3, :value 78})))

=> ({:Number 3, :value 78} {:Number 2, :value 12} {:Number 1, :value 11})

Martin Půda12:06:52

And you don't have to convert it into vector:

(sort-by :value > '({:Number 1, :value 11} {:Number 2, :value 12} {:Number 3, :value 78}))

=> ({:Number 3, :value 78} {:Number 2, :value 12} {:Number 1, :value 11}) 

popeye12:06:41

I think I should make use of apply?

Martin Půda12:06:34

Oh, I see the mistake! Your abc has value {:Number 3, :value 78} , because you didn't use quote, so operator was first hash-map and abc was evaluated like that "look for second object in first object (which is a hash map) and if you don't find it, return third object".

Martin Půda12:06:15

So use this definition:

(def abc [{:Number 1, :value 11} {:Number 2, :value 7} {:Number 3, :value 78}])

(sort-by :value > abc)
=> ({:Number 3, :value 78} {:Number 1, :value 11} {:Number 2, :value 7})

popeye12:06:31

My abc is a lazy seq

Martin Půda12:06:23

(def abc ({:Number 1, :value 11} {:Number 2, :value 7} {:Number 3, :value 78}))

abc
=> {:Number 3, :value 78}

Martin Půda13:06:04

Vs this one:

(def abc [{:Number 1, :value 11} {:Number 2, :value 7} {:Number 3, :value 78}])

abc
=> [{:Number 1, :value 11} {:Number 2, :value 7} {:Number 3, :value 78}]

Martin Půda13:06:20

And if you want to have lazy-seq, use sequence:

(def abc (sequence [{:Number 1, :value 11} {:Number 2, :value 7} {:Number 3, :value 78}]))

abc
=> ({:Number 1, :value 11} {:Number 2, :value 7} {:Number 3, :value 78})

Jim Strieter13:06:47

I have 2 maps, m1 and m2. m1 contains a lot of lists:

(def m1 {:a '() :b '() :c '()})
m2 contains the same keys, but the values are scalars I want to append to all the lists in m1:
(def m2 {:a 1 :b 42 :c 99})
Right now I am doing this:
(defn update-m1
  [m1 m2]
  {:a (conj (get-in m1 [:a]) (:a m2))
   :b (conj (get-in m1 [:b]) (:b m2))
   ...
   })
(In the real program, m1 is buried inside a larger map, hence get-in instead of (:a m1), etc.) What is a more idiomatic way of doing the same thing?

Martin Půda13:06:14

(def m1 {:a '() :b '() :c '()})

(def m2 {:a 1 :b 42 :c 99})

(reduce-kv (fn [m k v] (update m k conj v)) m1 m2)
=> {:a (1), :b (42), :c (99)}

dpsutton14:06:21

There's a function called merge-with that could help as well

👆 2
Jim Strieter16:06:19

Thank you guys! 🙂