【发布时间】:2014-12-31 23:43:20
【问题描述】:
这是我的 clojure-ring 处理程序
(defn handler [req]
(let [distr (get-in req [:query-params "dist"])]
(def sortie (describe (eval ((resolve (symbol distr)) 1 3))
0.5 0.25 3))
{:status 200
:headers {"Content-Type" "text/html"}
:body (str "<p>" (print-str sortie) "<p>")}
))
(def app
(-> #'handler
(ring.middleware.stacktrace/wrap-stacktrace)
(wrap-spy)
(wrap-params)
))
“dist”键映射到一个字符串。
:query-params {"dist" "gaussian-dist"}
我想用它作为函数名。 整个
(eval ((resolve (symbol distr)) 1 3))
返回地图
当我用字符串替换 distr 时,它会按需要工作。
=> (eval ((resolve (symbol "gaussian-dist")) 1 3))
{:Distribution :actuarial.distributions/Gaussian, :Parameters {:sigma 3, :mu 1}}
编辑:
这就是我最终解决问题的方式: 再次感谢,我是 Clojure 的初学者
我用宏解决了这个问题
(defmacro get-map [map name]
`(get ~map ~name))
(defn handler [req]
(let [distr-name (get-in req [:query-params "dist"])
distr-map ((get-map distributions-map distr-name) 1 3)
sortie (describe distr-map 0.5 0.25 3)
]
{:status 200
:headers {"Content-Type" "text/html"}
:body (str "<p>" sortie "<p>")}))
【问题讨论】:
-
distr的值似乎很可能与预期不符,您可以放入 println 或以其他方式检查它并包含输出吗? -
不要在函数内部使用 def。
sortie可以在使用前被另一个请求替换。 -
这个宏没有做任何你不能用函数做的事情,更简单地说:
(defn get-map [map name] (get map name)),或者真的是(def get-map get)。