Я создаю нуарное веб-приложение, и мне нужно динамически создавать новые представления и модели. Я следил за нуарными примерами, в которых представление и контроллер для ресурса имеют отдельные пространства имен, и я обнаружил, что это очень чистый подход.
В соответствии с этим мне нужно иметь возможность динамически создавать новые пространства имен, соответствующие представлениям и моделям, а затем помещать в них соответствующие функции. Моя идея заключалась в том, чтобы макросы были указаны в отдельном пространстве имен, которые при вызове в новом пространстве имен предоставляли бы соответствующие маршруты/частицы/что угодно.
Например, (простите мой первый defmacro):
(ns project.views.proto
(:use noir.core
hiccup.core
hiccup.element
hiccup.form))
(defmacro def-all-page
[path]
`(defpage ~path []
(html
[:h1 "Ya'll here"])))
вызывается из...
(ns project.proto
(:use [clojure.contrib.with-ns :only [with-ns]])
(create-ns 'foo)
(intern 'foo 'path "path") ; In reality, the path is dynamic which is why I intern it
(with-ns 'foo
(clojure.core/refer-clojure)
(use 'noir.core
'hiccup.core
'hiccup.element
'[project.views.proto :only [def-all-page]])
(def-all-page path)
Однако, вызов этого из моего нового пространства имен приводит к исключению NullPointerException. Я был бы очень признателен за любую помощь, и есть ли лучший подход. Например, просто использовать ссылку для пространства имен, которое содержит все необходимые определения?
Первый пост, и я не думаю, что это повтор этого . Спасибо!