gpt4 book ai didi

clojure - 惯用 Clojure

转载 作者:行者123 更新时间:2023-12-02 13:32:32 30 4
gpt4 key购买 nike

我对 Clojure 和函数式编程有了大约一周的了解——我的所有背景都是 OOP。我想利用 Clojure 备受争议的易读性和固有逻辑,但现在我不知道我是否成功地做到了这一点,只是没有完全理解它,或者我是否真的滥用了该语言以一种糟糕的方式。

例如:

(ns waterfall-quiz.response-parser
(:require [clojure.java.io :as io]))

(defn process-input
[input]
(finalize-input
(normalize-height
(map-input
(numberize-vector
(vectorize-input
(clean-input input)))))))

(defn clean-input
"Removes extraneous whitespace."
[input]
(clojure.string/replace input #"\s+" " "))

(defn vectorize-input
"Turns input into a vector."
[input]
(clojure.string/split input #"\s"))

(...)

我对 process-input 函数非常怀疑,它调用所有其他函数来格式化某些输入。它是引用透明的,但看起来很脆弱——是否有更智能的方法将所有功能链接在一起?

另一个例子:

(defn map-builder
"Transforms the vector of waterfalls into a map of waterfalls."
[vectorized-db]
(assoc waterfall-db
(keyword (str 'waterfall (first (re-seq #"[0-9]+" (str (first vectorized-db))))))
(subs (str (first vectorized-db)) (+ 2 (.indexOf (str (first vectorized-db)) ":")))))

在编写该函数时,我经常忘记括号中的位置 - 是否应该将其分解为更小的函数?

最佳答案

最能改进代码的两个 Clojure 惯用工具是 let-> 宏。

let允许您逐步构建本地绑定(bind)

->以更具可读性和更易于编辑的形式将一系列函数调用链接在一起

(defn process-input
[input]
(-> input
clean-input
vectorize-input
numberize-vector
map-input
normalize-height
finalize-input))

(defn map-builder
"Transforms the vector of waterfalls into a map of waterfalls."
[waterfall-db vectorized-db]
(let [key-str (str (first vectorized-db))
key (->> key-str
(re-seq #"[0-9]+")
first
(str 'waterfall)
keyword)
val (subs key-str (+ 2 (.indexOf key-str ":")))]
(assoc waterfall-db key val)))

我还冒昧地将waterfall-db作为 map 生成器的参数,以便可以更轻松地在功能代码中使用它(也许可以在swap!的帮助下) >、减少更新)。

关于clojure - 惯用 Clojure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23935885/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com