Hi everyone, I hope you're all well!

I recently faced a problem when i needed to receive some piece of code and replace all the invalid symbols in it with the proper (existent) ones. Imagine for example you have the following map from made-up characters to real characters:

(def reserved-chars
(zipmap [\P \M \T]
        [\+ \- \*]) )

Now, I'm expecting code that includes the symbols P, M, T but before evaluating that code I need to replace these non-valid symbols with the corresponding symbols Clojure knows about (+, -, * respectively). I could get around that by def-ing P, M & T to +, - & * so that Clojure knows the symbols when the time comes to eval the fn. However, this solution is not ideal when there are many such symbols. My second thought was to create a macro that simply transforms the expressions replacing all the 'bad' symbols with 'good' ones...This is what I came up with:


(defmacro translate [& code]
`(let [code-string# (str '~@code)
       fake-to-real# reserved-chars]
 ;(eval
  (read-string ;;returns persistent-list
   (reduce-kv
     (fn [s# k# v#]
       (.replaceAll ^String s# (str k#) (str v#)))
     code-string# fake-to-real#))))

As you can probably gather, this macro treats the expression as a string and not as data...Even though it runs perfectly fine and gives the correct output , I was wondering if any of you macro-gurus has any better suggestions or alternatives....Alternatively, if you can think of any cases that will break my little macro please share them...

thanks in advance...

Jim

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to