2015-05-12 60 views
1

我使用resolve打電話給他們的名字(字符串)的功能,像使用決心通話功能 - Clojure的

(call "+" 10 10 10) ;; 30 

call功能:

(defn call [this & that] 
    (apply (resolve (symbol this)) that)) 

一切正常的REPL。但是當我使用httpkit http服務器作爲server啓動項目時,我收到了一個N​​PE。

java.lang.NullPointerException 
    at clojure.core$apply.invoke(core.clj:626) 
    at tapahtuma.http_resources$call.doInvoke(http_resources.clj:41) 
    at clojure.lang.RestFn.invoke(RestFn.java:423) 
    at tapahtuma.http_resources$forwarder.invoke(http_resources.clj:61) 
    at tapahtuma.http_resources$create_event.invoke(http_resources.clj:69) 
    at compojure.response$eval1563$fn__1564.invoke(response.clj:26) 
    at compojure.response$eval1524$fn__1525$G__1515__1532.invoke(response.clj:10) 
    at compojure.core$make_route$fn__1699.invoke(core.clj:93) 
    at compojure.core$if_route$fn__1683.invoke(core.clj:39) 
    at compojure.core$if_method$fn__1676.invoke(core.clj:24) 
    at compojure.core$routing$fn__1705.invoke(core.clj:106) 
    at clojure.core$some.invoke(core.clj:2528) 
    at compojure.core$routing.doInvoke(core.clj:106) 
    at clojure.lang.RestFn.applyTo(RestFn.java:139) 
    at clojure.core$apply.invoke(core.clj:628) 
    at compojure.core$routes$fn__1709.invoke(core.clj:111) 
    at tapahtuma.http_resources$wrap_content_type$fn__7192.invoke(http_resources.clj:22) 
    at ring.middleware.cors$wrap_cors$fn__1800.invoke(cors.clj:47) 
    at org.httpkit.server.HttpHandler.run(RingHandler.java:33) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

在的http_resources線41我有call功能。

我不知道這裏會發生什麼。感謝您的幫助。 I created a project to help reproduce the problem

+0

您需要添加多少代碼才能添加適當的複製器?如果這可以簡單地完成,它肯定會有所幫助。 –

+0

@CharlesDuffy我將準備一個項目來重現這個問題。我會盡快在這裏發佈。謝謝 – elf

+0

@CharlesDuffy mybe這個幫助:https://github.com/edipofederle/resolve-clj – elf

回答

2

以下修改您的再現 - 完全限定的命名空間 - 正常工作:當你看的*ns*在再現環境,這是clojure.core

(defn call [this & that] 
    (let [this-sym (symbol this) 
     this-resolved (ns-resolve 'resolver-clj.core this-sym)] 
    (.println System/out (str "current-ns: " *ns*)) 
    (.println System/out (str "this-sym: " this-sym)) 
    (.println System/out (str "this-resolved: " this-resolved)) 
    (apply this-resolved that))) 

原因是顯而易見的。

+0

很好。謝謝。我想過* ns *但沒有正確調查。再次感謝。 – elf