-main 如何在 Clojure 上工作
How -main works on Clojure
我的 clojure 代码有问题,我不明白这里发生了什么。
代码:
(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)))
问题是当我只执行 clean-bucket-if-limit 时(在 REPL 上),一切正常,但是当我使用 main 函数时却不行(文件没有被删除)。
map
是 懒惰 。当您 运行 (map delete xs)
时,您会立即返回一个惰性序列,并且在您通过从中请求元素来强制序列之前不会实际完成任何工作。在 repl 中,序列在打印到屏幕时被强制执行。但是当你 运行 你的程序真正的时候, -main
returns 无效,并且只是丢弃它接收到的值,导致任何事情都无法实现。如果您想遍历一个序列以获得副作用,您应该使用 doseq
或 dorun
或其他一些有副作用的序列函数,而不仅仅是 map
.
我的 clojure 代码有问题,我不明白这里发生了什么。
代码:
(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)))
问题是当我只执行 clean-bucket-if-limit 时(在 REPL 上),一切正常,但是当我使用 main 函数时却不行(文件没有被删除)。
map
是 懒惰 。当您 运行 (map delete xs)
时,您会立即返回一个惰性序列,并且在您通过从中请求元素来强制序列之前不会实际完成任何工作。在 repl 中,序列在打印到屏幕时被强制执行。但是当你 运行 你的程序真正的时候, -main
returns 无效,并且只是丢弃它接收到的值,导致任何事情都无法实现。如果您想遍历一个序列以获得副作用,您应该使用 doseq
或 dorun
或其他一些有副作用的序列函数,而不仅仅是 map
.