You can also call (.getNumericValue (.charAt "foo" 0)) to get the int the static Character isX methods expect.
On Friday, October 3, 2014 2:38:58 PM UTC-4, adrian...@mail.yu.edu wrote: > > charAt returns a char, not a primitive int, which is why you are getting > the "ClassCastException java.lang.Character cannot be cast to > java.lang.Number" exception. > > The long coercion function will inline to `(. clojure.lang.RT (longCast ~x)), > and since that that is a static method which lacks a primitive signature > for char, that explains your first exception. > > Clojure primitive function support is limited to longs and doubles, which > is fairly reasonable given that the places where this might actually matter > (in terms of performance) would be tight numerical loops where the cost of > repeated function invocation would degrade performance to an unreasonable > degree. I don't think that's the case with this function, but you can > decide based on your use case since only you know your program best. > > In any event, to solve the reflection warning here you should add a > non-primitive type hint to the character returned by charAt so that it will > match the Object method of longCast. ^Character will suffice. > > On Friday, October 3, 2014 11:41:48 AM UTC-4, Fluid Dynamics wrote: >> >> OK, can someone tell me what the hell is going on here? >> >> (defn alphanumeric? >> "Given a character, returns true iff the character is alphanumeric. >> Accented letters and other things that pass Character/isAlphabetic are >> all counted as alphanumeric." >> [^long c] >> (or (Character/isDigit c) (Character/isAlphabetic c))) >> >> ... >> >> (let [^String s "foo"] >> (alphanumeric? (long (.charAt s i)))) >> >> Reflection warning, blah blah blah - call to longCast can't be resolved. >> >> >> How do I get rid of reflection here? If I drop the (long ... ) around the >> charAt call, it doesn't even compile: >> >> ClassCastException java.lang.Character cannot be cast to java.lang.Number >> >> which is even weirder, as it suggests that the return value from .charAt >> is being boxed, which it shouldn't be if it's going to go directly into >> interop or a primitive-taking function. >> >> None of the apparent fixes strike me as very attractive here: >> >> 1. Get rid of alphanumeric? and just put the or expression everywhere. >> >> So much for code readability, DRY, and the vaunted code size efficiency >> of Lisps. >> >> 2. Turn the function into a macro, to avoid the repetition in 1. >> >> But now it won't work in (every? alphanumeric? some-string) and wrapping >> it as #(alphanumeric? %) bloats things, though not as badly as before. >> >> 3. definline seems to offer the best of both worlds >> >> But still bloats generated bytecode... >> >> >> Even supposing a nicer solution presented itself, the implication that >> .charAt's return is being boxed is troubling. Is there no way (aside from >> turning these parts of the code into a Java class full of utility methods) >> to use char values without boxing, short of (or even) directly passing to >> interop? >> >> Also: is there any way to make something as elegant as (every? >> alphanumeric? s) that's efficient? Something involving the new reducers, >> perhaps? It smells like a species of reduction to me... >> >> Also: How does one profile in Counterclockwise? Googling for >> counterclockwise profile clojure didn't bear fruit, and googling for >> eclipse profile java turned up that there's apparently supposed to be a >> "Profiling and Logging perspective" which is missing, at least in the Open >> Perspective dialog in the standalone CCW install >> (Counterclockwise-0.28.1.STABLE001-win32.win32.x86_64.zip, current as of a >> few days ago). >> >> -- 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.