【问题标题】:Clojure - Docjure: Method works in REPL but not in FileClojure - Docjure:方法在 REPL 中有效,但在文件中无效
【发布时间】:2014-09-16 19:05:21
【问题描述】:

我只是尝试在 clojure 中读取 excel 文件的内容。我使用文档库。当我在 REPL 中使用示例代码时,输​​出是我想要的。但在将其插入文件后,我得到了错误数量的参数 - 电子表格/选择表方法错误。

代码如下:

(use 'dk.ative.docjure.spreadsheet)

(->> (load-workbook (str (System/getProperty "user.dir") "/resources/public/xls/test.xls")
                    (select-sheet "menu")
                    (select-columns {:A :number, :D :name})
                    ))

这个方法的参数是[name ^Workbook workbook]。为什么 REPL 中只需要一个参数,而文件中只需要两个?

【问题讨论】:

  • 你在线程宏中弄错了括号。您需要将select-sheetselect-columns 表单拉到load-workbook 表单之外。如此处所写,(select-sheet "menu") 将被评估并作为 arg 传递给 load-workbook

标签: excel clojure read-eval-print-loop


【解决方案1】:

正如 Alex 在 cmets 中所说,你搞砸了括号。

现在您的代码代码计算结果为:

(load-workbook (str (System/getProperty "user.dir")
                    "/resources/public/xls/test.xls")
               (select-sheet "menu")
               (select-columns {:A :number, :D :name}))

你的实际代码应该是这样的:

(->> "/resources/public/xls/test.xls"
     (str (System/getProperty "user.dir"))    ; prefix it with user.dir
     load-workbook                            ; load .xls workbook
     (select-sheet "menu")                    ; select menu sheet
     (select-columns {:A :number, :D :name})) ; select some columns

计算结果为:

(select-columns {:A :number, :D :name}
                (select-sheet "menu"
                              (load-workbook (str (System/getProperty "user.dir")
                                                  "/resources/public/xls/test.xls"))))

如您所见,select-sheetselect-columns 都在这里使用两个参数调用。

为了更好地理解最后线程宏 ->> 的工作原理,see its documentation

【讨论】:

  • 感谢您的解释。但为什么它会在 REPL 中进行评估?
  • @DanielderGrosse 它不应该。检查你的 REPL 历史,很可能你的实际代码看起来不同。您只是放错了一个括号,很容易错过。
猜你喜欢
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 2020-11-14
相关资源
最近更新 更多