clojure 对等式使用线程宏
clojure use threading macro for equation
我在 java 中有这个等式,我想将其翻译成 clojure:
limit = (int)(n*(Math.log(n) + Math.log(Math.log(n)))) + 3;
我想避免它变成嵌套括号的海洋,在 clojure 中使其可读的最佳方法是什么?
您可以使用 let
形式将公式分解为更简单的部分:
(defn calc-limit [n]
(let [log (Math/log n)
loglog (Math/log log)
logsum (+ log loglog)]
(-> n (* logsum) int (+ 3))))
(calc-limit 256) ; => 1861
您在问题的标题中提到了线程宏,因此我将提供一个主要针对此问题的变体,使用 let
避免计算 (Math/log n)
两次:
(let [x (Math/log n)]
(-> (Math/log x)
(+ x)
(* n)
(int)
(+ 3)))
旁注:在
时使用let
是有意义的
- 您有必须多次使用的值,
- 您想通过明确命名中间结果来提高可理解性,或者
- 您想通过将问题拆分成更小的部分来提高可读性。
我不得不同意其他答案,即带有一些描述性名称的 let
阅读起来更有启发性。但是如果你只想用一个线程宏来做,那可以使用 ìterate
:
(defn calc-limit [n]
(->> n
(iterate #(Math/log %))
(drop 1) ;;The first value is just n, with no logarithms applied
(take 2) ;;Taking the 1st and 2nd iterations of Math/log on n
(reduce +)
(* n)
int
(+ 3)))
您也可以使用 Graph,尤其是当您的公式会变大并且速度不是什么大问题时:
(use 'plumbing.core)
(require '[plumbing.graph :as graph])
(def limit-graph
{:log (fnk [n] (Math/log n))
:loglog (fnk [log] (Math/log log))
:logsum (fnk [log loglog] (+ log loglog))
:limit (fnk [n logsum] (-> logsum (* n) int (+ 3)))})
(def calc-limit (graph/compile limit-graph))
(:limit (calc-limit {:n 5}))
我在 java 中有这个等式,我想将其翻译成 clojure:
limit = (int)(n*(Math.log(n) + Math.log(Math.log(n)))) + 3;
我想避免它变成嵌套括号的海洋,在 clojure 中使其可读的最佳方法是什么?
您可以使用 let
形式将公式分解为更简单的部分:
(defn calc-limit [n]
(let [log (Math/log n)
loglog (Math/log log)
logsum (+ log loglog)]
(-> n (* logsum) int (+ 3))))
(calc-limit 256) ; => 1861
您在问题的标题中提到了线程宏,因此我将提供一个主要针对此问题的变体,使用 let
避免计算 (Math/log n)
两次:
(let [x (Math/log n)]
(-> (Math/log x)
(+ x)
(* n)
(int)
(+ 3)))
旁注:在
时使用let
是有意义的
- 您有必须多次使用的值,
- 您想通过明确命名中间结果来提高可理解性,或者
- 您想通过将问题拆分成更小的部分来提高可读性。
我不得不同意其他答案,即带有一些描述性名称的 let
阅读起来更有启发性。但是如果你只想用一个线程宏来做,那可以使用 ìterate
:
(defn calc-limit [n]
(->> n
(iterate #(Math/log %))
(drop 1) ;;The first value is just n, with no logarithms applied
(take 2) ;;Taking the 1st and 2nd iterations of Math/log on n
(reduce +)
(* n)
int
(+ 3)))
您也可以使用 Graph,尤其是当您的公式会变大并且速度不是什么大问题时:
(use 'plumbing.core)
(require '[plumbing.graph :as graph])
(def limit-graph
{:log (fnk [n] (Math/log n))
:loglog (fnk [log] (Math/log log))
:logsum (fnk [log loglog] (+ log loglog))
:limit (fnk [n logsum] (-> logsum (* n) int (+ 3)))})
(def calc-limit (graph/compile limit-graph))
(:limit (calc-limit {:n 5}))