clojure - Use function in macro -


i have function load correctly namespace :

(defn load-module [module-name]     (use module-name) ) 

and "equivalent" macro doesn't work :

(defmacro load-module-macro [module-name]     `(         (use '~module-name)     ) ) 

i don't understand problem.

moreover, want use macro load module choose in configuration. in config.clj define var namespace of logger module contains "save-data" function. want load specified logger in core program. can choose logger use directly in configuration file (logger on disk, logger in database...). best way ?

edit :

error message

illegalargumentexception don't know how create iseq from: java.lang.character  clojure.lang.rt.seqfrom (rt.java:505) 

no, in fact don't want use "use" directly in code @ all. use modifies entire namespace called in , break code in ways hardly predictable.

instead should is: implement logging interface (protocol), write "meta-constructor" dispatches whatever set in config.clj keyword. code example

    (defprotocol ilog       (save-data [this msg] "logs message in msg."))        (defn create-file-log       "returns object implementing ilog, opens , flushes java.io.file file."       [file]       (let [f ... ;; create file writer here             ]         (reify ilog           (save-data [this msg] ;; write code writes data file here             ))))       ;; create other implementations database here or elsewhere       (defn create-log        "creates log of of type passed in type-kw."        [type-kw]        (case type-kw          :file (create-file-log "./app-log.txt")          ;; other types          )) 

now invoke create-log whatever keyword set in config file , pass returned object around functions need logging. obviously, def global object don't recommend that.

eventually don't want set keyword (type-kw) desired logging method in config, other parameters file-name or database uri can pass like

   {:log-method :file      :data {:fname "app-log.txt"}}     or    {:log-method :db      :data {:uri ".... 

...to create-log function uses structure parameters reify constructors create-file-log, create-db-log, etc.

edit: because don't switch statement, here how multi-methods:

  (defmulti create-log :logging-method)   (defmethod create-log :file     [arg-map]     (let [file (java.io.file. (:fname arg-map))]       (if (.exists file)         ...  

then have entry in config.clj

  {...    :log {:logging-method :file          :fname "./log-file.txt"}} 

to create new logging type have imagine argument map 1 above , constructor method create-log.


Comments

Popular posts from this blog

javascript - DIV "hiding" when changing dropdown value -

Does Firefox offer AppleScript support to get URL of windows? -

android - How to install packaged app on Firefox for mobile? -