Sto creando una webapp noir e ho bisogno di creare dinamicamente nuove viste e modelli. Ho seguito gli esempi noir, in cui la vista e il controller di una risorsa hanno spazi dei nomi separati e ho trovato che si tratta di un approccio molto pulito.Esiste un modo pulito per aggiungere funzioni a uno spazio dei nomi creato in modo dinamico?
In linea con questo, ho bisogno di essere in grado di creare dinamicamente nuovi spazi dei nomi corrispondenti a viste e modelli, quindi internare le funzioni appropriate al loro interno. La mia idea era di avere delle macro specificate in uno spazio dei nomi separato che, quando chiamato nel nuovo spazio dei nomi, avrebbe fornito i percorsi appropriati/parziali/qualunque.
Per esempio (perdonate il mio primo 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"])))
viene chiamato da ...
(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)
Tuttavia, mi chiama questo da dentro il mio nuovo spazio dei nomi dà una NullPointerException. Apprezzerei molto ogni aiuto e se ci fosse o meno un approccio migliore. Come, basta usare refer per uno spazio dei nomi che contiene tutte le definizioni necessarie?
Primo post, e non penso sia una ripetizione di this. Grazie!
Considereresti di modificare il tuo post e di indicare il tuo spazio dei nomi e qualche esempio di codice Clojure che richiama la macro? Mi piacerebbe vedere in quale contesto è usato. tnx – octopusgrabbus
Spero sia un po 'più utile. – jtmoulia
L'errore che sto ottenendo è Impossibile risolvere il simbolo: con -ns in questo contesto, compilando, ma non so se questo significa che puoi usare with-ns al di fuori di una funzione o di una macro. – octopusgrabbus