4

У меня есть следующий код:В Clojure: Ошибка при выполнении вызова Java с впустили функции, но не в РЕПЛ

(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 к функция «пост» выше. blog_title и blog_url - это var, определенные в верхней части кода. Я отсортировал HTML для эстетики, в «реальном коде» это не так. Я также делаю

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

Если я пытаюсь выполнить код, я получаю сообщение об ошибке

java.lang.IllegalArgumentException 

Если удалить (Date. Отметка времени) код выполняется прекрасно, но мне нужно иметь, что (Дата .) функция.

Теперь, если в РЕПЛ я

(import 'java.util.Date) 

Затем определяют вар с меткой времени

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

А потом я просто скопировать (пусть) в REPL и настроить ВАР в оригинале кода, а просто представляют собой разные имена функций вместо значений (так как это REPL и vars, функции и значения, которые находятся в исходном коде, не существуют):

(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)) 

Теперь РЕПЛ дает мне:

<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 и получить значение (Date. Timestamp), и все работает, но когда я выполняю его внутри функции в моей программе, я получаю вышеупомянутую ошибку. Был бы признателен, если бы кто-нибудь мог сказать мне, что мне здесь не хватает.

+0

Вы пытались бросить долго? '(Date. (Long timestamp))' – Jonas

+0

@Jonas В результате получилось: «Исключение в потоке» main «java.lang.ClassCastException: java.lang.String не может быть добавлено в java.lang.Number» и «Caused by: java.lang.ClassCastException: java.lang.String не может быть добавлено в java.lang.Number в clojure.lang.RT.longCast (RT.java:961) " – bleakgadfly

+0

@bleakgadfly: Тогда ваш аргумент представляет собой строку, а не число , Вам нужно разобрать строку в число, например. используя Long/parseLong –

ответ

2

Просто небольшое изменение необходимо:

(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) 
    ) 
) 

Однако, я бы все равно рекомендуем вам выяснить способ пройти в метку времени, как долго вместо строки.

 Смежные вопросы

  • Нет связанных вопросов^_^