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