это мой Clojure кольцо обработчикИспользуйте параметр ПОЛУЧИТЬ как имя функции
(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}}
Edit:
Это, как я в конечном итоге решить мою проблему: Еще раз спасибо, я новичок в 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>")}))
Похоже, что значение '' '' '' 'не так, как вы ожидали, можете ли вы поместить в println или иначе проверить его и включить вывод? –
Не используйте функции def внутри. 'sortie' может быть заменен другим запросом, прежде чем вы его используете. – noisesmith
Этот макрос не делает ничего, что вы не могли бы сделать с помощью функции, и более просто: '(defn get-map [имя карты] (получить имя карты))' или действительно '(def get-map get) '. – amalloy