是否可以浏览您在Eclipse中输入逆时针REPL的历史?就像按下向上箭头或ctrl-p或其他在其他repl中工作的其他东西一样?谢谢!-Philip
我已经阅读了其他人关于在Clojure中出现堆栈溢出问题的问题,而这个问题往往是在某个地方构建一个懒惰的序列.这似乎是这里的问题,但对于我的生活,我无法弄清楚在哪里.
这是代码,代码之后是一些解释:
(defn pare-all []
"writes to disk, return new counts map"
(loop [counts (counted-origlabels)
songindex 0]
(let [[o g] (orig-gen-pair songindex)]
(if (< songindex *song-count*) ;if we are not done processing list
(if-not (seq o) ;if there are no original labels
(do
(write-newlabels songindex g);then use the generated ones
(recur counts (inc songindex)))
(let [{labels :labels new-counts :countmap} (pare-keywords o g counts)] ;else pare the pairs
(write-newlabels songindex labels)
(recur new-counts (inc songindex))))
counts))))
Run Code Online (Sandbox Code Playgroud)
存储在最初从函数"counting-origlabels"中检索的"计数"中的映射.地图具有字符串键和整数值.它是600左右的项目,并且迭代期间值更新但长度保持不变,我已经验证了这一点.
"orig-gen-pair"函数从文件中读取并返回一对短序列,每个序列有10个左右的项目.
"write-newlabels"函数只是将传递的序列命名为磁盘,没有任何其他副作用,也没有返回值.
"Pare-keywords"返回短序列和"计数"映射的更新版本.
我只是没有看到懒惰的序列可能导致这里的问题! …
我已经开始学习clojure,但是我无法绕过某些概念.例如,我想在这里做的是采取这个函数并转换它,以便它懒洋洋地调用get-origlabels.
(defn get-all-origlabels []
(set (flatten (map get-origlabels (range *song-count*)))))
Run Code Online (Sandbox Code Playgroud)
我的第一次尝试使用递归但是炸毁了堆栈(歌曲数量大约是10,000).我无法弄清楚如何使用尾递归来做到这一点.
get-origlabels每次调用时都会返回一个集合,但值通常会在调用之间重复.get-origlabels函数实际上做的是读取一个文件(每个值的一个不同的文件,从0到song-count -1)并将一个存储在其中的单词返回到一个集合中.
任何指针将不胜感激!
谢谢!-Philip