Pergunta

Eu tenho o seguinte código:

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

Tenho outra função que passa um título, o conteúdo e um timestamp UNIX para a função "post" acima.blog_title e blog_url são var definidos na parte superior do código.Classifiquei o HTML por estética, no "código real" não é esse o caso.Eu também estou fazendo

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

Se eu tentar executar o código, recebo um erro

java.lang.IllegalArgumentException 

Se eu remover (Data.timestamp) o código é executado perfeitamente, mas preciso ter essa função (Data.).

Agora, se no REPL eu fizer

(import 'java.util.Date)

Em seguida, defina uma var com um carimbo de data/hora

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

E então eu apenas copio (let) para o REPL e ajusto os vars no código original para representar apenas os diferentes nomes de funções em vez dos valores (já que este é o REPL e os vars, funções e valores que estão no código original não existe), ficar assim:

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

Agora o REPL me dá:

<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

Novamente, tudo foi mudado para que fosse mais fácil de ler, no REPL tudo sai em uma string grande.

O problema aqui é que posso executar o código no REPL e obter o valor de (Date.timestamp) e tudo dá certo, mas quando executo dentro de uma função no meu programa recebo o erro mencionado acima.Agradeceria se alguém pudesse me dizer o que estou perdendo aqui.

Foi útil?

Solução

Apenas uma pequena mudança é necessária:

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

No entanto, eu ainda recomendaria que você descobrisse uma maneira de passar o carimbo de data/hora como um comprimento em vez de uma string.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top