Hi,

On Feb 4, 4:42 am, Greg <g...@kinostudios.com> wrote:

> The magic happens here:
>
>                 (while (list? (setf values (sql:next-row)))
>                         (eval (expand (cons 'begin $args) (unify keys 
> values)))
>                 )
>
> $args is equivalent to the 'body' in [& body] in clojure, and the expand 
> function will replace all of the symbols in 'keys' (in $args) with the 
> 'values'.
>
> So (println NAME) becomes (println "José Lopez"), and it gets eval'd each 
> time in the loop to the different values in the table.
>
> How would you implement this behavior in Clojure?

(defn do-query
  [db query thunk]
  (doseq [entry (-> db (.prepareStatement query) .executeQuery
resultset-seq)]
    (thunk entry)))

(let [q "SELECT name FROM people"]
  (do-query db q #(println (:name %))))

Several differences to the newLisp code:

* It's a function, not macro.
* You don't have to fiddle with magic names. The user can choose
himself.
* The query can be also stored in some local and doesn't have to be a
literal
  string.

I am really happy that I'm a smug Clojure weenie, who doesn't have to
write
code which walks other code to replace things in place and to eval
it...

Sincerely
Meikel

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