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.

Reply via email to