如何在Clojure上运行

时间:2015-01-28 01:38:31

标签: 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函数时(文件没有被删除)。

1 个答案:

答案 0 :(得分:10)

map 懒惰。当你运行(map delete xs)时,你会立即得到一个懒惰的序列,直到你通过从它请求元素强制序列为止,实际上没有工作。在repl处,序列在打印到屏幕时被强制执行。但是当你运行你的程序时,-main返回void,只是丢弃它收到的值,导致什么都没有实现。如果要迭代序列以产生副作用,则应使用doseqdorun或其他一些副作用序列函数,而不仅仅是map