On Wed, Dec 17, 2008 at 2:53 PM, Rich Hickey <richhic...@gmail.com> wrote: > > > > On Dec 17, 4:30 am, Meikel Brandmeyer <m...@kotka.de> wrote: >> Hi, >> >> I'd like to propose/put up for discussion a change to the unquote >> handling. >> I basically ran into the following problem: >> >> I'd like to embed a DSL into my system. Using macros it should be >> possible >> to define a language, which looks like usual Clojure. Simply quote the >> form >> and pass it to a function, which knows how to handle the commands. >> >> However I hit a roadblock. Coming from Scheme, I tried the following >> approach. >> >> A hypothetical SQL embedding: >> >> (def x 5) >> (sql col1 from table1 where col2 = ~x) >> >> Or a hypothetical cljsh (inspired by scsh): >> >> (def *cmd* "/usr/bin/command") >> (run (~*cmd* -option 1 -another argument foo bar)) >> >> In Scheme this is done, by quoting the macros argument using the >> quasiquote form. In Clojure, however, this style is not possible since >> we are >> missing quasiquote. Here a short list of examples on how the different >> quotations work: >> >> (quote (foo ~x bar)) >> => Failure in Clojure. >> => In some Schemes: (foo (unquote x) bar), where , (aka. ~) translates >> to some unquote form. It just quotes everything. Also the unquote. >> >> (quasiquote (foo ~x bar)) >> => Not available in Clojure. >> => (foo 5 bar) in Scheme >> >> (syntax-quote (foo ~x bar)) >> => (assuming ` would have a syntax-quote form as ' does with quote) >> (my.ns/foo 5 maybe.some.other.ns/bar) >> => Not available in Scheme, AFAIK. >> >> So as you see, the above style is not possible, since in Clojure you >> only >> have the choice to be static or resolve all the symbols. If I want to >> use >> the style anyway, I have to jump through hoops and rewrite the quoted >> form in my handler function, be it replacing somehow marked or named >> symbols with values from the environment or be it renormalising all >> the >> symbols. (But what if the user injected a qualified symbol with ~?) >> >> So I came to the question of whether it is possible to include a >> similar >> quasiquote form, which does not resolve the symbols inside? It would >> be a philosophy of "Unquote, what the user wants to be unquoted, and >> leave the rest to me. I know how to handle it." >> >> And when were are at it: maybe also provide a syntax-quote, unquote >> and unquote-splice forms? >> >> Finally, I skipped the obvious question: Does this make sense at all? >> I like this way of including a sub-language. However, is it >> "idiomatic"? >> (for some definition of "idiomatic") >> >> Maybe there is already a different solution, which I just don't see at >> the moment. >> > > Moving syntax-quote out of the reader might be a big deal. But I think > scenarios like this could be covered if: > > ~x not in a syntax-quote yielded the form (unquote x) from the reader > > unquote would not be defined by Clojure, so still an error if allowed > to get evaluated. > > Things like your sql would be macros that handled (unquote x) > internally. >
SVN 1184 implements this. Feedback welcome on its utility for macro writers. Rich --~--~---------~--~----~------------~-------~--~----~ 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 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 -~----------~----~----~----~------~----~------~--~---