Hi,

There has been one thing bugging me for a long time that seems worth it to 
fix, and I was wondering if anyone else has had the same problem. I have 
enjoyed using Clojure's REPL and embracing a Clojure-style data model for 
my app, where everything is a glorified map or vector and there are no 
private fields. I even have a simple dump feature that tells me the entire 
state of my app <https://github.com/google/hesokuri> that was ridiculously 
easy to implement, and that takes advantage of the lack of black box data 
structures.

One thing that doesn't really fit in this paradigm is (ironically) 
anonymous functions with closures. For instance, (partial + 42) returns an 
anonymous function, and in the REPL or an app dump, it looks hideous:
#<core$partial$fn__4228 clojure.core$partial$fn__4228@1ee1dea2>

So I've avoided anonymous functions in my app except when they exist 
transiently, and don't appear in the dump (for instance, in (map #(str % 
"!") foo)). But sometimes I just can't avoid a long-lived anonymous 
function practically. The best solution I've come up with is to transform 
anonymous functions when preparing the application dump. (See the 
implementation<https://github.com/google/hesokuri/blob/b60cb7222cfdd672e394ef6f22b80c94278fe3a0/src/hesokuri/see.clj#L35>)
 
This makes (partial + 42) look like this:

{:fn-class clojure.core$partial$fn__4228,
 "arg1" 42,
 "f" {:fn-class clojure.core$_PLUS_}}

Which isn't great (I'd like to have filenames and line numbers for each 
anon fn, and a nicer name for clojure.core/+), but it's a big improvement. 
The function's JVM class and the closured values are revealed. It would be 
nice to implement this natively. Having only passing familiarity with the 
Clojure code base, to solve it I think one could:

   - give anonymous functions a .getClosure method which creates a view of 
   the closure on-demand
   - (optional) change their .toString implementation to include this 
   information
   - add logic to clojure.pprint to use the .getClosure method (I guess 
   "(defmethod clojure.pprint/simple-dispatch clojure.lang.AFunction etc...)" 
   ?)

Another feature that would go nicely with this is smarter equality 
semantics for anonymous functions, so that any two anonymous functions 
generated at the same point in code with equal closures are equal. This 
means if I have a function like this:

(defn exclaimer [bangs] #(apply str % (repeat bangs "!")))

then the following would be true: (= (exclaimer 10) (exclaimer 10)), making 
functions behave a lot more like values. I would love to have this 
particular feature too, although I'm having trouble coming up with a 
non-contrived example.

I'd like to hear some thoughts on this. Thanks!

Matt



-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to