Meikel,

What concerns me is that this macro lets you write code which depends
on names which are not present at compile time (someplace).  Coming
from scheme, not only would you _not_ do this, but you _can't_ do it
without using eval in your macro body, which is considered bad form.
That we can do it in clojure appears to be a consequence of the fact
that 1) clojure uses maps internally for binding and 2) that thread-
local binding requires you declare the vars somewhere before using
them someplace else.

Be this as it may, you can still get weird run-time behavior from this
kind of macro in the following situation:

(def *v1* 10)
(def var-map {:*v1* 100})
(def wrong-map {:*v2* 10})

(with-bindings-from-map var-map (+ v1 100)) ; -> 200,  does what we
expect
(with-bindings-from-map wrong-map (+ v1 100)) ; -> 110,  does the
wrong thing entirely, silently

Writing a separate macro for each kind of binding may be slightly less
convenient, but it also gives us a smarter error message.

we could write instead

(defmacro binding-v1 [ mp & body ] `(binding [{*v1* :*v1*} ~mp]
~...@body))

(binding-v1 var-map (+ *v1* 10)) ; works
(binding-v1 wrong-map (+ *v1* 10)) ; this gives the error we expect,
that there is no *v1* in wrong-map.  (ok, it gives an error when we
try to add 10 to nil, but error checking in binding-v1 would give a
better error).

Plus, this doesn't depend on a how the compiler implements or
optimizes names.  It could be that in the future clojure will want to
use a different representation internally than maps for symbol->value
translation.

-V

On Aug 9, 11:58 pm, Niels Mayer <nielsma...@gmail.com> wrote:
> On Thu, Aug 6, 2009 at 10:12 PM, samppi <rbysam...@gmail.com> wrote:
>
> > I have about six variables that are often rebound together using
> > binding; these variables are used to access and set data in a state
> > object (whose type is of the user's choice). These variables' values
> > (the accessors and setters) are often used together.
>
> I'd like to be able to bundle these values into a map, and using a
>
> function or macro called with-bundle, automatically bind the map's
>
> vals to their respective variables:
>
> (def my-bundle
>
> {'*variable-1* :something1, '*variable-2* :something2})
>
> If you don't get too religious about the curlyness of your brackets or the
> inelegance of the syntax (which is basically common-lisp keywords, using
> "infix notation," with the entailed loss of elegance caused by that
> choice)...  What about using JSON, which seems to be close to the syntax
> you're already using. Because JSON is ultimately a matter of calling a Java
> class,all the work has already been done in terms of going back and forrth
> between a "map" datastructure and the text-representation, both for JSON and
> XML.
>
> For example (cut/paste fromhttp://www.javapassion.com/ajax/JSON.pdf)
>
> JSON looks like:
>  var myJSONObject = {"bindings": [
> {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"},
> {"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"},
> {"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"}
> ]
>
> };
>
> • Members can be retrieved using dot or subscript operators
> myJSONObject.bindings[0].method // "newURI
>
> In Java, the same "dot notation" can be used for set/get, but use JSONObject
> Java Class
> • A JSONObject is an unordered collection of name/value pairs
> • The put methods adds a name/value pair to an object
> • The texts produced by the toString methods strictly conform to the JSON
> syntax rules
>
> Output:
>
> > myString = new JSONObject().put("JSON", "Hello, World!").toString();
>
> // myString is {"JSON": "Hello, World"}
>
> Parsing:
>
> > try {
>
> jsonObject = new JSONObject(myString);
>
> }
>
> catch(ParseException pe) {
>
> }
>
> .....
>
> Similarly you could probably also use whatever combination of XML libraries
> that'll turn XML structures into
> data structures that can easily be accessed in Java, for example, here's a
> little script you can throw into Xwiki to grab a RSS feed and turn it into
> something that can easily be accessed in Java, Groovy, or Clojure:
>
> Takes URL param ?zip=ZIPCODE and gets associated weather report for that
> zipcode:
>
> {{script language=groovy}}
>
>   def rss = new XmlSlurper().parseText(("
>
> >http://weather.yahooapis.com/forecastrss?p=";
>
>                                         +
>
> > xcontext.macro.params.zip).toURL().text)
>
>   println rss.channel.title
>
>   println "Sunrise: ${rss.channel.astrono...@sunrise}"
>
>   println "Sunset: ${rss.channel.astrono...@sunset}"
>
>   println "Currently:"
>
>   println "\t" + rss.channel.item.conditi...@date
>
>   println "\t" + rss.channel.item.conditi...@temp
>
>   println "\t" + rss.channel.item.conditi...@text
>
> {{/script}}
>
> Nielshttp://nielsmayer.com
>
> PS: what are people's favorite JSON or XML Java classes for doing this out
> of scripting languages like Groovy or Clojure? Basically, going back and
> forth between a structured textual representation and a map data structure
> that can be accessed by variables like "rss.channel.item.condition.text" .
--~--~---------~--~----~------------~-------~--~----~
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