Jim Cheung

Thursday, August 02, 2018

when using m-x cider-scratch, if using boot, can add dependencies like this:

(set-env! :dependencies #(into % '[[org.clojure/data.json "0.2.6"]]))

(require '[clojure.data.json :as json])


watched this talk Domain-Driven Design: Hidden Lessons from the Big Blue Book - Nick Tune

speaker is author of these two books:


compare two regions under emacs:

ediff will prompt you to select the buffer and regions you wish to compare


continue reading Programming Clojure 3rd Edition

guidelines for FP (clojure-style):

  1. Avoid direct recursion. The JVM can’t optimize recursive calls, and Clojure programs that recurse will blow their stack.
  2. Use recur when you’re producing scalar values or small, fixed sequences. Clojure will optimize calls that use an explicit recur.
  3. When producing large or variable-sized sequences, always be lazy. (Do not recur.) Then, your callers can consume just the part of the sequence they actually need.
  4. Be careful not to realize more of a lazy sequence than you need.
  5. Know the sequence library. You can often write code without using recur or the lazy APIs at all.
  6. Subdivide. Divide even simple-seeming problems into smaller pieces, and you’ll often find solutions in the sequence library that lead to more general, reusable code.

rule 3 is particular important to me

(defn lazy-seq-fibo
 ([]
  (concat [0 1] (lazy-seq-fibo 0N 1N))) 
 ([a b]
  (let [n (+ a b)]                    
   (lazy-seq                         
    (cons n (lazy-seq-fibo b n)))))) 

then apply rule 5:

(​defn​ fibo []
 (map first (iterate (fn [[a b]] [b (+ a b)]) [0N 1N])))

however, when using lazy seq, remember not to hold the head (first item) of a sequence, it prevents the garbage collector from reclaiming elements of the sequence

for example, check this question: How to forget head(GC'd) for lazy-sequences in Clojure? and documentation on lazy-cat


a detailed explaination on fold: Exploring the fold Function from the book Clojure standard library

slides for a talk about aleph: Deep HTTP Dive Through Aleph and Netty

about linux disk io and nginx: How we scaled nginx and saved the world 54 years every day


nREPL added some supports for clj:

add to ~/.clojure/deps.edn:

{
:aliases {:nREPL
          {:extra-deps
            {nrepl/nrepl {:mvn/version "0.4.4"}}}}
}

then run headless nrepl server:

$ clj -R:nREPL -m nrepl.cmdline
Blog Archive