【问题标题】:Clojure: Recur anonymous function with different arityClojure:具有不同数量的递归匿名函数
【发布时间】:2019-05-19 17:50:03
【问题描述】:

类似于Clojure recur with multi-arity 我想以不同的数量重复出现。但就我而言,我通过 let 定义函数,因为我想使用 let (file-list) 中的另一个值而不传递它:

(let [file-list (drive/list-files! google-drive-credentials google-drive-folder-id)
      download-file (fn
                      ([name]
                       (download-file ; <-- attempt to recur
                         name
                         (fn []
                           (throw
                             (ex-info
                               (str name " not found on Google Drive"))))))
                      ([name not-found-fn]
                       (if-let [file (->> file-list
                                          (filter #(= (:original-filename %)
                                                      name))
                                          first)]
                         (drive/download-file! google-drive-credentials file)
                         (not-found-fn))))]
  ;; #
  )

我收到此错误:Exception in thread "main" java.lang.RuntimeException: Unable to resolve symbol: download-file in this context

【问题讨论】:

    标签: clojure arity


    【解决方案1】:

    你可以给fn一个本地名称:

    (let [download-file (fn download-file
                          ([name] (download-file name (fn ...))))
    

    你也可以使用letfn:

    (letfn [(download-file
              ([name] (download-file name (fn ...)))
              ([name not-found-fn] ...)])
    

    【讨论】:

      【解决方案2】:

      为了让异常错误信息更易读,我经常在内部函数名后面加上-fn,像这样:

      (let [download-file (fn download-file-fn [name] ...) ]
         <use download-file> ...)
      

      【讨论】:

        猜你喜欢
        • 2011-08-03
        • 2022-06-20
        • 1970-01-01
        • 2015-11-21
        • 2011-01-29
        • 2011-04-22
        • 2020-09-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多