0

私はこの関数を持っています:

(defn handler [request]
  (case (request :uri)
    "/" (home request)
    "/good" (good request)
    "/evil" (evil request)
    "/neutral" (neutral request)
    (status-response 404 (str "<h1>404 Not Found: " (:uri request) "</h1>" ))))

しかし、私は同じ名前の関数に解決されるページのリストを変更し続けており、次のように記述できるようにしたいと思います。

(def-handler善悪ニュートラル)

代わりは:

しかし、私は立ち往生しています。これまでの私のベストショットは次のようになります。

(defmacro def-handler [& addresses]
  `(defn handler [request#]
     (case (request# :uri)
       ~@(mapcat (fn[x] [(str "/" x) (list x 'request)]) addresses)
       "/" (home request#)
       (status-response 404 (str "<h1>404 Not Found: " (:uri request#) "</h1>" )))))

しかし、生成された呼び出しの要求はgensymではないため、完全には機能しません。そこでgensymを取得する方法がわかりません。

これは、新しいgensymが作成されたことに気付くまで、有望に見えました。

(defmacro def-handler [& addresses]
  `(defn handler [request#]
     (case (request# :uri)
       ~@(mapcat (fn[x] [(str "/" x) `( ~x request#)]) addresses)
       "/" (home request#)
       (status-response 404 (str "<h1>404 Not Found: " (:uri request#) "</h1>" )))))
4

2 に答える 2

3

ここではgensymをまったく避けることができると思います。gensymを使わずに環境を「汚染」する方法がわかりません。gensymのない例:

(defmacro def-handler [& addresses]
  `(defn handler [~'request]
     (case (~'request :uri)
       ~@(mapcat (fn[x] [(str "/" x) (list x 'request)]) addresses)
       "/" (home ~'request)
       (status-response 404 (str "<h1>404 Not Found: " (:uri ~'request) "</h1>" )))))
于 2013-01-31T13:18:38.000 に答える
1

マクロコードの問題は、準引用符の一部である動的シンボルを引用符で囲まれた部分の外側、つまり引用符なし/引用符なしのスプライシングコードで使用できないことです。ただし、他の方法も可能です。つまり、マクロ実行部分でgensymを実行し、以下に示すように、準引用部分内でそれを使用します。

(defmacro def-handler [& addresses]                                                                                                                  
  (let [request (gensym)]                                                                                                                            
  `(defn handler [~request]                                                                                                                          
     (case (~request :uri)                                                                                                                           
       ~@(mapcat (ƒ [x] [(str "/" x) (list x request)]) addresses)                                                                                   
       "/" (home ~request)                                                                                                                           
       (status-response 404 (str "<h1>404 Not Found: " (:uri ~request) "</h1>")))))) 
于 2013-02-02T16:37:05.123 に答える