Есть ли простой способ добавления функций в динамически создаваемое пространство имен?

Я создаю нуарное веб-приложение, и мне нужно динамически создавать новые представления и модели. Я следил за нуарными примерами, в которых представление и контроллер для ресурса имеют отдельные пространства имен, и я обнаружил, что это очень чистый подход.

В соответствии с этим мне нужно иметь возможность динамически создавать новые пространства имен, соответствующие представлениям и моделям, а затем помещать в них соответствующие функции. Моя идея заключалась в том, чтобы макросы были указаны в отдельном пространстве имен, которые при вызове в новом пространстве имен предоставляли бы соответствующие маршруты/частицы/что угодно.

Например, (простите мой первый 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. Я был бы очень признателен за любую помощь, и есть ли лучший подход. Например, просто использовать ссылку для пространства имен, которое содержит все необходимые определения?

Первый пост, и я не думаю, что это повтор этого . Спасибо!

11
задан Community 23 May 2017 в 11:49
поделиться