Ah, I think I was mistaken in a detail, but generally correct. Try it with two partials of the same arity.
https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L2460 On Fri, Apr 25, 2014 at 5:47 PM, Greg D <gregoire.da...@gmail.com> wrote: > I guess I don't understand the problem, or what is meant by "different > classes". A counter-example would be helpful. > > Further transcript using the macro: > (def p6 (partial* + 1 2 3)) > #'user/p6 > user=> (class p6) > clojure.core$partial$fn__4194 > user=> (def p10 (partial* + 1 2 3 4)) > #'user/p10 > user=> (class p10) > clojure.core$partial$fn__4196 > > user=> p6 > (partial + 1 2 3) > user=> p10 > (partial + 1 2 3 4) > user=> (p6 100) > 106 > user=> (p10 100) > 110 > > On Friday, April 25, 2014 2:33:50 PM UTC-7, Gary Trakhman wrote: > >> That's not going to work, all the return classes of partial are the same >> class. >> >> >> On Fri, Apr 25, 2014 at 5:26 PM, Greg D <gregoir...@gmail.com> wrote: >> >>> I don't know if this is considered good Clojure, but you could define a >>> print-method within a macro to set up the normal string representation for >>> the partial function: >>> (defmacro partial* [fname arg0 & args] >>> `(let [pf# (partial ~fname ~arg0 ~@args) >>> cpf# (class pf#)] >>> (defmethod print-method cpf# [o# w#] >>> (if (nil? '~args) >>> (print-simple (str "(partial " '~fname " " (pr-str ~arg0) ")") >>> w#) >>> (print-simple (str "(partial " '~fname " " (pr-str ~arg0) >>> ~@(map #(str " " (pr-str %)) args) ")") w#))) >>> pf#)) >>> >>> A transcript of some quick examples: >>> user=> (def p6 (partial* + 1 2 3)) >>> #'user/p6 >>> user=> p6 >>> (partial + 1 2 3) >>> user=> (p6 7) >>> 13 >>> user=> (def re-find-foo (partial* re-find #"foo")) >>> #'user/re-find-foo >>> user=> re-find-foo >>> (partial re-find #"foo") >>> user=> (re-find-foo "abcdefooghi") >>> "foo" >>> >>> >>> On Friday, April 25, 2014 9:01:37 AM UTC-7, Matthew DeVore wrote: >>>> >>>> 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 clo...@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+u...@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+u...@googlegroups.com. >>> >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- > 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. > -- 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.