4

次のコードがあります。

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

上記の「post」関数にタイトル、コンテンツ、および UNIX タイムスタンプを渡す別の関数があります。blog_title と blog_url は、コードの先頭で var 定義されています。美学のために HTML をソートしましたが、「実際のコード」ではそうではありません。私もやっています

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

コードを実行しようとすると、エラーが発生します

java.lang.IllegalArgumentException 

(Date.timestamp) を削除すると、コードは完全に実行されますが、その (Date.) 関数が必要です。

今、REPLで私がするなら

(import 'java.util.Date)

次に、タイムスタンプ付きの変数を定義します

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

次に、(let) を REPL にコピーし、元のコードの vars を調整して、値ではなく別の関数名を表すだけにします (これは 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))

今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 では、すべてが 1 つの大きな文字列で表示されます。

ここでの問題は、REPL でコードを実行して (Date.timestamp) の値を取得でき、すべてがうまくいくことですが、プログラムの関数内で実行すると上記のエラーが発生します。ここで何が欠けているのか誰か教えていただければ幸いです。

4

1 に答える 1

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

ただし、タイムスタンプを文字列ではなく long として渡す方法を見つけることをお勧めします。

于 2010-07-13T00:42:03.803 に答える