Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 6ed8970

Browse filesBrowse files
idiomatic Clojure: use letfn and zero?
1 parent db3add1 commit 6ed8970
Copy full SHA for 6ed8970

File tree

Expand file treeCollapse file tree

5 files changed

+19
-45
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

5 files changed

+19
-45
lines changed
Open diff view settings
Collapse file

‎examples/functional.clj‎

Copy file name to clipboardExpand all lines: examples/functional.clj
+13-36Lines changed: 13 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,49 +11,26 @@
1111
; END: stack-consuming-fibo
1212

1313
; START: tail-fibo
14-
; also bad: still consumes stack!
1514
(defn tail-fibo [n]
16-
(let [fib (fn fib [f-2 f-1 current] ; <label id="code.tail-fibo.args"/>
17-
(let [f (+ f-2 f-1)]
18-
(if (= n current) ; <label id="code.tail-fibo.term"/>
19-
f
20-
(fib f-1 f (inc current)))))] ; <label id="code.tail-fibo.recur"/>
21-
(cond
22-
(= n 0) 0
23-
(= n 1) 1
24-
:else (fib 0 1 2)))) ; <label id="code.tail-fibo.basis"/>
15+
(letfn [(fib ; <label id="code.tail-fibo.letfn"/>
16+
[current next n] ; <label id="code.tail-fibo.args"/>
17+
(if (zero? n)
18+
current ; <label id="code.tail-fibo.terminate"/>
19+
(fib next (+ current next) (dec n))))] ; <label id="code.tail-fibo.recur"/>
20+
(fib 0 1 n))) ; <label id="code.tail-fibo.call"/>
2521
; END: tail-fibo
2622

2723
; START: recur-fibo
2824
; better but not great
2925
(defn recur-fibo [n]
30-
(let [fib (fn [f-2 f-1 current]
31-
(let [f (+ f-2 f-1)]
32-
(if (= n current)
33-
f
34-
(recur f-1 f (inc current)))))] ; <label id="code.recur-fibo.recur"/>
35-
(cond
36-
(= n 0) 0
37-
(= n 1) 1
38-
:else (fib 0 1 2))))
26+
(letfn [(fib
27+
[current next n]
28+
(if (zero? n)
29+
current
30+
(recur next (+ current next) (dec n))))] ; <label id="code.recur-fibo.recur"/>
31+
(fib 0 1 n)))
3932
; END: recur-fibo
4033

41-
; START: fibo-series
42-
; returns series to n
43-
; still bad (heap-consuming!)
44-
(defn fibo-series [count]
45-
(let [n (dec count)
46-
fib (fn [series current] ; <label id="code.fibo-series.series"/>
47-
(let [f (+ (series (- current 1)) (series (- current 2)))]
48-
(if (= current n)
49-
(conj series f) ; <label id="code.fibo-series.term"/>
50-
(recur (conj series f) (inc current)))))] ; <label id="code.fibo-series.recur"/>
51-
(cond
52-
(= n 0) [0] ; <label id="code.fibo-series.0"/>
53-
(= n 1) [0 1] ; <label id="code.fibo-series.1"/>
54-
:else (fib [0 1] 2))))
55-
; END: fibo-series
56-
5734
; START: lazy-seq-fibo
5835
(defn lazy-seq-fibo
5936
([]
@@ -88,7 +65,7 @@
8865

8966
; START: by-pairs
9067
(defn by-pairs [coll]
91-
(let [take-pair (fn take-pair [c] ; <label id="code.by-pairs.take"/>
68+
(let [take-pair (fn [c] ; <label id="code.by-pairs.take"/>
9269
(when (next c) (take 2 c)))]
9370
(lazy-seq ; <label id="code.by-pairs.lazy-seq"/>
9471
(when-let [pair (seq (take-pair coll))] ; <label id="code.by-pairs.when-let"/>
Collapse file

‎examples/male_female.clj‎

Copy file name to clipboardExpand all lines: examples/male_female.clj
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
; do not use these directly
55
(declare m f)
66
(defn m [n]
7-
(if (= n 0)
7+
(if (zero? n)
88
0
99
(- n (f (m (dec n))))))
1010

1111
(defn f [n]
12-
(if (= n 0)
12+
(if (zero? n)
1313
1
1414
(- n (m (f (dec n))))))
1515
; END: m-f
Collapse file

‎examples/male_female_seq.clj‎

Copy file name to clipboardExpand all lines: examples/male_female_seq.clj
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33

44
(declare m f)
55
(defn- m [n]
6-
(if (= n 0)
6+
(if (zero? n)
77
0
88
(- n (f (m (dec n))))))
99

1010
(defn- f [n]
11-
(if (= n 0)
11+
(if (zero? n)
1212
1
1313
(- n (m (f (dec n))))))
1414

Collapse file

‎examples/memoized_male_female.clj‎

Copy file name to clipboardExpand all lines: examples/memoized_male_female.clj
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
; See http://en.wikipedia.org/wiki/Hofstadter_sequence
55
(declare m f)
66
(defn- m [n]
7-
(if (= n 0)
7+
(if (zero? n)
88
0
99
(- n (f (m (dec n))))))
1010

1111
(defn- f [n]
12-
(if (= n 0)
12+
(if (zero? n)
1313
1
1414
(- n (m (f (dec n))))))
1515

Collapse file

‎examples/test/functional.clj‎

Copy file name to clipboardExpand all lines: examples/test/functional.clj
-3Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@
1616
(deftest test-recur-fibo
1717
(is (= ten-fibs (map recur-fibo (range 0 10)))))
1818

19-
(deftest test-fibo-series
20-
(is (= ten-fibs (fibo-series 10))))
21-
2219
(deftest test-fibo
2320
(is (= ten-fibs (take 10 (fibo)))))
2421

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.