On Tue, Dec 23, 2008 at 11:08 AM, Rich Hickey <richhic...@gmail.com> wrote:
>
> On Wed, Dec 17, 2008 at 2:53 PM, Rich Hickey <richhic...@gmail.com> wrote:
>>
>> 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.

Here's an example of one way to use it:

user=> (where (and (> i (- 3 1)) (< i ~(+ 3 1))))
"where i > 3 - 1 and i < 4"
user=> (let [my-name "'chouser'"] (where (and (> id 0) (= name ~my-name))))
"where id > 0 and name = 'chouser'"

This 'where' macro produces something that looks vaguely like a SQL
"where" clause.  It accepts s-expressions to translate, but also
allows you to mark sub-expressions with ~ to indicate that they should
be evaluated as regular clojure expresions, and not translated
literally to SQL.  If it were more than a toy example, it would use
prepareStatement or similar to get appropriate quoting of clojure
objects, rather than just stuffing them directly in the resulting
string.

Here's the code:

(defmacro where [e]
  (let [f (fn f [e]
            (if-not (list? e)
              [(str e)]
              (let [[p & r] e]
                (if (= p `unquote)
                  r
                  (apply concat (interpose [(str " " p " ")]
                                           (map f r)))))))]
    (list* `str "where " (f e))))

--Chouser

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