I'm also concerned about the implementation, which seems to rely on
what appears to me to be a little magical. An alternative that I was
considering was to just break backwards compatibility and combine all
of the variables into one variable containing a map in a new major
version of my library. But it seems that Mr. Hickey affirms that this
is a stable part of Clojure, so I think for now that I'll go for it.

On Aug 10, 12:26 pm, jvt <vincent.to...@gmail.com> wrote:
> Really, this should be
>
> (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
>
> Anyway, you may want to think about why common-lisp does not have a
> with-all-slots macro for use with CLOS objects.  It is similar
> reasoning which requires you name the slots you want to access when
> using with-slots.
>
> On Aug 10, 3:10 pm, jvt <vincent.to...@gmail.com> wrote:
>
>
>
> > 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