How-main在Clojure上的工作方式
我遇到了clojure代码的问题,我不明白这里发生了什么 代码:How-main在Clojure上的工作方式,clojure,Clojure,我遇到了clojure代码的问题,我不明白这里发生了什么 代码: 问题是,当我执行clean bucket if limit only(在REPL上)时,一切都很好,但当我使用主功能时,一切都没有问题(文件没有被删除)。map是惰性的。当您运行(map delete xs)时,您会立即返回一个惰性序列,在您通过请求元素强制执行序列之前,实际上不会执行任何操作。在repl,当序列被打印到屏幕上时,它被强制执行。但当您真正运行程序时,-main返回void,并丢弃它接收到的值,导致无法实现任何功能。
问题是,当我执行clean bucket if limit only(在REPL上)时,一切都很好,但当我使用主功能时,一切都没有问题(文件没有被删除)。
map
是惰性的。当您运行(map delete xs)
时,您会立即返回一个惰性序列,在您通过请求元素强制执行序列之前,实际上不会执行任何操作。在repl,当序列被打印到屏幕上时,它被强制执行。但当您真正运行程序时,-main
返回void,并丢弃它接收到的值,导致无法实现任何功能。如果您想在序列上迭代产生副作用,而不仅仅是map
,您应该使用doseq
或dorun
或其他一些副作用序列函数,您确定-main
正在运行吗?正在执行执行操作-
函数吗?当从-main
运行如果limit
清理桶时,(计数对象)
的值是多少?如果需要,您可以在代码中添加println
语句来检查这一点。如果限制为,您的-main是否在清理桶后定义?良好点Shlomi。或者声明中列出了限制,那么是否清洁桶?@Shlomi yes,-main在后面定义。@elf,那很好,我还发现amalloy正确回答了你的问题。我建议你在以后的问题中保持代码的正确顺序,这样我们就不会被误导了。
(defn -main []
(clean-bucket-if-limit)
(do-something-1)
(do-something-2)
(do-something-3))
(defn clean-bucket-if-limit
[]
(let [objects (get (s3/list-objects cred "deske") :objects)]
(let [number (count objects)]
(if (> 3 number)
(map delete-file-s3 objects)
(println "no limit")))))
(defn delete-file-s3
[object]
(let [key (get object :key)]
(s3/delete-object cred "bucket-name" key)))