Tworzę aplikację internetową noir i muszę dynamicznie tworzyć nowe widoki i modele. Śledziłem przykłady noir, w których widok i kontroler dla zasobu mają oddzielne przestrzenie nazw i uważam, że jest to bardzo czyste podejście.Czy istnieje czysty sposób dodawania funkcji do dynamicznie tworzonego obszaru nazw?
Zgodnie z tym, muszę mieć możliwość dynamicznego tworzenia nowych przestrzeni nazw odpowiadających widokom i modelom, a następnie internować w nich odpowiednie funkcje. Mój pomysł polegał na tym, aby makra były określone w oddzielnej przestrzeni nazw, która po wywołaniu w nowej przestrzeni nazw zapewniłaby odpowiednie trasy/części/cokolwiek.
Na przykład (wybacz mój pierwszy 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"])))
jest wywoływana z ...
(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)
Jednak wywołanie to od wewnątrz mojego nowego nazw daje mi NullPointerException. Byłbym bardzo wdzięczny za każdą pomoc i czy istnieje lepsze podejście. Jak, po prostu za pomocą odnoszą się do przestrzeni nazw, która zawiera wszystkie niezbędne definicje?
Pierwszy wpis, i nie sądzę, że jest to powtórka z this. Dzięki!
Czy rozważasz edytowanie swojego postu i oznaczenie swojej przestrzeni nazw i przykładowego kodu Clojure, który wywołuje makro? Chciałbym zobaczyć, w jakim kontekście jest on używany. tnx – octopusgrabbus
Mam nadzieję, że to trochę bardziej pomocne. – jtmoulia
Błąd, który dostaję, jest niemożliwy do rozstrzygnięcia symbol: with-ns w tym kontekście, kompilacja, ale nie wiem, czy to oznacza, że możesz użyć funkcji -ns poza funkcją lub makrem. – octopusgrabbus