J'ai écrit un bout de code pour compter le caractère dièse (#) de tête d'une ligne, ce qui est un peu comme une ligne d'en-tête en Markdown
\### Line one -> return 3
######## Line two -> return 6 (Only care about the first 6 characters.
Version 1
(defn
count-leading-hash
[line]
(let [cnt (count (take-while #(= % \#) line))]
(if (> cnt 6) 6 cnt)))
Version 2
(defn
count-leading-hash
[line]
(loop [cnt 0]
(if (and (= (.charAt line cnt) \#) (< cnt 6))
(recur (inc cnt))
cnt)))
J'ai utilisé time
pour mesurer les deux implémentations de tow, a constaté que la première version basée sur la technologie take-while
est deux fois plus rapide que la version 2. Pris "###### Line one"
en entrée, la version 1 a pris 0,09 msecs La version 2 a pris environ 0,19 msecs .
Question 1. S'agit-il recur
qui ralentit la deuxième mise en œuvre ?
Question 2. La version 1 est plus proche du paradigme de la programmation fonctionnelle, n'est-ce pas ?
Question 3. Lequel préférez-vous ? Pourquoi ? (Nous vous invitons à rédiger votre propre mise en œuvre).
--Mise à jour--
Après avoir lu le doc de cloujure J'ai donc mis au point une nouvelle version de cette fonction, et je pense qu'elle est beaucoup plus claire.
(defn
count-leading-hash
[line]
(->> line (take 6) (take-while #(= \# %)) count))