在Clojure中:执行Java调用时出错,let在函数中,而不是在REPL中
我有以下代码:在Clojure中:执行Java调用时出错,let在函数中,而不是在REPL中,java,clojure,lisp,read-eval-print-loop,illegalargumentexception,Java,Clojure,Lisp,Read Eval Print Loop,Illegalargumentexception,我有以下代码: (defn post [title content timestamp] (let [[innholdet tajm] [(str "<html> <head> <title>" title " :: " blog_title "</title></head> <body><h1>" ti
(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)
)
)
如果我试图执行代码,我会得到一个错误
java.lang.IllegalArgumentException
如果我删除了(Date.timestamp),代码就会完美地执行,但我需要有(Date.)函数
现在,如果我回答是这样的话
(import 'java.util.Date)
然后定义一个带有时间戳的var
(def timestamp 1278854531000) ;; Just for pushing a var into (Date.) than just the number
然后我将(let)复制到REPL中,并调整原始代码中的变量,使其仅表示不同的函数名而不是值(因为这是REPL,原始代码中不存在变量、函数和值),如下所示:
(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))
(let[[innholdt tajm]
[(str)”
(str“title”):(str“blog_title”)
“(str“title”)”
“(str“content”)”
已发布“(日期时间戳)”
|
")
(str“1278854531000.html”)]]
(println Innholdt 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
标题::博客标题
标题
内容
发布日期:2010年7月11日15:22:11 CEST
|
1278854531000.html
无
同样,所有的内容都被改变了,以便阅读起来更加友好,在REPL中,所有内容都以一个大字符串显示
这里的问题是,我可以在REPL中执行代码并获得(Date.timestamp)的值,然后一切都解决了,但是当我在程序中的一个函数中执行它时,我会得到上面提到的错误。如果有人能告诉我这里缺少什么,我将不胜感激。只需要一点小小的改变:
(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)
)
)
(defn post
[标题内容时间戳]
(让[Innholdt tajm]
[(str)”
“标题”:“博客标题”
“标题”
“内容”
已发布“(日期。**(长/长时间戳)**)”
“”(str timestamp“.html”)]]
(斯皮特泰姆酒店)
)
)
但是,我仍然建议您找出一种方法,将时间戳作为long而不是字符串传递。您是否尝试转换为long
(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@那么你的参数是一个字符串而不是一个数字。您需要将字符串解析为一个数字,例如使用Long/parselong我的经验是,如果传递的数字足够大,不能放入int
(例如您放入时间戳
Var中的数字),则上面定义的函数可以工作,但当数字不适合int
(因为<代码>日期<代码>没有一个构造函数采用单一的<代码> int <代码>)。您可能需要考虑使用<代码>长/值> <代码>(它将与<代码> int <代码> >,<代码>长< //>代码>和代码>字符串< /代码> s。
(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)
)
)