【问题标题】:In Clojure: Error executing a Java call with let inside a function but not in REPL在 Clojure 中:在函数中使用 let 执行 Java 调用时出错,但在 REPL 中没有
【发布时间】:2011-03-14 23:02:32
【问题描述】:

我有以下代码:

(defn post
  [title content timestamp]
    (let [[innholdet tajm]
       [(str "<html>
              <head>
              <title>" title " :: " blog_title "</title></head>
              <body><h1>" title "</h1>
              <br/>" content "<br/><i>posted " (Date. timestamp) "</i>
              <br/><a href=\"" (str blog_url) "\">[main]</a> | 
              <a href=\"" (str blog_url) "/" timestamp ".html\">[permalink]</a>
              </body></html>") (str timestamp".html")]]
                 (spit tajm innholdet)
   )
 )

我有另一个函数将标题、内容和 UNIX 时间戳传递给上面的函数“post”。 blog_title 和 blog_url 是在代码顶部定义的 var。为了美观,我对 HTML 进行了排序,在“真实代码”中并非如此。我也在做

(import 'java.util.Date)
(use 'clojure.string)

如果我尝试执行代码我会得到一个错误

java.lang.IllegalArgumentException 

如果我删除(日期。时间戳)代码执行完美,但我需要有那个(日期。)功能。

现在,如果我在 REPL 中这样做

(import 'java.util.Date)

然后定义一个带时间戳的变量

(def timestamp 1278854531000) ;; Just for pushing a var into (Date.) than just the number

然后我只是将 (let) 复制到 REPL 并调整原始代码中的 var 以仅表示不同的函数名称而不是值(因为这是 REPL 以及其中的 var、函数和值原代码不存在),变成这样:

(let [[innholdet tajm] 
  [(str "<html>
         <head>
         <title>" (str "title") " :: " (str "blog_title") "</title>
         </head>
         <body><h1>" (str "title") "</h1><br/>" (str "content") "<br/>
         <i>posted " (Date. timestamp) "</i><br/>
         <a href=\"" (str "blog_url") "\">[main]</a> | 
         <a href=\"" (str "blog_url") "/" (str "1278854531000") ".html\">[permalink]</a></body></html>") 
         (str "1278854531000.html")]] 
           (println innholdet tajm))

现在 REPL 给了我:

<html>
<head>
<title>title :: blog_title</title>
</head>
<body>
<h1>title</h1><br/>content<br/>
<i>posted Sun Jul 11 15:22:11 CEST 2010</i><br/>
<a href="blog_url">[main]</a> | 
<a href="blog_url/1278854531000.html">[permalink]</a>
</body></html> 
1278854531000.html
nil

再一次,所有的东西都被转移了,这样阅读起来会更友好,在 REPL 中,所有东西都放在一个大字符串中。

这里的问题是我可以在 REPL 中执行代码并获取 (Date.timestamp) 的值并且一切正常,但是当我在程序中的函数内部执行它时,我得到了上述错误。如果有人能告诉我我在这里缺少什么,将不胜感激。

【问题讨论】:

  • 你试过投到长吗? (Date. (long timestamp))
  • @Jonas 导致:“线程“main”中的异常 java.lang.ClassCastException:java.lang.String 无法转换为 java.lang.Number”和“原因:java.lang .ClassCastException: java.lang.String 无法在 clojure.lang.RT.longCast(RT.java:961) 处转换​​为 java.lang.Number"
  • @bleakgadfly:那么你的论点是一个字符串而不是一个数字。您需要将字符串解析为数字,例如。使用 Long/parseLong
  • 我的经验是,如果传递的数字足够大,无法放入 int (例如您放入 timestamp Var 的那个),上述定义的函数就可以工作,但当该数字确实适合int(因为Date 没有构造函数采用单个int)。您可能要考虑使用Long/valueOf(它将与ints、longs 和Strings 一起使用)。
  • 似乎 Long/valueOf 成功了 :) 谢谢!

标签: java clojure lisp read-eval-print-loop illegalargumentexception


【解决方案1】:

只需稍作改动:

(defn post
  [title content timestamp]
    (let [[innholdet tajm]
       [(str "<html>
              <head>
              <title>" title " :: " blog_title "</title></head>
              <body><h1>" title "</h1>
              <br/>" content "<br/><i>posted " (Date. **(Long/parseLong timestamp)**) "</i>
              <br/><a href=\"" (str blog_url) "\">[main]</a> | 
              <a href=\"" (str blog_url) "/" timestamp ".html\">[permalink]</a>
              </body></html>") (str timestamp".html")]]
                 (spit tajm innholdet)
   )
 )

但是,我仍然建议您想办法将时间戳作为长而不是字符串传递。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    相关资源
    最近更新 更多