je le code suivant:En Clojure: Erreur lors de l'exécution d'un appel Java avec let dans une fonction mais pas dans REPL
(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)
)
)
j'ai une autre fonction qui passe un titre, le contenu et un horodatage UNIX à la fonction "poste" ci-dessus. blog_title et blog_url sont définis en haut du code. J'ai trié le HTML pour l'esthétique, dans le "vrai code" ce n'est pas le cas. Je suis également en train de faire
(import 'java.util.Date)
(use 'clojure.string)
Si je tente d'exécuter le code que je reçois une erreur
java.lang.IllegalArgumentException
Si je retire (date. Horodatage) le code exécute parfaitement, mais je dois avoir que (date .) fonction.
Maintenant, si REPL je
(import 'java.util.Date)
Définissez ensuite un var avec un horodatage
(def timestamp 1278854531000) ;; Just for pushing a var into (Date.) than just the number
Et puis je copie le (LET) dans REPL et ajuster les vars dans l'original code plutôt représenter simplement les différents noms de fonctions au lieu des valeurs (puisque c'est le REPL et les vars, fonctions et valeurs qui sont dans le code original n'existe pas), être comme ceci:
(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))
Maintenant, le REPL me donne:
<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
Encore une fois, tout a été déplacé de sorte qu'il serait plus facile à lire, en REPL tout sort dans une grande chaîne. Le problème ici est que je peux exécuter le code dans REPL et obtenir la valeur de (Date. Timestamp) et tout fonctionne, mais quand je l'exécute à l'intérieur d'une fonction dans mon programme, je reçois l'erreur mentionnée ci-dessus. J'apprécierais que quelqu'un puisse me dire ce qui me manque ici.
Avez-vous essayé de jeter de temps? '(Date (long horodatage).)' – Jonas
@Jonas il en résulta: "Exception dans le thread "principal" java.lang.ClassCastException: java.lang.String ne peut pas être jeté à java.lang.Number" et « Causée par: java.lang.ClassCastException: java.lang.String ne peut pas être jeté à java.lang.Number à clojure.lang.RT.longCast (RT.java:961) » – bleakgadfly
@bleakgadfly: Alors, votre argument est une chaîne plutôt qu'un nombre . Vous devez analyser la chaîne en un nombre, ex. en utilisant Long/parseLong –