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.

Reply via email to