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
-~----------~----~----~----~------~----~------~--~---

Reply via email to