我正在编写一个循环,它从向量中的字符串数据创建一个映射.在每次迭代中,我取向量中的最后一项,从中构造一个键和一个值,将它们与地图相关联,然后弹出刚刚从向量中记录到地图的项目.只要向量中仍有项目,此过程应不断重复,直到向量为空并且地图已满.
该函数如下:
(defn map-builder
"Transforms the vector of waterfalls into a map of waterfalls."
[input]
(loop [waterfall-db {}
vectorized-db input]
(let [key-str (last vectorized-db)]
key (->> key-str
(re-seq #"[0-9]+")
keyword)
val (subs key-str (+ 2 (.indexOf key-str ":"))))
(assoc waterfall-db key val)
(pop vectorized-db)
(if (> (count vectorized-db) 0)
(recur waterfall-db vectorized-db) waterfall-db)))
Run Code Online (Sandbox Code Playgroud)
程序编译,但似乎无限循环.我做了一个测试,在一次迭代后使循环退出,并返回一个空映射(它应该有一个项目).很明显,我不正确地将项目与地图关联起来,这让我觉得我必须也不正确地将项目与向量分离.我无法看到我出错的地方 - 我是不是我的当地人不合适?
我大约一周参加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"))
(...)
Run Code Online (Sandbox Code Playgroud)
我非常怀疑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 …Run Code Online (Sandbox Code Playgroud)